From: Gabriel Krisman Bertazi <krisman@suse.de>
To: "André Almeida" <andrealmeid@igalia.com>
Cc: Hugh Dickins <hughd@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
krisman@kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
kernel-dev@igalia.com, Daniel Rosenberg <drosen@google.com>,
smcv@collabora.com, Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH v2 6/8] tmpfs: Add flag FS_CASEFOLD_FL support for tmpfs dirs
Date: Tue, 03 Sep 2024 12:15:52 -0400 [thread overview]
Message-ID: <87jzfshfwn.fsf@mailhost.krisman.be> (raw)
In-Reply-To: <20240902225511.757831-7-andrealmeid@igalia.com> ("André Almeida"'s message of "Mon, 2 Sep 2024 19:55:08 -0300")
André Almeida <andrealmeid@igalia.com> writes:
> Enable setting flag FS_CASEFOLD_FL for tmpfs directories, when tmpfs is
> mounted with casefold support. A special check is need for this flag,
> since it can't be set for non-empty directories.
>
> Signed-off-by: André Almeida <andrealmeid@igalia.com>
> ---
> include/linux/shmem_fs.h | 6 +++---
> mm/shmem.c | 40 +++++++++++++++++++++++++++++++++-------
> 2 files changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
> index 1d06b1e5408a..8367ca2b99d9 100644
> --- a/include/linux/shmem_fs.h
> +++ b/include/linux/shmem_fs.h
> @@ -42,10 +42,10 @@ struct shmem_inode_info {
> struct inode vfs_inode;
> };
>
> -#define SHMEM_FL_USER_VISIBLE FS_FL_USER_VISIBLE
> +#define SHMEM_FL_USER_VISIBLE (FS_FL_USER_VISIBLE | FS_CASEFOLD_FL)
> #define SHMEM_FL_USER_MODIFIABLE \
> - (FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL | FS_NOATIME_FL)
> -#define SHMEM_FL_INHERITED (FS_NODUMP_FL | FS_NOATIME_FL)
> + (FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL | FS_NOATIME_FL | FS_CASEFOLD_FL)
> +#define SHMEM_FL_INHERITED (FS_NODUMP_FL | FS_NOATIME_FL | FS_CASEFOLD_FL)
>
> struct shmem_quota_limits {
> qsize_t usrquota_bhardlimit; /* Default user quota block hard limit */
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 0f918010bc54..9a0fc7636629 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -2617,9 +2617,26 @@ static int shmem_initxattrs(struct inode *, const struct xattr *, void *);
> * chattr's fsflags are unrelated to extended attributes,
> * but tmpfs has chosen to enable them under the same config option.
> */
> -static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags)
> +static int shmem_set_inode_flags(struct inode *inode, unsigned int fsflags, struct dentry *dentry)
> {
> - unsigned int i_flags = 0;
> + unsigned int i_flags = 0, old = inode->i_flags;
> + struct super_block *sb = inode->i_sb;
> +
> + if (fsflags & FS_CASEFOLD_FL) {
> + if (!sb->s_encoding)
> + return -EOPNOTSUPP;
> +
> + if (!S_ISDIR(inode->i_mode))
> + return -ENOTDIR;
> +
> + if (dentry && !simple_empty(dentry))
> + return -ENOTEMPTY;
> +
> + i_flags |= S_CASEFOLD;
> + } else if (old & S_CASEFOLD) {
> + if (dentry && !simple_empty(dentry))
> + return -ENOTEMPTY;
We don't want to fail if a directory already has the S_CASEFOLD
flag and we are not flipping it in the current operation. Something like:
if ((fsflags ^ old) & S_CASEFOLD) {
if (!sb->s_encoding)
return -EOPNOTSUPP;
if (!S_ISDIR(inode->i_mode))
return -ENOTDIR;
if (dentry && !simple_empty(dentry))
return -ENOTEMPTY;
i_flags |= fsflags & S_CASEFOLD;
}
>
> if (fsflags & FS_NOATIME_FL)
> i_flags |= S_NOATIME;
> @@ -2630,10 +2647,12 @@ static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags)
> /*
> * But FS_NODUMP_FL does not require any action in i_flags.
> */
> - inode_set_flags(inode, i_flags, S_NOATIME | S_APPEND | S_IMMUTABLE);
> + inode_set_flags(inode, i_flags, S_NOATIME | S_APPEND | S_IMMUTABLE | S_CASEFOLD);
> +
> + return 0;
> }
> #else
> -static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags)
> +static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags, struct dentry *dentry)
> {
> }
> #define shmem_initxattrs NULL
> @@ -2680,7 +2699,7 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap,
> info->fsflags = (dir == NULL) ? 0 :
> SHMEM_I(dir)->fsflags & SHMEM_FL_INHERITED;
> if (info->fsflags)
> - shmem_set_inode_flags(inode, info->fsflags);
> + shmem_set_inode_flags(inode, info->fsflags, NULL);
> INIT_LIST_HEAD(&info->shrinklist);
> INIT_LIST_HEAD(&info->swaplist);
> simple_xattrs_init(&info->xattrs);
> @@ -3790,16 +3809,23 @@ static int shmem_fileattr_set(struct mnt_idmap *idmap,
> {
> struct inode *inode = d_inode(dentry);
> struct shmem_inode_info *info = SHMEM_I(inode);
> + int ret, flags;
>
> if (fileattr_has_fsx(fa))
> return -EOPNOTSUPP;
> if (fa->flags & ~SHMEM_FL_USER_MODIFIABLE)
> return -EOPNOTSUPP;
>
> - info->fsflags = (info->fsflags & ~SHMEM_FL_USER_MODIFIABLE) |
> + flags = (info->fsflags & ~SHMEM_FL_USER_MODIFIABLE) |
> (fa->flags & SHMEM_FL_USER_MODIFIABLE);
>
> - shmem_set_inode_flags(inode, info->fsflags);
> + ret = shmem_set_inode_flags(inode, flags, dentry);
> +
> + if (ret)
> + return ret;
> +
> + info->fsflags = flags;
> +
> inode_set_ctime_current(inode);
> inode_inc_iversion(inode);
> return 0;
--
Gabriel Krisman Bertazi
next prev parent reply other threads:[~2024-09-03 16:15 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-02 22:55 [PATCH v2 0/8] tmpfs: Add case-insesitive support for tmpfs André Almeida
2024-09-02 22:55 ` [PATCH v2 1/8] unicode: Fix utf8_load() error path André Almeida
2024-09-03 11:40 ` Theodore Ts'o
2024-09-03 16:48 ` Gabriel Krisman Bertazi
2024-09-02 22:55 ` [PATCH v2 2/8] unicode: Create utf8_check_strict_name André Almeida
2024-09-03 9:04 ` kernel test robot
2024-09-03 11:36 ` Theodore Ts'o
2024-09-03 15:34 ` Gabriel Krisman Bertazi
2024-09-02 22:55 ` [PATCH v2 3/8] ext4: Use utf8_check_strict_name helper André Almeida
2024-09-03 11:37 ` Theodore Ts'o
2024-09-02 22:55 ` [PATCH v2 4/8] unicode: Recreate utf8_parse_version() André Almeida
2024-09-03 11:41 ` Theodore Ts'o
2024-09-02 22:55 ` [PATCH v2 5/8] tmpfs: Add casefold lookup support André Almeida
2024-09-03 16:08 ` Gabriel Krisman Bertazi
2024-09-02 22:55 ` [PATCH v2 6/8] tmpfs: Add flag FS_CASEFOLD_FL support for tmpfs dirs André Almeida
2024-09-03 9:04 ` kernel test robot
2024-09-03 9:04 ` kernel test robot
2024-09-03 16:15 ` Gabriel Krisman Bertazi [this message]
2024-09-04 22:28 ` André Almeida
2024-09-02 22:55 ` [PATCH v2 7/8] tmpfs: Expose filesystem features via sysfs André Almeida
2024-09-02 22:55 ` [PATCH v2 8/8] docs: tmpfs: Add casefold options André Almeida
2024-09-03 16:38 ` Gabriel Krisman Bertazi
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=87jzfshfwn.fsf@mailhost.krisman.be \
--to=krisman@suse.de \
--cc=akpm@linux-foundation.org \
--cc=andrealmeid@igalia.com \
--cc=brauner@kernel.org \
--cc=drosen@google.com \
--cc=hch@lst.de \
--cc=hughd@google.com \
--cc=jack@suse.cz \
--cc=kernel-dev@igalia.com \
--cc=krisman@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=smcv@collabora.com \
--cc=viro@zeniv.linux.org.uk \
/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.