]> err.no Git - linux-2.6/commitdiff
ocfs2: Remove special casing for inode creation in ocfs2_dentry_attach_lock()
authorMark Fasheh <mark.fasheh@oracle.com>
Thu, 21 Sep 2006 23:51:28 +0000 (16:51 -0700)
committerMark Fasheh <mark.fasheh@oracle.com>
Sun, 24 Sep 2006 20:50:45 +0000 (13:50 -0700)
We can't use LKM_LOCAL for new dentry locks because an unlink and subsequent
re-create of a name/inode pair may result in the lock still being mastered
somewhere in the cluster.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dcache.c
fs/ocfs2/dcache.h
fs/ocfs2/namei.c

index 18a31906316e2d99b9cd7c7800ab7e5f3ba24d2c..014e73978dac074aa406f4494f9e6288515a88a3 100644 (file)
@@ -183,9 +183,6 @@ DEFINE_SPINLOCK(dentry_attach_lock);
  * The dir cluster lock (held at either PR or EX mode) protects us
  * from unlink and rename on other nodes.
  *
- * The 'create' flag tells us whether we're doing this as a result of
- * a file creation.
- *
  * A dput() can happen asynchronously due to pruning, so we cover
  * attaching and detaching the dentry lock with a
  * dentry_attach_lock.
@@ -199,16 +196,15 @@ DEFINE_SPINLOCK(dentry_attach_lock);
  */
 int ocfs2_dentry_attach_lock(struct dentry *dentry,
                             struct inode *inode,
-                            u64 parent_blkno,
-                            int create)
+                            u64 parent_blkno)
 {
        int ret;
        struct dentry *alias;
        struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
 
-       mlog(0, "Attach \"%.*s\", parent %llu, create %d, fsdata: %p\n",
+       mlog(0, "Attach \"%.*s\", parent %llu, fsdata: %p\n",
             dentry->d_name.len, dentry->d_name.name,
-            (unsigned long long)parent_blkno, create, dl);
+            (unsigned long long)parent_blkno, dl);
 
        /*
         * Negative dentry. We ignore these for now.
@@ -242,10 +238,9 @@ int ocfs2_dentry_attach_lock(struct dentry *dentry,
                 * since we have it pinned, so our reference is safe.
                 */
                dl = alias->d_fsdata;
-               mlog_bug_on_msg(!dl, "parent %llu, ino %llu, create %d\n",
+               mlog_bug_on_msg(!dl, "parent %llu, ino %llu\n",
                                (unsigned long long)parent_blkno,
-                               (unsigned long long)OCFS2_I(inode)->ip_blkno,
-                               create);
+                               (unsigned long long)OCFS2_I(inode)->ip_blkno);
 
                mlog_bug_on_msg(dl->dl_parent_blkno != parent_blkno,
                                " \"%.*s\": old parent: %llu, new: %llu\n",
@@ -283,32 +278,17 @@ out_attach:
        dl->dl_count++;
        spin_unlock(&dentry_attach_lock);
 
-       /*
-        * Creation of a new file means that nobody can possibly have
-        * this name in the system, which means that acquiry of those
-        * locks can easily be optimized.
-        */
-       if (create) {
-               ret = ocfs2_create_new_lock(OCFS2_SB(inode->i_sb),
-                                           &dl->dl_lockres, 0);
-               if (ret)
-                       mlog_errno(ret);
-               goto out;
-       }
-
        /*
         * This actually gets us our PRMODE level lock. From now on,
         * we'll have a notification if one of these names is
         * destroyed on another node.
         */
        ret = ocfs2_dentry_lock(dentry, 0);
-       if (ret) {
+       if (!ret)
+               ocfs2_dentry_unlock(dentry, 0);
+       else
                mlog_errno(ret);
-               goto out;
-       }
-       ocfs2_dentry_unlock(dentry, 0);
 
-out:
        dput(alias);
 
        return ret;
@@ -419,8 +399,7 @@ void ocfs2_dentry_move(struct dentry *dentry, struct dentry *target,
        ocfs2_dentry_lock_put(osb, dentry->d_fsdata);
 
        dentry->d_fsdata = NULL;
-       ret = ocfs2_dentry_attach_lock(dentry, inode,
-                                      OCFS2_I(new_dir)->ip_blkno, 0);
+       ret = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(new_dir)->ip_blkno);
        if (ret)
                mlog_errno(ret);
 
index e53abe766cab3b9602d7a4695f3e67b5d69548f4..c091c34d9883d25dcc2084371d664e0c93b4de2b 100644 (file)
@@ -42,7 +42,7 @@ struct ocfs2_dentry_lock {
 };
 
 int ocfs2_dentry_attach_lock(struct dentry *dentry, struct inode *inode,
-                            u64 parent_blkno, int create);
+                            u64 parent_blkno);
 
 void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
                           struct ocfs2_dentry_lock *dl);
index 5a942e0123ea6b970181cca547e61bbbca8ee010..6fa978874c33cabf622e833b9ff33f9d5f3c0c00 100644 (file)
@@ -217,7 +217,7 @@ bail_add:
                        dentry = ret;
 
                status = ocfs2_dentry_attach_lock(dentry, inode,
-                                                 OCFS2_I(dir)->ip_blkno, 0);
+                                                 OCFS2_I(dir)->ip_blkno);
                if (status) {
                        mlog_errno(status);
                        ret = ERR_PTR(status);
@@ -441,7 +441,7 @@ static int ocfs2_mknod(struct inode *dir,
        }
 
        status = ocfs2_dentry_attach_lock(dentry, inode,
-                                         OCFS2_I(dir)->ip_blkno, 1);
+                                         OCFS2_I(dir)->ip_blkno);
        if (status) {
                mlog_errno(status);
                goto leave;
@@ -754,8 +754,7 @@ static int ocfs2_link(struct dentry *old_dentry,
                goto bail;
        }
 
-       err = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno,
-                                      0);
+       err = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
        if (err) {
                mlog_errno(err);
                goto bail;
@@ -1716,8 +1715,7 @@ static int ocfs2_symlink(struct inode *dir,
                goto bail;
        }
 
-       status = ocfs2_dentry_attach_lock(dentry, inode,
-                                         OCFS2_I(dir)->ip_blkno, 1);
+       status = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
        if (status) {
                mlog_errno(status);
                goto bail;