Hello

On Friday 15 September 2006 06:24, Andrew Morton wrote:
> On Wed, 13 Sep 2006 22:12:54 +0400
> "Vladimir V. Saveliev" <[EMAIL PROTECTED]> wrote:
> 
> > Hello, Andrew
> > 
> > reiser4 in 2.6.18-rc6-mm2 has a bug. It can not do readv.
> > 
> > The attached patch fixes it by implementing reiser4' aio_read file 
> > operation.
> > Unfortunately, it appeared to get a loop which is very similar to the one of
> > fs/read_write.c:do_loop_readv_writev().
> > Alternatively, if do_loop_readv_writev were EXPORT_SYMBOL-ed
> > reiser4' aio_read could use it instead. But, there is a problem with 
> > do_loop_readv_writev EXPORT_SYMBOL-ing:
> > one if its arguments is io_fn_t, which is declared in fs/read_write.h.
> > If it is ok to move io_fn_t and do_loop_readv_writev declarations to 
> > include/linux/fs.h and to EXPORT_SYMBOL 
> > do_loop_readv_writev the fix will be smaller. Please, let me know what 
> > would you prefer.
> > 
> 
> Yes, I'd say that do_loop_readv_writev() is suitable for exporting to
> filesystems, and that doing so is preferable to duplicating it.
> 
> That'd be two patches, please: one to do the export and one to use it in
> reiser4.
> 
> I assume there's a good reason why reiser4 cannot use
> generic_file_aio_read() or vfs_readv().  Please capture that discussion in
> the changelog for the first patch, thanks.
> 

It seems the problem can be fixed a bit simpler. Currently, there is a 
difference between read and readv: read calls f_op->read if it is defined,
but readv calls f_op->read if f_op->aio_read is not defined. The latest is a 
bit unlogical imho: 
wouldn't it be more consistent if readv worked via f_op->read if it is defined?
If we fixed readv (do_readv_writev) that way - reiser4 would not need anything 
from its aio_read but generic_file_aio_read.


From: Vladimir Saveliev <[EMAIL PROTECTED]>

There is some asymmetry between read and readv:
read (vfs_read, namely) calls f_op->read when it is defined,
while readv (do_readv_writev) calls f_op->read when f_op->aio_read is not 
defined.
This patch makes do_readv_writev to call do_loop_readv_writev
(which calls f_op->read for each segment of i/o vector) if f_op->read is 
defined.

Signed-off-by: Vladimir Saveliev <[EMAIL PROTECTED]>




diff -puN fs/read_write.c~fix-do_readv_writev fs/read_write.c
--- linux-2.6.18-rc6-mm2/fs/read_write.c~fix-do_readv_writev    2006-09-15 
17:46:03.000000000 +0400
+++ linux-2.6.18-rc6-mm2-vs/fs/read_write.c     2006-09-17 23:01:17.000000000 
+0400
@@ -608,7 +608,6 @@ static ssize_t do_readv_writev(int type,
        if (ret)
                goto out;
 
-       fnv = NULL;
        if (type == READ) {
                fn = file->f_op->read;
                fnv = file->f_op->aio_read;
@@ -617,11 +616,11 @@ static ssize_t do_readv_writev(int type,
                fnv = file->f_op->aio_write;
        }
 
-       if (fnv)
+       if (fn)
+               ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
+       else
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-       else
-               ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
 out:
        if (iov != iovstack)

_

Reply via email to