Commit c036f7da authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'nfs-for-5.2-3' of git://git.linux-nfs.org/projects/anna/linux-nfs

Pull more NFS client fixes from Anna Schumaker:
 "These are mostly refcounting issues that people have found recently.
  The revert fixes a suspend recovery performance issue.

   - SUNRPC: Fix a credential refcount leak

   - Revert "SUNRPC: Declare RPC timers as TIMER_DEFERRABLE"

   - SUNRPC: Fix xps refcount imbalance on the error path

   - NFS4: Only set creation opendata if O_CREAT"

* tag 'nfs-for-5.2-3' of git://git.linux-nfs.org/projects/anna/linux-nfs:
  SUNRPC: Fix a credential refcount leak
  Revert "SUNRPC: Declare RPC timers as TIMER_DEFERRABLE"
  net :sunrpc :clnt :Fix xps refcount imbalance on the error path
  NFS4: Only set creation opendata if O_CREAT
parents ff17bbe0 19d55046
...@@ -1256,10 +1256,20 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, ...@@ -1256,10 +1256,20 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
atomic_inc(&sp->so_count); atomic_inc(&sp->so_count);
p->o_arg.open_flags = flags; p->o_arg.open_flags = flags;
p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE); p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE);
p->o_arg.umask = current_umask();
p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim); p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim);
p->o_arg.share_access = nfs4_map_atomic_open_share(server, p->o_arg.share_access = nfs4_map_atomic_open_share(server,
fmode, flags); fmode, flags);
if (flags & O_CREAT) {
p->o_arg.umask = current_umask();
p->o_arg.label = nfs4_label_copy(p->a_label, label);
if (c->sattr != NULL && c->sattr->ia_valid != 0) {
p->o_arg.u.attrs = &p->attrs;
memcpy(&p->attrs, c->sattr, sizeof(p->attrs));
memcpy(p->o_arg.u.verifier.data, c->verf,
sizeof(p->o_arg.u.verifier.data));
}
}
/* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS /* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS
* will return permission denied for all bits until close */ * will return permission denied for all bits until close */
if (!(flags & O_EXCL)) { if (!(flags & O_EXCL)) {
...@@ -1283,7 +1293,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, ...@@ -1283,7 +1293,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
p->o_arg.server = server; p->o_arg.server = server;
p->o_arg.bitmask = nfs4_bitmask(server, label); p->o_arg.bitmask = nfs4_bitmask(server, label);
p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0]; p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0];
p->o_arg.label = nfs4_label_copy(p->a_label, label);
switch (p->o_arg.claim) { switch (p->o_arg.claim) {
case NFS4_OPEN_CLAIM_NULL: case NFS4_OPEN_CLAIM_NULL:
case NFS4_OPEN_CLAIM_DELEGATE_CUR: case NFS4_OPEN_CLAIM_DELEGATE_CUR:
...@@ -1296,13 +1305,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, ...@@ -1296,13 +1305,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
case NFS4_OPEN_CLAIM_DELEG_PREV_FH: case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
p->o_arg.fh = NFS_FH(d_inode(dentry)); p->o_arg.fh = NFS_FH(d_inode(dentry));
} }
if (c != NULL && c->sattr != NULL && c->sattr->ia_valid != 0) {
p->o_arg.u.attrs = &p->attrs;
memcpy(&p->attrs, c->sattr, sizeof(p->attrs));
memcpy(p->o_arg.u.verifier.data, c->verf,
sizeof(p->o_arg.u.verifier.data));
}
p->c_arg.fh = &p->o_res.fh; p->c_arg.fh = &p->o_res.fh;
p->c_arg.stateid = &p->o_res.stateid; p->c_arg.stateid = &p->o_res.stateid;
p->c_arg.seqid = p->o_arg.seqid; p->c_arg.seqid = p->o_arg.seqid;
......
...@@ -634,7 +634,6 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args, ...@@ -634,7 +634,6 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args,
new->cl_discrtry = clnt->cl_discrtry; new->cl_discrtry = clnt->cl_discrtry;
new->cl_chatty = clnt->cl_chatty; new->cl_chatty = clnt->cl_chatty;
new->cl_principal = clnt->cl_principal; new->cl_principal = clnt->cl_principal;
new->cl_cred = get_cred(clnt->cl_cred);
return new; return new;
out_err: out_err:
...@@ -2805,6 +2804,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, ...@@ -2805,6 +2804,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt,
xprt = xprt_iter_xprt(&clnt->cl_xpi); xprt = xprt_iter_xprt(&clnt->cl_xpi);
if (xps == NULL || xprt == NULL) { if (xps == NULL || xprt == NULL) {
rcu_read_unlock(); rcu_read_unlock();
xprt_switch_put(xps);
return -EAGAIN; return -EAGAIN;
} }
resvport = xprt->resvport; resvport = xprt->resvport;
......
...@@ -250,9 +250,7 @@ static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const c ...@@ -250,9 +250,7 @@ static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const c
queue->maxpriority = nr_queues - 1; queue->maxpriority = nr_queues - 1;
rpc_reset_waitqueue_priority(queue); rpc_reset_waitqueue_priority(queue);
queue->qlen = 0; queue->qlen = 0;
timer_setup(&queue->timer_list.timer, timer_setup(&queue->timer_list.timer, __rpc_queue_timer_fn, 0);
__rpc_queue_timer_fn,
TIMER_DEFERRABLE);
INIT_LIST_HEAD(&queue->timer_list.list); INIT_LIST_HEAD(&queue->timer_list.list);
rpc_assign_waitqueue_name(queue, qname); rpc_assign_waitqueue_name(queue, qname);
} }
......
...@@ -1876,9 +1876,7 @@ struct rpc_xprt *xprt_create_transport(struct xprt_create *args) ...@@ -1876,9 +1876,7 @@ struct rpc_xprt *xprt_create_transport(struct xprt_create *args)
xprt->idle_timeout = 0; xprt->idle_timeout = 0;
INIT_WORK(&xprt->task_cleanup, xprt_autoclose); INIT_WORK(&xprt->task_cleanup, xprt_autoclose);
if (xprt_has_timer(xprt)) if (xprt_has_timer(xprt))
timer_setup(&xprt->timer, timer_setup(&xprt->timer, xprt_init_autodisconnect, 0);
xprt_init_autodisconnect,
TIMER_DEFERRABLE);
else else
timer_setup(&xprt->timer, NULL, 0); timer_setup(&xprt->timer, NULL, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment