pNFS: Ensure nfs4_layoutget_prepare returns the correct error
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 28 Dec 2015 15:32:11 +0000 (10:32 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 28 Dec 2015 19:33:03 +0000 (14:33 -0500)
If we're unable to perform the layoutget due to an invalid open stateid
or a bulk recall, ensure that we return the error so that the caller
can decide on an appropriate action.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c

index 18d862db15b63a5bed507b6a03e74be64ee16bdb..fcd7a9039020d87c0c1727a5c8d118b2ff8b1d08 100644 (file)
@@ -7760,6 +7760,7 @@ nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
        struct nfs4_layoutget *lgp = calldata;
        struct nfs_server *server = NFS_SERVER(lgp->args.inode);
        struct nfs4_session *session = nfs4_get_session(server);
+       int ret;
 
        dprintk("--> %s\n", __func__);
        /* Note the is a race here, where a CB_LAYOUTRECALL can come in
@@ -7770,12 +7771,12 @@ nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
        if (nfs41_setup_sequence(session, &lgp->args.seq_args,
                                &lgp->res.seq_res, task))
                return;
-       if (pnfs_choose_layoutget_stateid(&lgp->args.stateid,
+       ret = pnfs_choose_layoutget_stateid(&lgp->args.stateid,
                                          NFS_I(lgp->args.inode)->layout,
                                          &lgp->args.range,
-                                         lgp->args.ctx->state)) {
-               rpc_exit(task, NFS4_OK);
-       }
+                                         lgp->args.ctx->state);
+       if (ret < 0)
+               rpc_exit(task, ret);
 }
 
 static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)