]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - fs/nfs/nfs4proc.c
Merge tag 'nfs-for-6.9-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[thirdparty/linux.git] / fs / nfs / nfs4proc.c
index 815996cb27fc4589bed01827c086b32e766f0bc0..ea390db94b622f5332f5126ea15f95bc8131344e 100644 (file)
@@ -3069,10 +3069,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
        fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx);
        struct inode *dir = d_inode(opendata->dir);
        unsigned long dir_verifier;
-       unsigned int seq;
        int ret;
 
-       seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
        dir_verifier = nfs_save_change_attribute(dir);
 
        ret = _nfs4_proc_open(opendata, ctx);
@@ -3125,11 +3123,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
        if (ret != 0)
                goto out;
 
-       if (d_inode(dentry) == state->inode) {
+       if (d_inode(dentry) == state->inode)
                nfs_inode_attach_open_context(ctx);
-               if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
-                       nfs4_schedule_stateid_recovery(server, state);
-       }
 
 out:
        if (!opendata->cancelled) {
@@ -8973,10 +8968,12 @@ try_again:
                return;
 
        status = task->tk_status;
-       if (status == 0)
+       if (status == 0) {
                status = nfs4_detect_session_trunking(adata->clp,
                                task->tk_msg.rpc_resp, xprt);
-
+               trace_nfs4_trunked_exchange_id(adata->clp,
+                       xprt->address_strings[RPC_DISPLAY_ADDR], status);
+       }
        if (status == 0)
                rpc_clnt_xprt_switch_add_xprt(clnt, xprt);
        else if (status != -NFS4ERR_DELAY && rpc_clnt_xprt_switch_has_addr(clnt,
@@ -10618,29 +10615,33 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {
 static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
 {
        ssize_t error, error2, error3;
+       size_t left = size;
 
-       error = generic_listxattr(dentry, list, size);
+       error = generic_listxattr(dentry, list, left);
        if (error < 0)
                return error;
        if (list) {
                list += error;
-               size -= error;
+               left -= error;
        }
 
-       error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
+       error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, left);
        if (error2 < 0)
                return error2;
 
        if (list) {
                list += error2;
-               size -= error2;
+               left -= error2;
        }
 
-       error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, size);
+       error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, left);
        if (error3 < 0)
                return error3;
 
-       return error + error2 + error3;
+       error += error2 + error3;
+       if (size && error > size)
+               return -ERANGE;
+       return error;
 }
 
 static void nfs4_enable_swap(struct inode *inode)