linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Shaohua Li <shaohua.li-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>
Cc: "linux-btrfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-btrfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Chris Mason <chris.mason-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>,
	Christoph Hellwig <hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
	Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Arjan van de Ven <arjan-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
	"Yan,
	Zheng" <zheng.z.yan-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
	"linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org"
	<mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH v2 3/5]add metadata_readahead ioctl in vfs
Date: Wed, 05 Jan 2011 10:11:36 +0800	[thread overview]
Message-ID: <1294193496.1949.378.camel@sli10-conroe> (raw)
In-Reply-To: <201101041051.13979.arnd-r2nGTMty4D4@public.gmane.org>

On Tue, 2011-01-04 at 17:51 +0800, Arnd Bergmann wrote:
> On Tuesday 04 January 2011 06:40:37 Shaohua Li wrote:
> >  /*
> >   * When you add any new common ioctls to the switches above and below
> >   * please update compat_sys_ioctl() too.
> > @@ -664,6 +682,9 @@ int do_vfs_ioctl(struct file *filp, unsi
> >         case FIMETADATA_INCORE:
> >                 return ioctl_metadata_incore(filp, argp);
> >  
> > +       case FIMETADATA_READAHEAD:
> > +               return ioctl_metadata_readahead(filp, argp);
> > +
> >         default:
> >                 if (S_ISREG(filp->f_path.dentry->d_inode->i_mode))
> >                         error = file_ioctl(filp, cmd, arg);
> 
> Did you notice the comment above the function? ;-)
> 
> You should really add the new ioctls to compat_sys_ioctl, not
> to the COMPATIBLE_IOCTL() list, in order to make the behavior
> consistent between 32 and 64 bit user space. The main difference
> is that all ioctl commands that are hardcoded in the functions
> get called before trying to call the file system specific
> .ioctl method.
> 
> > +struct metadata_readahead_args {
> > +       __u64 offset;
> > +       __u64 size;
> > +};
> > +
> >  #define NR_FILE  8192  /* this can well be larger on a larger system */
> >  
> >  #define MAY_EXEC 1
> > @@ -338,6 +343,7 @@ struct metadata_incore_args {
> >  #define FITHAW         _IOWR('X', 120, int)    /* Thaw */
> >  #define FITRIM         _IOWR('X', 121, struct fstrim_range)    /* Trim */
> >  #define FIMETADATA_INCORE _IOWR('X', 122, struct metadata_incore_args)
> > +#define FIMETADATA_READAHEAD _IOR('X', 123, struct metadata_readahead_args)
> 
> This should be _IOW, not _IOR.
> 
> Otherwise looks good.
Thanks, fixed them.

Subject: add metadata_readahead ioctl in vfs

Add metadata readahead ioctl in vfs. Filesystem can hook to
super_operations.metadata_readahead to handle filesystem specific task.
Next patch will give an example how btrfs implements it.

Signed-off-by: Shaohua Li <shaohua.li-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

---
 fs/compat_ioctl.c  |    2 ++
 fs/ioctl.c         |   21 +++++++++++++++++++++
 include/linux/fs.h |    8 ++++++++
 3 files changed, 31 insertions(+)

Index: linux/fs/ioctl.c
===================================================================
--- linux.orig/fs/ioctl.c	2011-01-05 10:00:17.000000000 +0800
+++ linux/fs/ioctl.c	2011-01-05 10:00:42.000000000 +0800
@@ -603,6 +603,24 @@ static int ioctl_metadata_incore(struct
 	return entries;
 }
 
+static int ioctl_metadata_readahead(struct file *filp, void __user *argp)
+{
+	struct super_block *sb = filp->f_path.dentry->d_inode->i_sb;
+	struct metadata_readahead_args args;
+
+	if (!sb->s_op->metadata_readahead)
+		return -EINVAL;
+
+	if (copy_from_user(&args, argp, sizeof(args)))
+		return -EFAULT;
+
+	/* readahead in page unit */
+	if ((args.offset & ~PAGE_CACHE_MASK) || (args.size & ~PAGE_CACHE_MASK))
+		return -EINVAL;
+
+	return sb->s_op->metadata_readahead(sb, args.offset, args.size);
+}
+
 /*
  * When you add any new common ioctls to the switches above and below
  * please update compat_sys_ioctl() too.
@@ -666,6 +684,9 @@ int do_vfs_ioctl(struct file *filp, unsi
 	case FIMETADATA_INCORE:
 		return ioctl_metadata_incore(filp, argp);
 
+	case FIMETADATA_READAHEAD:
+		return ioctl_metadata_readahead(filp, argp);
+
 	default:
 		if (S_ISREG(filp->f_path.dentry->d_inode->i_mode))
 			error = file_ioctl(filp, cmd, arg);
Index: linux/include/linux/fs.h
===================================================================
--- linux.orig/include/linux/fs.h	2011-01-05 09:10:12.000000000 +0800
+++ linux/include/linux/fs.h	2011-01-05 10:00:42.000000000 +0800
@@ -65,6 +65,11 @@ struct metadata_incore_args {
 	__u32 unused;
 };
 
+struct metadata_readahead_args {
+	__u64 offset;
+	__u64 size;
+};
+
 #define NR_FILE  8192	/* this can well be larger on a larger system */
 
 #define MAY_EXEC 1
@@ -338,6 +343,7 @@ struct metadata_incore_args {
 #define FITHAW		_IOWR('X', 120, int)	/* Thaw */
 #define FITRIM		_IOWR('X', 121, struct fstrim_range)	/* Trim */
 #define FIMETADATA_INCORE _IOWR('X', 122, struct metadata_incore_args)
+#define FIMETADATA_READAHEAD _IOW('X', 123, struct metadata_readahead_args)
 
 #define	FS_IOC_GETFLAGS			_IOR('f', 1, long)
 #define	FS_IOC_SETFLAGS			_IOW('f', 2, long)
@@ -1628,6 +1634,8 @@ struct super_operations {
 	int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
 	int (*metadata_incore)(struct super_block*, loff_t *offset,
 		ssize_t *size);
+	int (*metadata_readahead)(struct super_block*, loff_t offset,
+		ssize_t size);
 };
 
 /*
Index: linux/fs/compat_ioctl.c
===================================================================
--- linux.orig/fs/compat_ioctl.c	2011-01-05 08:58:06.000000000 +0800
+++ linux/fs/compat_ioctl.c	2011-01-05 10:00:42.000000000 +0800
@@ -883,6 +883,7 @@ COMPATIBLE_IOCTL(FIGETBSZ)
 COMPATIBLE_IOCTL(FIFREEZE)
 COMPATIBLE_IOCTL(FITHAW)
 COMPATIBLE_IOCTL(FIMETADATA_INCORE)
+COMPATIBLE_IOCTL(FIMETADATA_READAHEAD)
 COMPATIBLE_IOCTL(KDGETKEYCODE)
 COMPATIBLE_IOCTL(KDSETKEYCODE)
 COMPATIBLE_IOCTL(KDGKBTYPE)
@@ -1579,6 +1580,7 @@ asmlinkage long compat_sys_ioctl(unsigne
 	case FIOASYNC:
 	case FIOQSIZE:
 	case FIMETADATA_INCORE:
+	case FIMETADATA_READAHEAD:
 		break;
 
 #if defined(CONFIG_IA64) || defined(CONFIG_X86_64)

  parent reply	other threads:[~2011-01-05  2:11 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-04  5:40 [PATCH v2 3/5]add metadata_readahead ioctl in vfs Shaohua Li
2011-01-04  9:51 ` Arnd Bergmann
     [not found]   ` <201101041051.13979.arnd-r2nGTMty4D4@public.gmane.org>
2011-01-05  2:11     ` Shaohua Li [this message]
2011-01-05  9:09       ` Arnd Bergmann
2011-01-05  9:26         ` Arnd Bergmann
2011-01-06  7:45           ` Shaohua Li
2011-01-07 14:16             ` Arnd Bergmann

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=1294193496.1949.378.camel@sli10-conroe \
    --to=shaohua.li-ral2jqcrhueavxtiumwx3w@public.gmane.org \
    --cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
    --cc=arjan-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=arnd-r2nGTMty4D4@public.gmane.org \
    --cc=chris.mason-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org \
    --cc=hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-btrfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=zheng.z.yan-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).