All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gabriel Krisman Bertazi <krisman@collabora.com>
To: "André Almeida" <andrealmeid@collabora.com>
Cc: Hugh Dickins <hughd@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	smcv@collabora.com, kernel@collabora.com, linux-mm@kvack.org,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	Daniel Rosenberg <drosen@google.com>
Subject: Re: [RFC PATCH 3/4] mm: shmem: Add IOCTL support for tmpfs
Date: Tue, 23 Mar 2021 18:15:01 -0400	[thread overview]
Message-ID: <87tup1bjq2.fsf@collabora.com> (raw)
In-Reply-To: <20210323195941.69720-4-andrealmeid@collabora.com> (=?utf-8?Q?=22Andr=C3=A9?= Almeida"'s message of "Tue, 23 Mar 2021 16:59:40 -0300")

André Almeida <andrealmeid@collabora.com> writes:

> Implement IOCTL operations for files to set/get file flags. Implement
> the only supported flag by now, that is S_CASEFOLD.
>
> Signed-off-by: André Almeida <andrealmeid@collabora.com>
> ---
>  include/linux/shmem_fs.h |  4 ++
>  mm/shmem.c               | 84 +++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 87 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
> index 29ee64352807..2c89c5a66508 100644
> --- a/include/linux/shmem_fs.h
> +++ b/include/linux/shmem_fs.h
> @@ -140,4 +140,8 @@ extern int shmem_mfill_zeropage_pte(struct mm_struct *dst_mm,
>  				 dst_addr)      ({ BUG(); 0; })
>  #endif
>  
> +#define TMPFS_CASEFOLD_FL	0x40000000 /* Casefolded file */
> +#define TMPFS_USER_FLS		TMPFS_CASEFOLD_FL /* Userspace supported flags */
> +#define TMPFS_FLS		S_CASEFOLD /* Kernel supported flags */

Minor nit: FLS?  _FLAGS is short enough :).

> +
>  #endif
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 20df81763995..2f2c996d215b 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -258,6 +258,7 @@ static inline void shmem_inode_unacct_blocks(struct inode *inode, long pages)
>  static const struct super_operations shmem_ops;
>  const struct address_space_operations shmem_aops;
>  static const struct file_operations shmem_file_operations;
> +static const struct file_operations shmem_dir_operations;
>  static const struct inode_operations shmem_inode_operations;
>  static const struct inode_operations shmem_dir_inode_operations;
>  static const struct inode_operations shmem_special_inode_operations;
> @@ -2347,7 +2348,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode
>  			/* Some things misbehave if size == 0 on a directory */
>  			inode->i_size = 2 * BOGO_DIRENT_SIZE;
>  			inode->i_op = &shmem_dir_inode_operations;
> -			inode->i_fop = &simple_dir_operations;
> +			inode->i_fop = &shmem_dir_operations;
>  			break;
>  		case S_IFLNK:
>  			/*
> @@ -2838,6 +2839,76 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset,
>  	return error;
>  }
>  
> +static long shmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> +{
> +	int ret;
> +	u32 fsflags = 0, old, new = 0;
> +	struct inode *inode = file_inode(file);
> +	struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
> +
> +	switch (cmd) {
> +	case FS_IOC_GETFLAGS:
> +		if ((inode->i_flags & S_CASEFOLD) && S_ISDIR(inode->i_mode))
> +			fsflags |= TMPFS_CASEFOLD_FL;
> +
> +		if (put_user(fsflags, (int __user *)arg))
> +			return -EFAULT;
> +
> +		return 0;
> +
> +	case FS_IOC_SETFLAGS:
> +		if (get_user(fsflags, (int __user *)arg))
> +			return -EFAULT;
> +
> +		old = inode->i_flags;
> +
> +		if (fsflags & ~TMPFS_USER_FLS)
> +			return -EINVAL;
> +
> +		if (fsflags & TMPFS_CASEFOLD_FL) {
> +			if (!sbinfo->casefold) {
> +				pr_err("tmpfs: casefold disabled at this mount point\n");

Minor nit: no point in logging an error here.  The user has simply not
enabled casefolding.  The error returned below should be enough.

> +				return -EOPNOTSUPP;
> +			}
> +
> +			if (!S_ISDIR(inode->i_mode))
> +				return -ENOTDIR;
> +
> +			if (!simple_empty(file_dentry(file)))
> +				return -ENOTEMPTY;
> +
> +			new |= S_CASEFOLD;
> +		} else if (old & S_CASEFOLD) {
> +			if (!simple_empty(file_dentry(file)))
> +				return -ENOTEMPTY;
> +		}
> +
> +		ret = mnt_want_write_file(file);
> +		if (ret)
> +			return ret;
> +
> +		inode_lock(inode);
> +
> +		ret = vfs_ioc_setflags_prepare(inode, old, new);
> +		if (ret) {
> +			inode_unlock(inode);
> +			mnt_drop_write_file(file);
> +			return ret;
> +		}
> +
> +		inode_set_flags(inode, new, TMPFS_FLS);
> +
> +		inode_unlock(inode);
> +		mnt_drop_write_file(file);
> +		return 0;
> +
> +	default:
> +		return -ENOTTY;
> +	}
> +
> +	return 0;
> +}
> +
>  static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf)
>  {
>  	struct shmem_sb_info *sbinfo = SHMEM_SB(dentry->d_sb);
> @@ -3916,6 +3987,7 @@ static const struct file_operations shmem_file_operations = {
>  	.splice_read	= generic_file_splice_read,
>  	.splice_write	= iter_file_splice_write,
>  	.fallocate	= shmem_fallocate,
> +	.unlocked_ioctl = shmem_ioctl,
>  #endif
>  };
>  
> @@ -3928,6 +4000,16 @@ static const struct inode_operations shmem_inode_operations = {
>  #endif
>  };
>  
> +static const struct file_operations shmem_dir_operations = {
> +	.open		= dcache_dir_open,
> +	.release	= dcache_dir_close,
> +	.llseek		= dcache_dir_lseek,
> +	.read		= generic_read_dir,
> +	.iterate_shared	= dcache_readdir,
> +	.fsync		= noop_fsync,
> +	.unlocked_ioctl = shmem_ioctl,
> +};
> +
>  static const struct inode_operations shmem_dir_inode_operations = {
>  #ifdef CONFIG_TMPFS
>  	.create		= shmem_create,

-- 
Gabriel Krisman Bertazi

  reply	other threads:[~2021-03-23 22:16 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23 19:59 [RFC PATCH 0/4] mm: shmem: Add case-insensitive support for tmpfs André Almeida
2021-03-23 19:59 ` [RFC PATCH 1/4] Revert "libfs: unexport generic_ci_d_compare() and generic_ci_d_hash()" André Almeida
2021-03-23 20:15   ` Matthew Wilcox
2021-03-24 20:09     ` André Almeida
2021-03-23 19:59 ` [RFC PATCH 2/4] mm: shmem: Support case-insensitive file name lookups André Almeida
2021-03-23 20:18   ` Gabriel Krisman Bertazi
2021-03-23 20:18     ` Gabriel Krisman Bertazi
2021-03-24 20:17     ` André Almeida
2021-03-23 23:19   ` Al Viro
2021-03-24 20:44     ` André Almeida
2021-03-23 19:59 ` [RFC PATCH 3/4] mm: shmem: Add IOCTL support for tmpfs André Almeida
2021-03-23 22:15   ` Gabriel Krisman Bertazi [this message]
2021-03-23 22:15     ` Gabriel Krisman Bertazi
2021-03-23 19:59 ` [RFC PATCH 4/4] docs: tmpfs: Add casefold options André Almeida
2021-03-23 21:58   ` Randy Dunlap
2021-03-25 14:27     ` André Almeida
2021-03-23 22:19   ` Gabriel Krisman Bertazi
2021-03-23 22:19     ` Gabriel Krisman Bertazi
2021-03-24 20:47     ` André Almeida

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=87tup1bjq2.fsf@collabora.com \
    --to=krisman@collabora.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrealmeid@collabora.com \
    --cc=drosen@google.com \
    --cc=hughd@google.com \
    --cc=kernel@collabora.com \
    --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.