Unionfs: Cleanup locking in new_dentry_private_data
authorErez_Zadok <ezk@cs.sunysb.edu>
Fri, 25 May 2007 19:45:30 +0000 (15:45 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Sun, 24 Nov 2013 07:52:24 +0000 (02:52 -0500)
Signed-off-by: Josef 'Jeff' Sipek <jsipek@cs.sunysb.edu>
Conflicts:

fs/unionfs/lookup.c

fs/unionfs/lookup.c

index 4dec675d66251a1b84efef70c58731d214f0708a..0593f569186e56806024ea71c628a35f75127d9d 100644 (file)
@@ -464,23 +464,18 @@ int new_dentry_private_data(struct dentry *dentry)
        int size;
        struct unionfs_dentry_info *info = UNIONFS_D(dentry);
        void *p;
-       int unlock_on_err = 0;
 
-       spin_lock(&dentry->d_lock);
        if (!info) {
-               dentry->d_fsdata = kmem_cache_alloc(unionfs_dentry_cachep,
-                                                   GFP_ATOMIC);
-               info = UNIONFS_D(dentry);
+               info = kmem_cache_alloc(unionfs_dentry_cachep, GFP_ATOMIC);
                if (!info)
                        goto out;
 
                mutex_init(&info->lock);
-               unionfs_lock_dentry(dentry);
-               unlock_on_err = 1;
-
                info->lower_paths = NULL;
        }
 
+       mutex_lock(&info->lock);
+
        info->bstart = -1;
        info->bend = -1;
        info->bopaque = -1;
@@ -497,18 +492,17 @@ int new_dentry_private_data(struct dentry *dentry)
        info->lower_paths = p;
        memset(info->lower_paths, 0, size);
 
-       spin_unlock(&dentry->d_lock);
+       /* ok, set the dentry private data pointer */
+       dentry->d_fsdata = info;
        return 0;
 
 out_free:
        kfree(info->lower_paths);
-       if (unlock_on_err)
-               unionfs_unlock_dentry(dentry);
+       mutex_unlock(&info->lock);
 
 out:
        free_dentry_private_data(info);
        dentry->d_fsdata = NULL;
-       spin_unlock(&dentry->d_lock);
        return -ENOMEM;
 }