More NFS client fixes for Linux 5.2
Bugfixes: - 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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEnZ5MQTpR7cLU7KEp18tUv7ClQOsFAl0NMHQACgkQ18tUv7Cl QOujAw//bL4p0ADvCSglqO0ceZcHpHuQVhj10f+tyXfkq3R7WDQmP2qok/+6uZjk rYxWh6nCqQqTBSmstf4ouLMjdQTk+zDQf38zSSWGPW0U6rCX4kl/yOyskBriYqnf W4U5+hOCvQ8prKdkcjbhYqdvz6qT9bhc5X7kHgtD66CtvyzUDraYw04Mojzodl91 CPV97rDZbiHBAgZPBFKF+qoTXEL7hQlHUREcR/DZBLV3qrMBsraog1T1OpWRGev0 OAxVAwZyXFcWDFm7mFcItMA4WcUnZbL77gPNtvZSfgYPxHsytHfH8KOmEG7zP5Yy +blko41nvNR2UVOPQ/zTvWj9pkuHQlacDUrlYdgnOmHuGhufj1/xx4Z5C2dkTTnp ufjcVXJOqZE7lWyA4IOWapc7gLM3q6I8sUR9w5nLc1meYphNAqHZgK0fTgfbMoo7 JweUBcgGmNvkMpkX561HBe16ENKvcgQQp666VsnTTI/BPZ/BBdlayKGBbxA3j22F znF4gwznvQ0jVxtlNsibzSwM8GQbc6UM5fGPM+atlPJEzban0waQaIbCW347DViZ fTXP2NQmvH1x+YNgx6RTRwVBWWT02u/ijQHf7+NvwWLWTKb9OXwQVjlnWHu/E/Qi MpNXxtBTT6y+DG09VNV9CYwmAsULnlRQWe9RNBfMz+4sjLCyIjg= =+z30 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
c036f7dabc
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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
|
||||||
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 @@ found:
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue