diff options
Diffstat (limited to 'fs/nfs')
| -rw-r--r-- | fs/nfs/dir.c | 5 | ||||
| -rw-r--r-- | fs/nfs/nfs3acl.c | 34 | ||||
| -rw-r--r-- | fs/nfs/nfs4client.c | 2 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 8 | ||||
| -rw-r--r-- | fs/nfs/nfs4session.c | 25 | ||||
| -rw-r--r-- | fs/nfs/nfs4session.h | 2 | 
6 files changed, 43 insertions, 33 deletions
| diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index be38b573495a..4a48fe4b84b6 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1846,6 +1846,11 @@ int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)  							GFP_KERNEL)) {  		SetPageUptodate(page);  		unlock_page(page); +		/* +		 * add_to_page_cache_lru() grabs an extra page refcount. +		 * Drop it here to avoid leaking this page later. +		 */ +		page_cache_release(page);  	} else  		__free_page(page); diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index 9a5ca03fa539..871d6eda8dba 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -80,7 +80,7 @@ struct posix_acl *nfs3_get_acl(struct inode *inode, int type)  	}  	if (res.acl_access != NULL) { -		if (posix_acl_equiv_mode(res.acl_access, NULL) || +		if ((posix_acl_equiv_mode(res.acl_access, NULL) == 0) ||  		    res.acl_access->a_count == 0) {  			posix_acl_release(res.acl_access);  			res.acl_access = NULL; @@ -113,7 +113,7 @@ getout:  	return ERR_PTR(status);  } -int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl, +static int __nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  		struct posix_acl *dfacl)  {  	struct nfs_server *server = NFS_SERVER(inode); @@ -198,6 +198,15 @@ out:  	return status;  } +int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl, +		struct posix_acl *dfacl) +{ +	int ret; +	ret = __nfs3_proc_setacls(inode, acl, dfacl); +	return (ret == -EOPNOTSUPP) ? 0 : ret; + +} +  int nfs3_set_acl(struct inode *inode, struct posix_acl *acl, int type)  {  	struct posix_acl *alloc = NULL, *dfacl = NULL; @@ -225,7 +234,7 @@ int nfs3_set_acl(struct inode *inode, struct posix_acl *acl, int type)  		if (IS_ERR(alloc))  			goto fail;  	} -	status = nfs3_proc_setacls(inode, acl, dfacl); +	status = __nfs3_proc_setacls(inode, acl, dfacl);  	posix_acl_release(alloc);  	return status; @@ -233,25 +242,6 @@ fail:  	return PTR_ERR(alloc);  } -int nfs3_proc_set_default_acl(struct inode *dir, struct inode *inode, -		umode_t mode) -{ -	struct posix_acl *default_acl, *acl; -	int error; - -	error = posix_acl_create(dir, &mode, &default_acl, &acl); -	if (error) -		return (error == -EOPNOTSUPP) ? 0 : error; - -	error = nfs3_proc_setacls(inode, acl, default_acl); - -	if (acl) -		posix_acl_release(acl); -	if (default_acl) -		posix_acl_release(default_acl); -	return error; -} -  const struct xattr_handler *nfs3_xattr_handlers[] = {  	&posix_acl_access_xattr_handler,  	&posix_acl_default_xattr_handler, diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index dbb3e1f30c68..860ad26a5590 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -170,7 +170,7 @@ void nfs41_shutdown_client(struct nfs_client *clp)  void nfs40_shutdown_client(struct nfs_client *clp)  {  	if (clp->cl_slot_tbl) { -		nfs4_release_slot_table(clp->cl_slot_tbl); +		nfs4_shutdown_slot_table(clp->cl_slot_tbl);  		kfree(clp->cl_slot_tbl);  	}  } diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 42da6af77587..2da6a698b8f7 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1620,15 +1620,15 @@ static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)  {  	struct nfs4_opendata *data = calldata; -	nfs40_setup_sequence(data->o_arg.server, &data->o_arg.seq_args, -				&data->o_res.seq_res, task); +	nfs40_setup_sequence(data->o_arg.server, &data->c_arg.seq_args, +				&data->c_res.seq_res, task);  }  static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)  {  	struct nfs4_opendata *data = calldata; -	nfs40_sequence_done(task, &data->o_res.seq_res); +	nfs40_sequence_done(task, &data->c_res.seq_res);  	data->rpc_status = task->tk_status;  	if (data->rpc_status == 0) { @@ -1686,7 +1686,7 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)  	};  	int status; -	nfs4_init_sequence(&data->o_arg.seq_args, &data->o_res.seq_res, 1); +	nfs4_init_sequence(&data->c_arg.seq_args, &data->c_res.seq_res, 1);  	kref_get(&data->kref);  	data->rpc_done = 0;  	data->rpc_status = 0; diff --git a/fs/nfs/nfs4session.c b/fs/nfs/nfs4session.c index cf883c7ae053..e799dc3c3b1d 100644 --- a/fs/nfs/nfs4session.c +++ b/fs/nfs/nfs4session.c @@ -231,14 +231,23 @@ out:  	return ret;  } +/* + * nfs4_release_slot_table - release all slot table entries + */ +static void nfs4_release_slot_table(struct nfs4_slot_table *tbl) +{ +	nfs4_shrink_slot_table(tbl, 0); +} +  /** - * nfs4_release_slot_table - release resources attached to a slot table + * nfs4_shutdown_slot_table - release resources attached to a slot table   * @tbl: slot table to shut down   *   */ -void nfs4_release_slot_table(struct nfs4_slot_table *tbl) +void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl)  { -	nfs4_shrink_slot_table(tbl, 0); +	nfs4_release_slot_table(tbl); +	rpc_destroy_wait_queue(&tbl->slot_tbl_waitq);  }  /** @@ -422,7 +431,7 @@ void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,  	spin_unlock(&tbl->slot_tbl_lock);  } -static void nfs4_destroy_session_slot_tables(struct nfs4_session *session) +static void nfs4_release_session_slot_tables(struct nfs4_session *session)  {  	nfs4_release_slot_table(&session->fc_slot_table);  	nfs4_release_slot_table(&session->bc_slot_table); @@ -450,7 +459,7 @@ int nfs4_setup_session_slot_tables(struct nfs4_session *ses)  	if (status && tbl->slots == NULL)  		/* Fore and back channel share a connection so get  		 * both slot tables or neither */ -		nfs4_destroy_session_slot_tables(ses); +		nfs4_release_session_slot_tables(ses);  	return status;  } @@ -470,6 +479,12 @@ struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)  	return session;  } +static void nfs4_destroy_session_slot_tables(struct nfs4_session *session) +{ +	nfs4_shutdown_slot_table(&session->fc_slot_table); +	nfs4_shutdown_slot_table(&session->bc_slot_table); +} +  void nfs4_destroy_session(struct nfs4_session *session)  {  	struct rpc_xprt *xprt; diff --git a/fs/nfs/nfs4session.h b/fs/nfs/nfs4session.h index 232306100651..b34ada9bc6a2 100644 --- a/fs/nfs/nfs4session.h +++ b/fs/nfs/nfs4session.h @@ -74,7 +74,7 @@ enum nfs4_session_state {  extern int nfs4_setup_slot_table(struct nfs4_slot_table *tbl,  		unsigned int max_reqs, const char *queue); -extern void nfs4_release_slot_table(struct nfs4_slot_table *tbl); +extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl);  extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl);  extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);  extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl); |