Commit d1e284d5 authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: Clean up nfs4_get_state_owner

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 1313e603
...@@ -319,7 +319,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session) ...@@ -319,7 +319,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session)
} }
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *); extern struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *, gfp_t);
extern void nfs4_put_state_owner(struct nfs4_state_owner *); extern void nfs4_put_state_owner(struct nfs4_state_owner *);
extern void nfs4_purge_state_owners(struct nfs_server *); extern void nfs4_purge_state_owners(struct nfs_server *);
extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
......
...@@ -1754,7 +1754,8 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode ...@@ -1754,7 +1754,8 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode
/* Protect against reboot recovery conflicts */ /* Protect against reboot recovery conflicts */
status = -ENOMEM; status = -ENOMEM;
if (!(sp = nfs4_get_state_owner(server, cred))) { sp = nfs4_get_state_owner(server, cred, GFP_KERNEL);
if (sp == NULL) {
dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
goto out_err; goto out_err;
} }
......
...@@ -444,13 +444,17 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp) ...@@ -444,13 +444,17 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
* *
*/ */
static struct nfs4_state_owner * static struct nfs4_state_owner *
nfs4_alloc_state_owner(void) nfs4_alloc_state_owner(struct nfs_server *server,
struct rpc_cred *cred,
gfp_t gfp_flags)
{ {
struct nfs4_state_owner *sp; struct nfs4_state_owner *sp;
sp = kzalloc(sizeof(*sp),GFP_NOFS); sp = kzalloc(sizeof(*sp), gfp_flags);
if (!sp) if (!sp)
return NULL; return NULL;
sp->so_server = server;
sp->so_cred = get_rpccred(cred);
spin_lock_init(&sp->so_lock); spin_lock_init(&sp->so_lock);
INIT_LIST_HEAD(&sp->so_states); INIT_LIST_HEAD(&sp->so_states);
rpc_init_wait_queue(&sp->so_sequence.wait, "Seqid_waitqueue"); rpc_init_wait_queue(&sp->so_sequence.wait, "Seqid_waitqueue");
...@@ -516,7 +520,8 @@ static void nfs4_gc_state_owners(struct nfs_server *server) ...@@ -516,7 +520,8 @@ static void nfs4_gc_state_owners(struct nfs_server *server)
* Returns a pointer to an instantiated nfs4_state_owner struct, or NULL. * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL.
*/ */
struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
struct rpc_cred *cred) struct rpc_cred *cred,
gfp_t gfp_flags)
{ {
struct nfs_client *clp = server->nfs_client; struct nfs_client *clp = server->nfs_client;
struct nfs4_state_owner *sp, *new; struct nfs4_state_owner *sp, *new;
...@@ -526,20 +531,13 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, ...@@ -526,20 +531,13 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
if (sp != NULL) if (sp != NULL)
goto out; goto out;
new = nfs4_alloc_state_owner(); new = nfs4_alloc_state_owner(server, cred, gfp_flags);
if (new == NULL) if (new == NULL)
goto out; goto out;
new->so_server = server;
new->so_cred = cred;
spin_lock(&clp->cl_lock);
sp = nfs4_insert_state_owner_locked(new); sp = nfs4_insert_state_owner_locked(new);
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
if (sp == new) if (sp != new)
get_rpccred(cred); nfs4_free_state_owner(new);
else {
rpc_destroy_wait_queue(&new->so_sequence.wait);
kfree(new);
}
out: out:
nfs4_gc_state_owners(server); nfs4_gc_state_owners(server);
return sp; return sp;
......
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