All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Ben Myers <bpm@sgi.com>
Cc: linux-fsdevel@vger.kernel.org, olaf@sgi.com, xfs@oss.sgi.com
Subject: Re: [PATCH 11/16] xfs: add xfs_nameops for utf8 and utf8+casefold.
Date: Tue, 7 Oct 2014 09:10:16 +1100	[thread overview]
Message-ID: <20141006221016.GH2301@dastard> (raw)
In-Reply-To: <20141003220118.GJ1865@sgi.com>

On Fri, Oct 03, 2014 at 05:01:18PM -0500, Ben Myers wrote:
> From: Olaf Weber <olaf@sgi.com>
> 
> The xfs_utf8_nameops use the nfkdi normalization when comparing filenames,
> and are installed if the utf8bit is set in the super block.
> 
> The xfs_utf8_ci_nameops use the nfkdicf normalization when comparing
> filenames, and are installed if both the utf8bit and the borgbit are set
> in the superblock.
> 
> Normalized filenames are not stored on disk. Normalization will fail if a
> filename is not valid UTF-8, in which case the filename is treated as an
> opaque blob.
> 
> Signed-off-by: Olaf Weber <olaf@sgi.com>
> 
> ---
> [v2: updated to use utf8norm.ko module;
>      compiled conditionally on CONFIG_XFS_UTF8=y;
>      utf8version is now a function;
>      move xfs_utf8.[ch] into libxfs. --bpm]
> [v3: pass utf8version from the superblock through xfs_nameops
>      instead of the max version of the normalization module. --bpm]
> ---
>  fs/xfs/Kconfig           |   9 ++
>  fs/xfs/Makefile          |   2 +
>  fs/xfs/libxfs/xfs_dir2.c |   4 +-
>  fs/xfs/libxfs/xfs_utf8.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++
>  fs/xfs/libxfs/xfs_utf8.h |   3 +
>  fs/xfs/xfs_iops.c        |   2 +-
>  6 files changed, 225 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig
> index 5d47b4d..1e8a463 100644
> --- a/fs/xfs/Kconfig
> +++ b/fs/xfs/Kconfig
> @@ -95,3 +95,12 @@ config XFS_DEBUG
>  	  not useful unless you are debugging a particular problem.
>  
>  	  Say N unless you are an XFS developer, or you play one on TV.
> +
> +config XFS_UTF8
> +	bool "XFS UTF-8 support"
> +	depends on XFS_FS
> +	select CONFIG_UTF8_NORMALIZATION
> +	help
> +	  Say Y here to enable utf8 normalization support in XFS.  You
> +	  will be able to mount and use filesystems created with the
> +	  utf8 mkfs.xfs option.

"created with UTF8 support enabled."

> diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile
> index d617999..192aaca 100644
> --- a/fs/xfs/Makefile
> +++ b/fs/xfs/Makefile
> @@ -114,6 +114,8 @@ xfs-$(CONFIG_XFS_QUOTA)		+= xfs_dquot.o \
>  				   xfs_qm.o \
>  				   xfs_quotaops.o
>  
> +xfs-$(CONFIG_XFS_UTF8)		+= libxfs/xfs_utf8.o
> +

libxfs definitions come first. Also, please use the same prefixing
syntax that the other libxfs rules use.

>  # xfs_rtbitmap is shared with libxfs
>  xfs-$(CONFIG_XFS_RT)		+= xfs_rtalloc.o
>  
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 2c89211..9cfbd6b 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -165,9 +165,9 @@ xfs_da_mount(
>  		/* XXX these are replaced in the next patch need
>  		   to do some kind of reordering here */
>  		if (xfs_sb_version_hasasciici(&mp->m_sb))
> -			mp->m_dirnameops = &xfs_ascii_ci_nameops;
> +			mp->m_dirnameops = &xfs_utf8_ci_nameops;
>  		else
> -			mp->m_dirnameops = &xfs_default_nameops;
> +			mp->m_dirnameops = &xfs_utf8_nameops;
>  #else

xfs_sb_version_hasasciici()? The overloading of the asciici bit is
still used for the utf8 CI functionality? Please fix this for the
next version of the patchset.

>  		xfs_warn(mp,
>  "Recompile XFS with CONFIG_XFS_UTF8 to mount this filesystem");
> diff --git a/fs/xfs/libxfs/xfs_utf8.c b/fs/xfs/libxfs/xfs_utf8.c
> index 7e63111..1e75299 100644
> --- a/fs/xfs/libxfs/xfs_utf8.c
> +++ b/fs/xfs/libxfs/xfs_utf8.c
> @@ -68,3 +68,211 @@ xfs_utf8_version_ok(
>  
>  	return 0;
>  }
> +
> +/*
> + * xfs nameops using nfkdi
> + */

Remind me again what nfkdi means? I I can't remember the details
after a week or two, then perhaps better explanitory comments are
needed in the code?

> +static xfs_dahash_t
> +xfs_utf8_hashname(
> +	const unsigned char *name,
> +	int len,
> +	unsigned int sb_utf8version)

Please use the same indentation levels for the declartions. i.e

	const unsigned char	*name,
	int			len,
	unsigned int		sb_utf8version)

Can you go through all the XFS code and make sure this is done?

> +{
> +	utf8data_t	nfkdi;
> +	struct utf8cursor u8c;
> +	xfs_dahash_t	hash;
> +	int		val;

And these shold line up, too.

> +
> +	nfkdi = utf8nfkdi(sb_utf8version);
> +	hash = 0;

initialise at declaration.

> +	if (utf8ncursor(&u8c, nfkdi, name, len) < 0)
> +		goto blob;

Still has the "invalid binary blob" issue.

> +	while ((val = utf8byte(&u8c)) > 0)
> +		hash = val ^ rol32(hash, 7);
> +	/* In case of error treat the name as a binary blob. */
> +	if (val == 0)
> +		return hash;
> +blob:
> +	return xfs_da_hashname(name, len);
> +}
> +
> +static int
> +xfs_utf8_normhash(

More commments needed explaining what is going on.

> +	struct xfs_da_args *args)
> +{
> +	utf8data_t	nfkdi;
> +	struct utf8cursor u8c;
> +	unsigned char	*norm;
> +	ssize_t		normlen;
> +	int		c;
> +	unsigned int	sb_utf8version =
> +		args->dp->i_mount->m_sb.sb_utf8version;

Urk. Initialise on a separate line.

> +
> +	nfkdi = utf8nfkdi(sb_utf8version);
> +	/* Failure to normalize is treated as a blob. */
> +	if ((normlen = utf8nlen(nfkdi, args->name, args->namelen)) < 0)
> +		goto blob;

No assignments in logic statements, please.

	normlen = utf8nlen(nfkdi, args->name, args->namelen);
	if (normlen < 0)

This is all through the code - can you please go through and fix up
all the patches to remove this pattern? checkpatch might be helpful
here....

As it is, still has the invalid binary blob issue.


> +	if (utf8ncursor(&u8c, nfkdi, args->name, args->namelen) < 0)
> +		goto blob;
> +	if (!(norm = kmem_alloc(normlen + 1, KM_NOFS|KM_MAYFAIL)))
> +		return -ENOMEM;

Urk.

So, what happens if this memory allocation fails in the middle of a
create transaction?

(Hint: transaction is dirty at this point in time)

The rest of the code in this patch has similar issues to what I've
already pointed out.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

WARNING: multiple messages have this Message-ID (diff)
From: Dave Chinner <david@fromorbit.com>
To: Ben Myers <bpm@sgi.com>
Cc: linux-fsdevel@vger.kernel.org, olaf@sgi.com, xfs@oss.sgi.com
Subject: Re: [PATCH 11/16] xfs: add xfs_nameops for utf8 and utf8+casefold.
Date: Tue, 7 Oct 2014 09:10:16 +1100	[thread overview]
Message-ID: <20141006221016.GH2301@dastard> (raw)
In-Reply-To: <20141003220118.GJ1865@sgi.com>

On Fri, Oct 03, 2014 at 05:01:18PM -0500, Ben Myers wrote:
> From: Olaf Weber <olaf@sgi.com>
> 
> The xfs_utf8_nameops use the nfkdi normalization when comparing filenames,
> and are installed if the utf8bit is set in the super block.
> 
> The xfs_utf8_ci_nameops use the nfkdicf normalization when comparing
> filenames, and are installed if both the utf8bit and the borgbit are set
> in the superblock.
> 
> Normalized filenames are not stored on disk. Normalization will fail if a
> filename is not valid UTF-8, in which case the filename is treated as an
> opaque blob.
> 
> Signed-off-by: Olaf Weber <olaf@sgi.com>
> 
> ---
> [v2: updated to use utf8norm.ko module;
>      compiled conditionally on CONFIG_XFS_UTF8=y;
>      utf8version is now a function;
>      move xfs_utf8.[ch] into libxfs. --bpm]
> [v3: pass utf8version from the superblock through xfs_nameops
>      instead of the max version of the normalization module. --bpm]
> ---
>  fs/xfs/Kconfig           |   9 ++
>  fs/xfs/Makefile          |   2 +
>  fs/xfs/libxfs/xfs_dir2.c |   4 +-
>  fs/xfs/libxfs/xfs_utf8.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++
>  fs/xfs/libxfs/xfs_utf8.h |   3 +
>  fs/xfs/xfs_iops.c        |   2 +-
>  6 files changed, 225 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig
> index 5d47b4d..1e8a463 100644
> --- a/fs/xfs/Kconfig
> +++ b/fs/xfs/Kconfig
> @@ -95,3 +95,12 @@ config XFS_DEBUG
>  	  not useful unless you are debugging a particular problem.
>  
>  	  Say N unless you are an XFS developer, or you play one on TV.
> +
> +config XFS_UTF8
> +	bool "XFS UTF-8 support"
> +	depends on XFS_FS
> +	select CONFIG_UTF8_NORMALIZATION
> +	help
> +	  Say Y here to enable utf8 normalization support in XFS.  You
> +	  will be able to mount and use filesystems created with the
> +	  utf8 mkfs.xfs option.

"created with UTF8 support enabled."

> diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile
> index d617999..192aaca 100644
> --- a/fs/xfs/Makefile
> +++ b/fs/xfs/Makefile
> @@ -114,6 +114,8 @@ xfs-$(CONFIG_XFS_QUOTA)		+= xfs_dquot.o \
>  				   xfs_qm.o \
>  				   xfs_quotaops.o
>  
> +xfs-$(CONFIG_XFS_UTF8)		+= libxfs/xfs_utf8.o
> +

libxfs definitions come first. Also, please use the same prefixing
syntax that the other libxfs rules use.

>  # xfs_rtbitmap is shared with libxfs
>  xfs-$(CONFIG_XFS_RT)		+= xfs_rtalloc.o
>  
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 2c89211..9cfbd6b 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -165,9 +165,9 @@ xfs_da_mount(
>  		/* XXX these are replaced in the next patch need
>  		   to do some kind of reordering here */
>  		if (xfs_sb_version_hasasciici(&mp->m_sb))
> -			mp->m_dirnameops = &xfs_ascii_ci_nameops;
> +			mp->m_dirnameops = &xfs_utf8_ci_nameops;
>  		else
> -			mp->m_dirnameops = &xfs_default_nameops;
> +			mp->m_dirnameops = &xfs_utf8_nameops;
>  #else

xfs_sb_version_hasasciici()? The overloading of the asciici bit is
still used for the utf8 CI functionality? Please fix this for the
next version of the patchset.

>  		xfs_warn(mp,
>  "Recompile XFS with CONFIG_XFS_UTF8 to mount this filesystem");
> diff --git a/fs/xfs/libxfs/xfs_utf8.c b/fs/xfs/libxfs/xfs_utf8.c
> index 7e63111..1e75299 100644
> --- a/fs/xfs/libxfs/xfs_utf8.c
> +++ b/fs/xfs/libxfs/xfs_utf8.c
> @@ -68,3 +68,211 @@ xfs_utf8_version_ok(
>  
>  	return 0;
>  }
> +
> +/*
> + * xfs nameops using nfkdi
> + */

Remind me again what nfkdi means? I I can't remember the details
after a week or two, then perhaps better explanitory comments are
needed in the code?

> +static xfs_dahash_t
> +xfs_utf8_hashname(
> +	const unsigned char *name,
> +	int len,
> +	unsigned int sb_utf8version)

Please use the same indentation levels for the declartions. i.e

	const unsigned char	*name,
	int			len,
	unsigned int		sb_utf8version)

Can you go through all the XFS code and make sure this is done?

> +{
> +	utf8data_t	nfkdi;
> +	struct utf8cursor u8c;
> +	xfs_dahash_t	hash;
> +	int		val;

And these shold line up, too.

> +
> +	nfkdi = utf8nfkdi(sb_utf8version);
> +	hash = 0;

initialise at declaration.

> +	if (utf8ncursor(&u8c, nfkdi, name, len) < 0)
> +		goto blob;

Still has the "invalid binary blob" issue.

> +	while ((val = utf8byte(&u8c)) > 0)
> +		hash = val ^ rol32(hash, 7);
> +	/* In case of error treat the name as a binary blob. */
> +	if (val == 0)
> +		return hash;
> +blob:
> +	return xfs_da_hashname(name, len);
> +}
> +
> +static int
> +xfs_utf8_normhash(

More commments needed explaining what is going on.

> +	struct xfs_da_args *args)
> +{
> +	utf8data_t	nfkdi;
> +	struct utf8cursor u8c;
> +	unsigned char	*norm;
> +	ssize_t		normlen;
> +	int		c;
> +	unsigned int	sb_utf8version =
> +		args->dp->i_mount->m_sb.sb_utf8version;

Urk. Initialise on a separate line.

> +
> +	nfkdi = utf8nfkdi(sb_utf8version);
> +	/* Failure to normalize is treated as a blob. */
> +	if ((normlen = utf8nlen(nfkdi, args->name, args->namelen)) < 0)
> +		goto blob;

No assignments in logic statements, please.

	normlen = utf8nlen(nfkdi, args->name, args->namelen);
	if (normlen < 0)

This is all through the code - can you please go through and fix up
all the patches to remove this pattern? checkpatch might be helpful
here....

As it is, still has the invalid binary blob issue.


> +	if (utf8ncursor(&u8c, nfkdi, args->name, args->namelen) < 0)
> +		goto blob;
> +	if (!(norm = kmem_alloc(normlen + 1, KM_NOFS|KM_MAYFAIL)))
> +		return -ENOMEM;

Urk.

So, what happens if this memory allocation fails in the middle of a
create transaction?

(Hint: transaction is dirty at this point in time)

The rest of the code in this patch has similar issues to what I've
already pointed out.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2014-10-06 22:10 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-03 21:47 [RFC v3] Unicode/UTF-8 support for XFS Ben Myers
2014-10-03 21:50 ` [PATCH 01/16] lib: add unicode character database files Ben Myers
2014-10-03 21:51 ` [PATCH 02/16] scripts: add trie generator for UTF-8 Ben Myers
2014-10-03 21:54 ` [PATCH 03/16] lib: add supporting code " Ben Myers
2014-10-03 21:54 ` [PATCH 04/16] lib/utf8norm.c: reduce the size of utf8data[] Ben Myers
2014-10-05 21:52   ` Dave Chinner
2014-10-05 21:52     ` Dave Chinner
2014-10-03 21:55 ` [PATCH 05/16] xfs: return the first match during case-insensitive lookup Ben Myers
2014-10-06 22:19   ` Dave Chinner
2014-10-09 15:42     ` Ben Myers
2014-10-09 20:38       ` Dave Chinner
2014-10-09 20:38         ` Dave Chinner
2014-10-14 15:04         ` Ben Myers
2014-10-14 15:04           ` Ben Myers
2014-10-03 21:56 ` [PATCH 06/16] xfs: rename XFS_CMP_CASE to XFS_CMP_MATCH Ben Myers
2014-10-03 21:58 ` [PATCH 07/16] xfs: add xfs_nameops.normhash Ben Myers
2014-10-03 21:58 ` [PATCH 08/16] xfs: change interface of xfs_nameops.hashname Ben Myers
2014-10-06 22:17   ` Dave Chinner
2014-10-06 22:17     ` Dave Chinner
2014-10-14 15:34     ` Ben Myers
2014-10-03 21:59 ` [PATCH 09/16] xfs: add a superblock feature bit to indicate UTF-8 support Ben Myers
2014-10-06 21:25   ` Dave Chinner
2014-10-09 15:26     ` Ben Myers
2014-10-03 22:00 ` [PATCH 10/16] xfs: store utf8version in the superblock Ben Myers
2014-10-06 21:53   ` Dave Chinner
2014-10-06 21:53     ` Dave Chinner
2014-10-03 22:01 ` [PATCH 11/16] xfs: add xfs_nameops for utf8 and utf8+casefold Ben Myers
2014-10-06 22:10   ` Dave Chinner [this message]
2014-10-06 22:10     ` Dave Chinner
2014-10-03 22:03 ` [PATCH 12/16] xfs: apply utf-8 normalization rules to user extended attribute names Ben Myers
2014-10-03 22:03 ` [PATCH 13/16] xfs: implement demand load of utf8norm.ko Ben Myers
2014-10-04  7:16   ` Christoph Hellwig
2014-10-04  7:16     ` Christoph Hellwig
2014-10-09 15:19     ` Ben Myers
2014-10-03 22:04 ` [PATCH 14/16] xfs: rename XFS_IOC_FSGEOM to XFS_IOC_FSGEOM_V2 Ben Myers
2014-10-06 20:33   ` Dave Chinner
2014-10-06 20:33     ` Dave Chinner
2014-10-06 20:38     ` Ben Myers
2014-10-03 22:05 ` [PATCH 15/16] xfs: xfs_fs_geometry returns a number of bytes to copy Ben Myers
2014-10-06 20:41   ` Dave Chinner
2014-10-06 20:41     ` Dave Chinner
2014-10-03 22:05 ` [PATCH 16/16] xfs: add versioned fsgeom ioctl with utf8version field Ben Myers
2014-10-06 21:13   ` Dave Chinner
2014-10-06 21:13     ` Dave Chinner
2014-10-03 22:06 ` [PATCH 17/35] xfsprogs: add unicode character database files Ben Myers
2014-10-03 22:07 ` [PATCH 18/35] xfsprogs: add trie generator for UTF-8 Ben Myers
2014-10-03 22:07 ` [PATCH 19/35] xfsprogs: add supporting code " Ben Myers
2014-10-03 22:08 ` [PATCH 20/35] xfsprogs: reduce the size of utf8data[] Ben Myers
2014-10-03 22:09 ` [PATCH 21/35] libxfs: return the first match during case-insensitive lookup Ben Myers
2014-10-03 22:09 ` [PATCH 22/35] libxfs: rename XFS_CMP_CASE to XFS_CMP_MATCH Ben Myers
2014-10-03 22:10 ` [PATCH 23/35] libxfs: add xfs_nameops.normhash Ben Myers
2014-10-03 22:11 ` [PATCH 24/35] libxfs: change interface of xfs_nameops.hashname Ben Myers
2014-10-03 22:11 ` [PATCH 25/35] libxfs: add a superblock feature bit to indicate UTF-8 support Ben Myers
2014-10-03 22:12 ` [PATCH 26/35] libxfs: store utf8version in the superblock Ben Myers
2014-10-03 22:13 ` [PATCH 27/35] libxfs: add xfs_nameops for utf8 and utf8+casefold Ben Myers
2014-10-03 22:13 ` [PATCH 28/35] libxfs: apply utf-8 normalization rules to user extended attribute names Ben Myers
2014-10-03 22:14 ` [PATCH 29/35] libxfs: rename XFS_IOC_FSGEOM to XFS_IOC_FSGEOM_V2 Ben Myers
2014-10-03 22:14 ` [PATCH 30/35] libxfs: add versioned fsgeom ioctl with utf8version field Ben Myers
2014-10-03 22:15 ` [PATCH 31/35] xfsprogs: add utf8 support to growfs Ben Myers
2014-10-03 22:15 ` [PATCH 32/35] xfsprogs: add utf8 support to mkfs.xfs Ben Myers
2014-10-03 22:16 ` [PATCH 33/35] xfsprogs: add utf8 support to xfs_repair Ben Myers
2014-10-03 22:16 ` [PATCH 34/35] xfsprogs: xfs_db support for sb_utf8version Ben Myers
2014-10-03 22:17 ` [PATCH 35/35] xfsprogs: add a test for utf8 support Ben Myers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141006221016.GH2301@dastard \
    --to=david@fromorbit.com \
    --cc=bpm@sgi.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=olaf@sgi.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.