From 0027dd5bc213bc639e09dd002a4ab56bd18317c3 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Thu, 21 Sep 2006 16:51:28 -0700 Subject: [PATCH] ocfs2: Remove special casing for inode creation in ocfs2_dentry_attach_lock() 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 --- fs/ocfs2/dcache.c | 39 +++++++++------------------------------ fs/ocfs2/dcache.h | 2 +- fs/ocfs2/namei.c | 10 ++++------ 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 18a31906316e..014e73978dac 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -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 @@ int ocfs2_dentry_attach_lock(struct dentry *dentry, 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); diff --git a/fs/ocfs2/dcache.h b/fs/ocfs2/dcache.h index e53abe766cab..c091c34d9883 100644 --- a/fs/ocfs2/dcache.h +++ b/fs/ocfs2/dcache.h @@ -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); diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 5a942e0123ea..6fa978874c33 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c @@ -217,7 +217,7 @@ static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry, 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;