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 <mark.fasheh@oracle.com>
This commit is contained in:
parent
1ba9da2ffa
commit
0027dd5bc2
3 changed files with 14 additions and 37 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue