]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4: Fix an incorrect parameter when calling nfs4_call_sync()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 31 Oct 2025 14:51:42 +0000 (10:51 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 10 Nov 2025 19:30:46 +0000 (14:30 -0500)
The Smatch static checker noted that in _nfs4_proc_lookupp(), the flag
RPC_TASK_TIMEOUT is being passed as an argument to nfs4_init_sequence(),
which is clearly incorrect.
Since LOOKUPP is an idempotent operation, nfs4_init_sequence() should
not ask the server to cache the result. The RPC_TASK_TIMEOUT flag needs
to be passed down to the RPC layer.

Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Reported-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Fixes: 76998ebb9158 ("NFSv4: Observe the NFS_MOUNT_SOFTREVAL flag in _nfs4_proc_lookupp")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/nfs4proc.c

index 411776718494bf72386dce98f03da8fb0cf11122..93c6ce04332b89ac1daec5c56c305c164dc6028c 100644 (file)
@@ -4715,16 +4715,19 @@ static int _nfs4_proc_lookupp(struct inode *inode,
        };
        unsigned short task_flags = 0;
 
-       if (NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL)
+       if (server->flags & NFS_MOUNT_SOFTREVAL)
                task_flags |= RPC_TASK_TIMEOUT;
+       if (server->caps & NFS_CAP_MOVEABLE)
+               task_flags |= RPC_TASK_MOVEABLE;
 
        args.bitmask = nfs4_bitmask(server, fattr->label);
 
        nfs_fattr_init(fattr);
+       nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
 
        dprintk("NFS call  lookupp ino=0x%lx\n", inode->i_ino);
-       status = nfs4_call_sync(clnt, server, &msg, &args.seq_args,
-                               &res.seq_res, task_flags);
+       status = nfs4_do_call_sync(clnt, server, &msg, &args.seq_args,
+                                  &res.seq_res, task_flags);
        dprintk("NFS reply lookupp: %d\n", status);
        return status;
 }