NFSv4: Fix a hang in OPEN related to server reboot
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 15 Apr 2017 23:20:01 +0000 (19:20 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 20 Apr 2017 18:12:57 +0000 (14:12 -0400)
If the server fails to return the attributes as part of an OPEN
reply, and then reboots, we can end up hanging. The reason is that
the client attempts to send a GETATTR in order to pick up the
missing OPEN call, but fails to release the slot first, causing
reboot recovery to deadlock.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Fixes: 2e80dbe7ac51a ("NFSv4.1: Close callback races for OPEN, LAYOUTGET...")
Cc: stable@vger.kernel.org # v4.8+
fs/nfs/nfs4proc.c

index 4e52ac773d1f531d2b2128db3a554968c5f1a6d6..6e9ff2d9a5bf5cf7db104e1e952a12c3e823834d 100644 (file)
@@ -2300,8 +2300,10 @@ static int _nfs4_proc_open(struct nfs4_opendata *data)
                if (status != 0)
                        return status;
        }
-       if (!(o_res->f_attr->valid & NFS_ATTR_FATTR))
+       if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
+               nfs4_sequence_free_slot(&o_res->seq_res);
                nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr, o_res->f_label);
+       }
        return 0;
 }