[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