NFS: Fix nfs_direct_write_reschedule_io()
authorTrond Myklebust <trondmy@gmail.com>
Mon, 6 Jan 2020 20:25:14 +0000 (15:25 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 15 Jan 2020 15:54:33 +0000 (10:54 -0500)
The 'hdr->good_bytes' is defined as the number of bytes we expect to
read or write starting at offset hdr->io_start. In the case of a partial
read/write we may end up adjusting hdr->args.offset and hdr->args.count
to skip I/O for data that was already read/written, and so we must ensure
the calculation takes that into account.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/direct.c

index 29f00da..b768a0b 100644 (file)
@@ -824,7 +824,8 @@ static void nfs_direct_write_reschedule_io(struct nfs_pgio_header *hdr)
                dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
                /* fake unstable write to let common nfs resend pages */
                hdr->verf.committed = NFS_UNSTABLE;
-               hdr->good_bytes = hdr->args.count;
+               hdr->good_bytes = hdr->args.offset + hdr->args.count -
+                       hdr->io_start;
        }
        spin_unlock(&dreq->lock);
 }