On Sun, 17 Sep 2006 22:39:07 +0400 "Vladimir V. Saveliev" <[EMAIL PROTECTED]> wrote:
> 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) > > _ OK, thanks. I'll wait to hear from Badari and Christoph on that.