]> Git Repo - linux.git/commitdiff
Merge tag 'nfs-for-5.9-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
authorLinus Torvalds <[email protected]>
Wed, 9 Sep 2020 18:14:20 +0000 (11:14 -0700)
committerLinus Torvalds <[email protected]>
Wed, 9 Sep 2020 18:14:20 +0000 (11:14 -0700)
Pull NFS client bugfixes from Trond Myklebust:

 - Fix an NFS/RDMA resource leak

 - Fix the error handling during delegation recall

 - NFSv4.0 needs to return the delegation on a zero-stateid SETATTR

 - Stop printk reading past end of string

* tag 'nfs-for-5.9-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs:
  SUNRPC: stop printk reading past end of string
  NFS: Zero-stateid SETATTR should first return delegation
  NFSv4.1 handle ERR_DELAY error reclaiming locking state on delegation recall
  xprtrdma: Release in-flight MRs on disconnect

1  2 
fs/nfs/nfs4proc.c
net/sunrpc/xprtrdma/verbs.c

diff --combined fs/nfs/nfs4proc.c
index f8946b9468ef08ce745799ee77d913eb820f782f,3e824110b47038b733e043f8ad5616eddc4d11ca..6e95c85fe395a88b0c93f75a17bfc8c76bcbbbde
@@@ -483,7 -483,7 +483,7 @@@ static int nfs4_do_handle_exception(str
                                                stateid);
                                goto wait_on_recovery;
                        }
 -                      /* Fall through */
 +                      fallthrough;
                case -NFS4ERR_OPENMODE:
                        if (inode) {
                                int err;
                                ret = -EBUSY;
                                break;
                        }
 -                      /* Fall through */
 +                      fallthrough;
                case -NFS4ERR_DELAY:
                        nfs_inc_server_stats(server, NFSIOS_DELAY);
 -                      /* Fall through */
 +                      fallthrough;
                case -NFS4ERR_GRACE:
                case -NFS4ERR_LAYOUTTRYLATER:
                case -NFS4ERR_RECALLCONFLICT:
@@@ -1505,7 -1505,7 +1505,7 @@@ static int can_open_delegated(struct nf
        case NFS4_OPEN_CLAIM_PREVIOUS:
                if (!test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
                        break;
 -              /* Fall through */
 +              fallthrough;
        default:
                return 0;
        }
@@@ -2439,7 -2439,7 +2439,7 @@@ static void nfs4_open_prepare(struct rp
        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
        case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
                data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
 -              /* Fall through */
 +              fallthrough;
        case NFS4_OPEN_CLAIM_FH:
                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
        }
@@@ -3293,8 -3293,10 +3293,10 @@@ static int _nfs4_do_setattr(struct inod
  
        /* Servers should only apply open mode checks for file size changes */
        truncate = (arg->iap->ia_valid & ATTR_SIZE) ? true : false;
-       if (!truncate)
+       if (!truncate) {
+               nfs4_inode_make_writeable(inode);
                goto zero_stateid;
+       }
  
        if (nfs4_copy_delegation_stateid(inode, FMODE_WRITE, &arg->stateid, &delegation_cred)) {
                /* Use that stateid */
@@@ -3545,11 -3547,11 +3547,11 @@@ static void nfs4_close_done(struct rpc_
                        nfs4_free_revoked_stateid(server,
                                        &calldata->arg.stateid,
                                        task->tk_msg.rpc_cred);
 -                      /* Fallthrough */
 +                      fallthrough;
                case -NFS4ERR_BAD_STATEID:
                        if (calldata->arg.fmode == 0)
                                break;
 -                      /* Fallthrough */
 +                      fallthrough;
                default:
                        task->tk_status = nfs4_async_handle_exception(task,
                                        server, task->tk_status, &exception);
@@@ -6294,7 -6296,7 +6296,7 @@@ static void nfs4_delegreturn_done(struc
                nfs4_free_revoked_stateid(data->res.server,
                                data->args.stateid,
                                task->tk_msg.rpc_cred);
 -              /* Fallthrough */
 +              fallthrough;
        case -NFS4ERR_BAD_STATEID:
        case -NFS4ERR_STALE_STATEID:
        case -ETIMEDOUT:
                        data->res.fattr = NULL;
                        goto out_restart;
                }
 -              /* Fallthrough */
 +              fallthrough;
        default:
                task->tk_status = nfs4_async_handle_exception(task,
                                data->res.server, task->tk_status,
@@@ -6622,13 -6624,13 +6624,13 @@@ static void nfs4_locku_done(struct rpc_
                        if (nfs4_update_lock_stateid(calldata->lsp,
                                        &calldata->res.stateid))
                                break;
 -                      /* Fall through */
 +                      fallthrough;
                case -NFS4ERR_ADMIN_REVOKED:
                case -NFS4ERR_EXPIRED:
                        nfs4_free_revoked_stateid(calldata->server,
                                        &calldata->arg.stateid,
                                        task->tk_msg.rpc_cred);
 -                      /* Fall through */
 +                      fallthrough;
                case -NFS4ERR_BAD_STATEID:
                case -NFS4ERR_STALE_STATEID:
                        if (nfs4_sync_lock_stateid(&calldata->arg.stateid,
@@@ -7298,7 -7300,12 +7300,12 @@@ int nfs4_lock_delegation_recall(struct 
        err = nfs4_set_lock_state(state, fl);
        if (err != 0)
                return err;
-       err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
+       do {
+               err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
+               if (err != -NFS4ERR_DELAY)
+                       break;
+               ssleep(1);
+       } while (err == -NFS4ERR_DELAY);
        return nfs4_handle_delegation_recall_error(server, state, stateid, fl, err);
  }
  
@@@ -8665,7 -8672,7 +8672,7 @@@ static void nfs4_get_lease_time_done(st
                dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
                rpc_delay(task, NFS4_POLL_RETRY_MIN);
                task->tk_status = 0;
 -              /* fall through */
 +              fallthrough;
        case -NFS4ERR_RETRY_UNCACHED_REP:
                rpc_restart_call_prepare(task);
                return;
@@@ -9113,13 -9120,13 +9120,13 @@@ static int nfs41_reclaim_complete_handl
        switch(task->tk_status) {
        case 0:
                wake_up_all(&clp->cl_lock_waitq);
 -              /* Fallthrough */
 +              fallthrough;
        case -NFS4ERR_COMPLETE_ALREADY:
        case -NFS4ERR_WRONG_CRED: /* What to do here? */
                break;
        case -NFS4ERR_DELAY:
                rpc_delay(task, NFS4_POLL_RETRY_MAX);
 -              /* fall through */
 +              fallthrough;
        case -NFS4ERR_RETRY_UNCACHED_REP:
                return -EAGAIN;
        case -NFS4ERR_BADSESSION:
@@@ -9434,10 -9441,10 +9441,10 @@@ static void nfs4_layoutreturn_done(stru
                                        &lrp->args.range,
                                        lrp->args.inode))
                        goto out_restart;
 -              /* Fallthrough */
 +              fallthrough;
        default:
                task->tk_status = 0;
 -              /* Fallthrough */
 +              fallthrough;
        case 0:
                break;
        case -NFS4ERR_DELAY:
index 3f86d039875c9778b1fa7a29f019ae03e3f07a61,ca89f24a1590b46b355b46a27ac707cd5fa83a55..ad6e2e4994ce8edd52b920976a27f3bc8ffc0d2c
@@@ -268,7 -268,7 +268,7 @@@ rpcrdma_cm_event_handler(struct rdma_cm
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                pr_info("rpcrdma: removing device %s for %pISpc\n",
                        ep->re_id->device->name, sap);
 -              /* fall through */
 +              fallthrough;
        case RDMA_CM_EVENT_ADDR_CHANGE:
                ep->re_connect_status = -ENODEV;
                goto disconnected;
@@@ -933,6 -933,8 +933,8 @@@ static void rpcrdma_req_reset(struct rp
  
        rpcrdma_regbuf_dma_unmap(req->rl_sendbuf);
        rpcrdma_regbuf_dma_unmap(req->rl_recvbuf);
+       frwr_reset(req);
  }
  
  /* ASSUMPTION: the rb_allreqs list is stable for the duration,
This page took 0.135899 seconds and 4 git commands to generate.