NFSv4: Clean up nfs4_get_state_owner
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 18 Jan 2012 03:04:24 +0000 (22:04 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 31 Jan 2012 23:20:28 +0000 (18:20 -0500)
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c
fs/nfs/nfs4state.c

index 4d7d0aedc101831ecb3b10cf345f0e18e7ca56ad..654b091644c55da79836f315fef7d3bfdb6f66e7 100644 (file)
@@ -319,7 +319,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session)
 }
 #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_purge_state_owners(struct nfs_server *);
 extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
index f0c849c98fe4bfb49208ed6a34f0714257431e75..53ef365f4372872ff9f401ba66acbe4f65ddaf70 100644 (file)
@@ -1754,7 +1754,8 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode
 
        /* Protect against reboot recovery conflicts */
        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");
                goto out_err;
        }
index a53f33b4ac3a5cf333afe80b358f27fe4130289f..a8a42a677d8f6eb4406b55e0c2d098ddd6e54f4f 100644 (file)
@@ -444,13 +444,17 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
  *
  */
 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;
 
-       sp = kzalloc(sizeof(*sp),GFP_NOFS);
+       sp = kzalloc(sizeof(*sp), gfp_flags);
        if (!sp)
                return NULL;
+       sp->so_server = server;
+       sp->so_cred = get_rpccred(cred);
        spin_lock_init(&sp->so_lock);
        INIT_LIST_HEAD(&sp->so_states);
        rpc_init_wait_queue(&sp->so_sequence.wait, "Seqid_waitqueue");
@@ -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.
  */
 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 nfs4_state_owner *sp, *new;
@@ -526,20 +531,13 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
        spin_unlock(&clp->cl_lock);
        if (sp != NULL)
                goto out;
-       new = nfs4_alloc_state_owner();
+       new = nfs4_alloc_state_owner(server, cred, gfp_flags);
        if (new == NULL)
                goto out;
-       new->so_server = server;
-       new->so_cred = cred;
-       spin_lock(&clp->cl_lock);
        sp = nfs4_insert_state_owner_locked(new);
        spin_unlock(&clp->cl_lock);
-       if (sp == new)
-               get_rpccred(cred);
-       else {
-               rpc_destroy_wait_queue(&new->so_sequence.wait);
-               kfree(new);
-       }
+       if (sp != new)
+               nfs4_free_state_owner(new);
 out:
        nfs4_gc_state_owners(server);
        return sp;