[Ocfs2-devel] [PATCH 27/30] ocfs2: Handle missing vectorized fileops aio_read() and aio_write()

Joel Becker Joel.Becker at oracle.com
Mon Dec 24 13:27:57 PST 2007


On Thu, Dec 20, 2007 at 03:29:44PM -0800, Sunil Mushran wrote:
> Commit 027445c37282bc1ed26add45e573ad2d3e4860a5 in mainline vectorized
> fileops aio_read() and aio_write(). This patch allows one to build ocfs2
> with kernels having/not having this change.

	I can't help but wonder if we couldn't write this as a wrapper
over the vectorized version.  That is, rather than defining two
different ocfs2_aio_read() prototypes, just do

#ifdef NO_VECTORIZED_AIO
static ocfs2_aio_read_novec(...)
{
    struct iovec { ... };
    return ocfs2_aio_read(..., &iovec, ...);
}
#endif

Something like that.
	Also, please reverse the test.

Joel

> 
> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
> ---
>  Config.make.in    |    1 +
>  configure.in      |    5 +++++
>  fs/ocfs2/Makefile |    4 ++++
>  fs/ocfs2/file.c   |   33 +++++++++++++++++++++++++++++----
>  4 files changed, 39 insertions(+), 4 deletions(-)
> 
> diff --git a/Config.make.in b/Config.make.in
> index d4cd518..f99b9f4 100644
> --- a/Config.make.in
> +++ b/Config.make.in
> @@ -71,6 +71,7 @@ GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
>  FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
>  SOP_IS_CONST = @SOP_IS_CONST@
>  IOP_IS_CONST = @IOP_IS_CONST@
> +VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
>  
>  OCFS_DEBUG = @OCFS_DEBUG@
>  
> diff --git a/configure.in b/configure.in
> index 8a23983..741dfdb 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -282,6 +282,11 @@ OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h,
>    IOP_IS_CONST=yes, , [^.*const struct inode_operations.*\*i_op;])
>  AC_SUBST(IOP_IS_CONST)
>  
> +VECTORED_FILE_AIO=
> +OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], fs.h,
> +  VECTORED_FILE_AIO=yes, , [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);])
> +AC_SUBST(VECTORED_FILE_AIO)
> +
>  # using -include has two advantages:
>  #  the source doesn't need to know to include compat headers
>  #  the compat header file names don't go through the search path
> diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile
> index 97912fd..80fd6c6 100644
> --- a/fs/ocfs2/Makefile
> +++ b/fs/ocfs2/Makefile
> @@ -73,6 +73,10 @@ ifdef IOP_IS_CONST
>  EXTRA_CFLAGS += -DIOP_IS_CONST
>  endif
>  
> +ifdef VECTORED_FILE_AIO
> +EXTRA_CFLAGS += -DVECTORED_FILE_AIO
> +endif
> +
>  #
>  # Since SUBDIRS means something to kbuild, define them safely.  Do not
>  # include trailing slashes.
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index e74730d..1ee2a79 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -2087,10 +2087,19 @@ out:
>  	return total ? total : ret;
>  }
>  
> +#ifdef VECTORED_FILE_AIO
> +#define iocb_ki_left	iocb->ki_left
>  static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
>  				    const struct iovec *iov,
>  				    unsigned long nr_segs,
>  				    loff_t pos)
> +#else
> +#define iocb_ki_left	buflen
> +static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
> +				    const char __user *buf,
> +				    size_t buflen,
> +				    loff_t pos)
> +#endif
>  {
>  	int ret, direct_io, appending, rw_level, have_alloc_sem  = 0;
>  	int can_do_direct, sync = 0;
> @@ -2100,13 +2109,19 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
>  	loff_t *ppos = &iocb->ki_pos;
>  	struct file *file = iocb->ki_filp;
>  	struct inode *inode = file->f_path_dentry->d_inode;
> +#ifndef VECTORED_FILE_AIO
> +	struct iovec iov_local = { .iov_base = (void __user *)buf,
> +				   .iov_len  = buflen };
> +	const struct iovec *iov = &iov_local;
> +	unsigned long nr_segs = 1;
> +#endif
>  
>  	mlog_entry("(0x%p, %u, '%.*s')\n", file,
>  		   (unsigned int)nr_segs,
>  		   file->f_path_dentry->d_name.len,
>  		   file->f_path_dentry->d_name.name);
>  
> -	if (iocb->ki_left == 0)
> +	if (iocb_ki_left == 0)
>  		return 0;
>  
>  	ret = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
> @@ -2139,7 +2154,7 @@ relock:
>  
>  	can_do_direct = direct_io;
>  	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
> -					    iocb->ki_left, appending,
> +					    iocb_ki_left, appending,
>  					    &can_do_direct);
>  	if (ret < 0) {
>  		mlog_errno(ret);
> @@ -2392,17 +2407,23 @@ bail:
>  	return ret;
>  }
>  
> +#ifdef VECTORED_FILE_AIO
>  static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
>  				   const struct iovec *iov,
>  				   unsigned long nr_segs,
>  				   loff_t pos)
> +#else
> +static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
> +				   char __user *buf,
> +				   size_t buflen,
> +				   loff_t pos)
> +#endif
>  {
>  	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
>  	struct file *filp = iocb->ki_filp;
>  	struct inode *inode = filp->f_path_dentry->d_inode;
>  
> -	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
> -		   (unsigned int)nr_segs,
> +	mlog_entry("(0x%p, '%.*s')\n", filp,
>  		   filp->f_path_dentry->d_name.len,
>  		   filp->f_path_dentry->d_name.name);
>  
> @@ -2446,7 +2467,11 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
>  	}
>  	ocfs2_meta_unlock(inode, lock_level);
>  
> +#ifdef VECTORED_FILE_AIO
>  	ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos);
> +#else
> +	ret = generic_file_aio_read(iocb, buf, buflen, iocb->ki_pos);
> +#endif
>  	if (ret == -EINVAL)
>  		mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n");
>  
> -- 
> 1.5.2.5
> 
> 
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel

-- 

"There is no sincerer love than the love of food."  
         - George Bernard Shaw 

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list