]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: Add support for preadv2
authorRitesh Harjani (IBM) <ritesh.list@gmail.com>
Sat, 15 Mar 2025 08:20:11 +0000 (13:50 +0530)
committerAndrey Albershteyn <aalbersh@kernel.org>
Mon, 31 Mar 2025 08:03:56 +0000 (10:03 +0200)
This patch adds support for preadv2() to xfs_io.

Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
io/Makefile
io/pread.c

index 8f835ec71fd768c81f76efd13cb039854271d744..14a3fe2054f9b5c3f6b150b6cfc79530bcdb71ec 100644 (file)
@@ -66,7 +66,7 @@ LLDLIBS += $(LIBEDITLINE) $(LIBTERMCAP)
 endif
 
 ifeq ($(HAVE_PWRITEV2),yes)
-LCFLAGS += -DHAVE_PWRITEV2
+LCFLAGS += -DHAVE_PWRITEV2 -DHAVE_PREADV2
 endif
 
 ifeq ($(HAVE_MAP_SYNC),yes)
index 62c771fb8e53cd345a1b91dc1f307459a647528d..b314fbc788cdcc212d751de492e10a4e4919080e 100644 (file)
@@ -162,7 +162,8 @@ static ssize_t
 do_preadv(
        int             fd,
        off_t           offset,
-       long long       count)
+       long long       count,
+       int                     preadv2_flags)
 {
        int             vecs = 0;
        ssize_t         oldlen = 0;
@@ -181,8 +182,14 @@ do_preadv(
        } else {
                vecs = vectors;
        }
+#ifdef HAVE_PREADV2
+       if (preadv2_flags)
+               bytes = preadv2(fd, iov, vectors, offset, preadv2_flags);
+       else
+               bytes = preadv(fd, iov, vectors, offset);
+#else
        bytes = preadv(fd, iov, vectors, offset);
-
+#endif
        /* restore trimmed iov */
        if (oldlen)
                iov[vecs - 1].iov_len = oldlen;
@@ -195,12 +202,13 @@ do_pread(
        int             fd,
        off_t           offset,
        long long       count,
-       size_t          buffer_size)
+       size_t          buffer_size,
+       int                     preadv2_flags)
 {
        if (!vectors)
                return pread(fd, io_buffer, min(count, buffer_size), offset);
 
-       return do_preadv(fd, offset, count);
+       return do_preadv(fd, offset, count, preadv2_flags);
 }
 
 static int
@@ -210,7 +218,8 @@ read_random(
        long long       count,
        long long       *total,
        unsigned int    seed,
-       int             eof)
+       int             eof,
+       int             preadv2_flags)
 {
        off_t           end, off, range;
        ssize_t         bytes;
@@ -234,7 +243,7 @@ read_random(
                                io_buffersize;
                else
                        off = offset;
-               bytes = do_pread(fd, off, io_buffersize, io_buffersize);
+               bytes = do_pread(fd, off, io_buffersize, io_buffersize, preadv2_flags);
                if (bytes == 0)
                        break;
                if (bytes < 0) {
@@ -256,7 +265,8 @@ read_backward(
        off_t           *offset,
        long long       *count,
        long long       *total,
-       int             eof)
+       int             eof,
+       int             preadv2_flags)
 {
        off_t           end, off = *offset;
        ssize_t         bytes = 0, bytes_requested;
@@ -276,7 +286,7 @@ read_backward(
        /* Do initial unaligned read if needed */
        if ((bytes_requested = (off % io_buffersize))) {
                off -= bytes_requested;
-               bytes = do_pread(fd, off, bytes_requested, io_buffersize);
+               bytes = do_pread(fd, off, bytes_requested, io_buffersize, preadv2_flags);
                if (bytes == 0)
                        return ops;
                if (bytes < 0) {
@@ -294,7 +304,7 @@ read_backward(
        while (cnt > end) {
                bytes_requested = min(cnt, io_buffersize);
                off -= bytes_requested;
-               bytes = do_pread(fd, off, cnt, io_buffersize);
+               bytes = do_pread(fd, off, cnt, io_buffersize, preadv2_flags);
                if (bytes == 0)
                        break;
                if (bytes < 0) {
@@ -318,14 +328,15 @@ read_forward(
        long long       *total,
        int             verbose,
        int             onlyone,
-       int             eof)
+       int             eof,
+       int             preadv2_flags)
 {
        ssize_t         bytes;
        int             ops = 0;
 
        *total = 0;
        while (count > 0 || eof) {
-               bytes = do_pread(fd, offset, count, io_buffersize);
+               bytes = do_pread(fd, offset, count, io_buffersize, preadv2_flags);
                if (bytes == 0)
                        break;
                if (bytes < 0) {
@@ -353,7 +364,7 @@ read_buffer(
        int             verbose,
        int             onlyone)
 {
-       return read_forward(fd, offset, count, total, verbose, onlyone, 0);
+       return read_forward(fd, offset, count, total, verbose, onlyone, 0, 0);
 }
 
 static int
@@ -371,6 +382,7 @@ pread_f(
        int             Cflag, qflag, uflag, vflag;
        int             eof = 0, direction = IO_FORWARD;
        int             c;
+       int             preadv2_flags = 0;
 
        Cflag = qflag = uflag = vflag = 0;
        init_cvtnum(&fsblocksize, &fssectsize);
@@ -463,15 +475,18 @@ pread_f(
        case IO_RANDOM:
                if (!zeed)      /* srandom seed */
                        zeed = time(NULL);
-               c = read_random(file->fd, offset, count, &total, zeed, eof);
+               c = read_random(file->fd, offset, count, &total, zeed, eof,
+                                               preadv2_flags);
                break;
        case IO_FORWARD:
-               c = read_forward(file->fd, offset, count, &total, vflag, 0, eof);
+               c = read_forward(file->fd, offset, count, &total, vflag, 0, eof,
+                                                preadv2_flags);
                if (eof)
                        count = total;
                break;
        case IO_BACKWARD:
-               c = read_backward(file->fd, &offset, &count, &total, eof);
+               c = read_backward(file->fd, &offset, &count, &total, eof,
+                                                 preadv2_flags);
                break;
        default:
                ASSERT(0);