Merge tag 'nfs-for-4.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust: "Highlights include: Stable bugfixes: - Fix use after free in write error path - Use GFP_NOIO for two allocations in writeback - Fix a hang in OPEN related to server reboot - Check the result of nfs4_pnfs_ds_connect - Fix an rcu lock leak Features: - Removal of the unmaintained and unused OSD pNFS layout - Cleanup and removal of lots of unnecessary dprintk()s - Cleanup and removal of some memory failure paths now that GFP_NOFS is guaranteed to never fail. - Remove the v3-only data server limitation on pNFS/flexfiles Bugfixes: - RPC/RDMA connection handling bugfixes - Copy offload: fixes to ensure the copied data is COMMITed to disk. - Readdir: switch back to using the ->iterate VFS interface - File locking fixes from Ben Coddington - Various use-after-free and deadlock issues in pNFS - Write path bugfixes" * tag 'nfs-for-4.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (89 commits) pNFS/flexfiles: Always attempt to call layoutstats when flexfiles is enabled NFSv4.1: Work around a Linux server bug... NFS append COMMIT after synchronous COPY NFSv4: Fix exclusive create attributes encoding NFSv4: Fix an rcu lock leak nfs: use kmap/kunmap directly NFS: always treat the invocation of nfs_getattr as cache hit when noac is on Fix nfs_client refcounting if kmalloc fails in nfs4_proc_exchange_id and nfs4_proc_async_renew NFSv4.1: RECLAIM_COMPLETE must handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION pNFS: Fix NULL dereference in pnfs_generic_alloc_ds_commits pNFS: Fix a typo in pnfs_generic_alloc_ds_commits pNFS: Fix a deadlock when coalescing writes and returning the layout pNFS: Don't clear the layout return info if there are segments to return pNFS: Ensure we commit the layout if it has been invalidated pNFS: Don't send COMMITs to the DSes if the server invalidated our layout pNFS/flexfiles: Fix up the ff_layout_write_pagelist failure path pNFS: Ensure we check layout validity before marking it for return NFS4.1 handle interrupted slot reuse from ERR_DELAY NFSv4: check return value of xdr_inline_decode nfs/filelayout: fix NULL pointer dereference in fl_pnfs_update_layout() ...
This commit is contained in:
@@ -218,6 +218,7 @@ static void nfs_cb_idr_remove_locked(struct nfs_client *clp)
|
||||
static void pnfs_init_server(struct nfs_server *server)
|
||||
{
|
||||
rpc_init_wait_queue(&server->roc_rpcwaitq, "pNFS ROC");
|
||||
rpc_init_wait_queue(&server->uoc_rpcwaitq, "NFS UOC");
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -240,8 +241,6 @@ static void pnfs_init_server(struct nfs_server *server)
|
||||
*/
|
||||
void nfs_free_client(struct nfs_client *clp)
|
||||
{
|
||||
dprintk("--> nfs_free_client(%u)\n", clp->rpc_ops->version);
|
||||
|
||||
nfs_fscache_release_client_cookie(clp);
|
||||
|
||||
/* -EIO all pending I/O */
|
||||
@@ -256,8 +255,6 @@ void nfs_free_client(struct nfs_client *clp)
|
||||
kfree(clp->cl_hostname);
|
||||
kfree(clp->cl_acceptor);
|
||||
kfree(clp);
|
||||
|
||||
dprintk("<-- nfs_free_client()\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_free_client);
|
||||
|
||||
@@ -271,7 +268,6 @@ void nfs_put_client(struct nfs_client *clp)
|
||||
if (!clp)
|
||||
return;
|
||||
|
||||
dprintk("--> nfs_put_client({%d})\n", atomic_read(&clp->cl_count));
|
||||
nn = net_generic(clp->cl_net, nfs_net_id);
|
||||
|
||||
if (atomic_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) {
|
||||
@@ -382,9 +378,6 @@ nfs_found_client(const struct nfs_client_initdata *cl_init,
|
||||
}
|
||||
|
||||
smp_rmb();
|
||||
|
||||
dprintk("<-- %s found nfs_client %p for %s\n",
|
||||
__func__, clp, cl_init->hostname ?: "");
|
||||
return clp;
|
||||
}
|
||||
|
||||
@@ -403,9 +396,6 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dprintk("--> nfs_get_client(%s,v%u)\n",
|
||||
cl_init->hostname, rpc_ops->version);
|
||||
|
||||
/* see if the client already exists */
|
||||
do {
|
||||
spin_lock(&nn->nfs_client_lock);
|
||||
@@ -430,8 +420,6 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
|
||||
new = rpc_ops->alloc_client(cl_init);
|
||||
} while (!IS_ERR(new));
|
||||
|
||||
dprintk("<-- nfs_get_client() Failed to find %s (%ld)\n",
|
||||
cl_init->hostname, PTR_ERR(new));
|
||||
return new;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_get_client);
|
||||
@@ -558,6 +546,7 @@ static int nfs_start_lockd(struct nfs_server *server)
|
||||
.noresvport = server->flags & NFS_MOUNT_NORESVPORT ?
|
||||
1 : 0,
|
||||
.net = clp->cl_net,
|
||||
.nlmclnt_ops = clp->cl_nfs_mod->rpc_ops->nlmclnt_ops,
|
||||
};
|
||||
|
||||
if (nlm_init.nfs_version > 3)
|
||||
@@ -624,27 +613,21 @@ struct nfs_client *nfs_init_client(struct nfs_client *clp,
|
||||
{
|
||||
int error;
|
||||
|
||||
if (clp->cl_cons_state == NFS_CS_READY) {
|
||||
/* the client is already initialised */
|
||||
dprintk("<-- nfs_init_client() = 0 [already %p]\n", clp);
|
||||
/* the client is already initialised */
|
||||
if (clp->cl_cons_state == NFS_CS_READY)
|
||||
return clp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a client RPC handle for doing FSSTAT with UNIX auth only
|
||||
* - RFC 2623, sec 2.3.2
|
||||
*/
|
||||
error = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_UNIX);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
nfs_mark_client_ready(clp, NFS_CS_READY);
|
||||
nfs_mark_client_ready(clp, error == 0 ? NFS_CS_READY : error);
|
||||
if (error < 0) {
|
||||
nfs_put_client(clp);
|
||||
clp = ERR_PTR(error);
|
||||
}
|
||||
return clp;
|
||||
|
||||
error:
|
||||
nfs_mark_client_ready(clp, error);
|
||||
nfs_put_client(clp);
|
||||
dprintk("<-- nfs_init_client() = xerror %d\n", error);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_init_client);
|
||||
|
||||
@@ -668,8 +651,6 @@ static int nfs_init_server(struct nfs_server *server,
|
||||
struct nfs_client *clp;
|
||||
int error;
|
||||
|
||||
dprintk("--> nfs_init_server()\n");
|
||||
|
||||
nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
|
||||
data->timeo, data->retrans);
|
||||
if (data->flags & NFS_MOUNT_NORESVPORT)
|
||||
@@ -677,10 +658,8 @@ static int nfs_init_server(struct nfs_server *server,
|
||||
|
||||
/* Allocate or find a client reference we can use */
|
||||
clp = nfs_get_client(&cl_init);
|
||||
if (IS_ERR(clp)) {
|
||||
dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp));
|
||||
if (IS_ERR(clp))
|
||||
return PTR_ERR(clp);
|
||||
}
|
||||
|
||||
server->nfs_client = clp;
|
||||
|
||||
@@ -725,13 +704,11 @@ static int nfs_init_server(struct nfs_server *server,
|
||||
server->mountd_protocol = data->mount_server.protocol;
|
||||
|
||||
server->namelen = data->namlen;
|
||||
dprintk("<-- nfs_init_server() = 0 [new %p]\n", clp);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
server->nfs_client = NULL;
|
||||
nfs_put_client(clp);
|
||||
dprintk("<-- nfs_init_server() = xerror %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -798,12 +775,10 @@ int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs
|
||||
struct nfs_client *clp = server->nfs_client;
|
||||
int error;
|
||||
|
||||
dprintk("--> nfs_probe_fsinfo()\n");
|
||||
|
||||
if (clp->rpc_ops->set_capabilities != NULL) {
|
||||
error = clp->rpc_ops->set_capabilities(server, mntfh);
|
||||
if (error < 0)
|
||||
goto out_error;
|
||||
return error;
|
||||
}
|
||||
|
||||
fsinfo.fattr = fattr;
|
||||
@@ -811,7 +786,7 @@ int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs
|
||||
memset(fsinfo.layouttype, 0, sizeof(fsinfo.layouttype));
|
||||
error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo);
|
||||
if (error < 0)
|
||||
goto out_error;
|
||||
return error;
|
||||
|
||||
nfs_server_set_fsinfo(server, &fsinfo);
|
||||
|
||||
@@ -826,12 +801,7 @@ int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs
|
||||
server->namelen = pathinfo.max_namelen;
|
||||
}
|
||||
|
||||
dprintk("<-- nfs_probe_fsinfo() = 0\n");
|
||||
return 0;
|
||||
|
||||
out_error:
|
||||
dprintk("nfs_probe_fsinfo: error = %d\n", -error);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_probe_fsinfo);
|
||||
|
||||
@@ -927,8 +897,6 @@ EXPORT_SYMBOL_GPL(nfs_alloc_server);
|
||||
*/
|
||||
void nfs_free_server(struct nfs_server *server)
|
||||
{
|
||||
dprintk("--> nfs_free_server()\n");
|
||||
|
||||
nfs_server_remove_lists(server);
|
||||
|
||||
if (server->destroy != NULL)
|
||||
@@ -946,7 +914,6 @@ void nfs_free_server(struct nfs_server *server)
|
||||
nfs_free_iostats(server->io_stats);
|
||||
kfree(server);
|
||||
nfs_release_automount_timer();
|
||||
dprintk("<-- nfs_free_server()\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_free_server);
|
||||
|
||||
@@ -1026,10 +993,6 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
struct nfs_fattr *fattr_fsinfo;
|
||||
int error;
|
||||
|
||||
dprintk("--> nfs_clone_server(,%llx:%llx,)\n",
|
||||
(unsigned long long) fattr->fsid.major,
|
||||
(unsigned long long) fattr->fsid.minor);
|
||||
|
||||
server = nfs_alloc_server();
|
||||
if (!server)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -1061,10 +1024,6 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN)
|
||||
server->namelen = NFS4_MAXNAMLEN;
|
||||
|
||||
dprintk("Cloned FSID: %llx:%llx\n",
|
||||
(unsigned long long) server->fsid.major,
|
||||
(unsigned long long) server->fsid.minor);
|
||||
|
||||
error = nfs_start_lockd(server);
|
||||
if (error < 0)
|
||||
goto out_free_server;
|
||||
@@ -1073,13 +1032,11 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
server->mount_time = jiffies;
|
||||
|
||||
nfs_free_fattr(fattr_fsinfo);
|
||||
dprintk("<-- nfs_clone_server() = %p\n", server);
|
||||
return server;
|
||||
|
||||
out_free_server:
|
||||
nfs_free_fattr(fattr_fsinfo);
|
||||
nfs_free_server(server);
|
||||
dprintk("<-- nfs_clone_server() = error %d\n", error);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_clone_server);
|
||||
|
Reference in New Issue
Block a user