On Mon, Mar 16, 2015 at 02:34:22PM -0400, Milosz Tanski wrote: > preadv2 is a new syscall introduced that is like preadv2 but with flag > argument. The first use case of this is to let us add a flag to perform a > non-blocking file using the page cache. > --- > src/Makefile | 2 +- > src/preadv2-pwritev2.h | 52 +++++++++++++++++ > src/preadv2.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++ You should add this syscall to support to xfs_io (in the xfsprogs package) rather than write a new helper for it. Mainly because: > +void > +usage(char *prog) > +{ > + fprintf(stderr, "Usage: %s [-v] [-ctdw] [-n] -p POS -l LEN <filename>\n\n", prog); > + fprintf(stderr, "General arguments:\n"); > + fprintf(stderr, " -v Verify that the syscall is supported and quit:\n"); > + fprintf(stderr, "\n"); > + fprintf(stderr, "Open arguments:\n"); > + fprintf(stderr, " -c Open file with O_CREAT flag\n"); > + fprintf(stderr, " -t Open file with O_TRUNC flag\n"); > + fprintf(stderr, " -d Open file with O_DIRECT flag\n"); > + fprintf(stderr, " -w Open file with O_RDWR flag vs O_RDONLY (default)\n"); > + fprintf(stderr, "\n"); > + fprintf(stderr, "preadv2 arguments:\n"); > + fprintf(stderr, " -n use RWF_NONBLOCK when performing read\n"); > + fprintf(stderr, " -p POS offset file to read at\n"); > + fprintf(stderr, " -l LEN length of file data to read\n"); The xfs_io pread command already supports all of these functions except for the RWF_NONBLOCK flag, and anyone testing bleeding edge functionality is also using a bleeding edge xfs_io binary. Then you test for whether the functionality is available via _require_xfs_io_command "preadv -n" ..... > +# test file we'll be using > +file=$SCRATCH_MNT/067.preadv2.$$ > + > +# Create a file: > +# two regions of data and a hole in the middle > +# use O_DIRECT so it's not in the page cache > +echo "create file" > +$XFS_IO_PROG -t -f -d \ > + -c "pwrite 0 1024" \ > + -c "pwrite 2048 1024" \ > + $file > /dev/null This does not create holes on most filesystems. You'll need to leave holes of up 64k so that 64k block size filesystem end up with single block holes in them. > +# Make sure it returns EAGAIN on uncached data > +echo "uncached" > +$here/src/preadv2 -n -p 0 -l 1024 $file $XFS_IO_PROG -c "pread -n 0 1024" $file | _filter_xfs_io > + > +# Make sure we read in the whole file, after that RWF_NONBLOCK should return us all the data > +echo "cached" > +$XFS_IO_PROG -f $file -c "pread 0 4096" $file > /dev/null > +$here/src/preadv2 -n -p 0 -l 1024 $file $XFS_IO_PROG -c "pread 0 4096" -c "pread -n 0 1024" $file | _filter_xfs_io > + > +# O_DIRECT and RWF_NONBLOCK should return EAGAIN always > +echo "O_DIRECT" > +$here/src/preadv2 -d -n -p 0 -l 1024 $file $XFS_IO_PROG -d -c "pread -n 0 1024" $file | _filter_xfs_io And so on.... Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html