FAILED: patch "[PATCH] NFS: Ensure O_DIRECT reports an error if the bytes" failed to apply to 4.14-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From eb2c50da9e256dbbb3ff27694440e4c1900cfef8 Mon Sep 17 00:00:00 2001
From: Trond Myklebust <[email protected]>
Date: Mon, 12 Aug 2019 18:04:36 -0400
Subject: [PATCH] NFS: Ensure O_DIRECT reports an error if the bytes
read/written is 0
If the attempt to resend the I/O results in no bytes being read/written, we must ensure that we report the error.
Signed-off-by Trond Myklebust <[email protected]>
Fixes 0a00b77b331a ("nfs: mirroring support for direct io")
Cc [email protected] # v3.20+
fs/nfs/direct.c +18 -9
@@ -401,15 +401,21 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)unsigned long bytes =0 ;struct nfs_direct_req *dreq = hdr->dreq; -if (test_bit (NFS_IOHDR_REDO , &hdr->flags)) - goto out_put; -spin_lock (&dreq->lock); -if (test_bit (NFS_IOHDR_ERROR , &hdr->flags) && (hdr->good_bytes ==0 )) +if (test_bit (NFS_IOHDR_ERROR , &hdr->flags)) dreq->error = hdr->error; -else + +if (test_bit (NFS_IOHDR_REDO , &hdr->flags)) { +spin_unlock (&dreq->lock); + goto out_put; + } + +if (hdr->good_bytes !=0 )nfs_direct_good_bytes (dreq, hdr); +if (test_bit (NFS_IOHDR_EOF , &hdr->flags)) + dreq->error =0 ; +spin_unlock (&dreq->lock);while (!list_empty (&hdr->pages)) {
@@ -782,16 +788,19 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)bool request_commit = false;struct nfs_page *req =nfs_list_entry (hdr->pages.next); -if (test_bit (NFS_IOHDR_REDO , &hdr->flags)) - goto out_put; -nfs_init_cinfo_from_dreq (&cinfo, dreq);spin_lock (&dreq->lock);if (test_bit (NFS_IOHDR_ERROR , &hdr->flags)) dreq->error = hdr->error; -if (dreq->error ==0 ) { + +if (test_bit (NFS_IOHDR_REDO , &hdr->flags)) { +spin_unlock (&dreq->lock); + goto out_put; + } + +if (hdr->good_bytes !=0 ) {nfs_direct_good_bytes (dreq, hdr);if (nfs_write_need_commit (hdr)) {if (dreq->flags ==NFS_ODIRECT_RESCHED_WRITES )
fs/nfs/pagelist.c +1 -0
@@ -1266,6 +1266,7 @@ int nfs_pageio_resend(struct nfs_pageio_descriptor *desc,if (!list_empty (&pages)) {int err = desc->pg_error <0 ? desc->pg_error : -EIO ; hdr->completion_ops->error_cleanup (&pages, err); +nfs_set_pgio_error (hdr, err, hdr->io_start);return err; }return 0 ;