Skip to content

Commit

Permalink
ocfs2: Remove special casing for inode creation in ocfs2_dentry_attac…
Browse files Browse the repository at this point in the history
…h_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 <mark.fasheh@oracle.com>
  • Loading branch information
Mark Fasheh committed Sep 24, 2006
1 parent 1ba9da2 commit 0027dd5
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 37 deletions.
39 changes: 9 additions & 30 deletions fs/ocfs2/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion fs/ocfs2/dcache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
10 changes: 4 additions & 6 deletions fs/ocfs2/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 0027dd5

Please sign in to comment.