mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-04 21:54:34 +00:00
ocfs2: Add directory entry later in ocfs2_symlink() and ocfs2_mknod()
If we get a failure during creation of an inode we'll allow the orphan code to remove the inode, which is correct. However, we need to ensure that we don't get any errors after the call to ocfs2_add_entry(), otherwise we could leave a dangling directory reference. The solution is simple - in both cases, all I had to do was move ocfs2_dentry_attach_lock() above the ocfs2_add_entry() call. Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
062d340384
commit
a9743fcdc0
1 changed files with 25 additions and 15 deletions
|
@ -408,6 +408,19 @@ static int ocfs2_mknod(struct inode *dir,
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do this before adding the entry to the directory. We add
|
||||
* also set d_op after success so that ->d_iput() will cleanup
|
||||
* the dentry lock even if ocfs2_add_entry() fails below.
|
||||
*/
|
||||
status = ocfs2_dentry_attach_lock(dentry, inode,
|
||||
OCFS2_I(dir)->ip_blkno);
|
||||
if (status) {
|
||||
mlog_errno(status);
|
||||
goto leave;
|
||||
}
|
||||
dentry->d_op = &ocfs2_dentry_ops;
|
||||
|
||||
status = ocfs2_add_entry(handle, dentry, inode,
|
||||
OCFS2_I(inode)->ip_blkno, parent_fe_bh,
|
||||
&lookup);
|
||||
|
@ -416,15 +429,7 @@ static int ocfs2_mknod(struct inode *dir,
|
|||
goto leave;
|
||||
}
|
||||
|
||||
status = ocfs2_dentry_attach_lock(dentry, inode,
|
||||
OCFS2_I(dir)->ip_blkno);
|
||||
if (status) {
|
||||
mlog_errno(status);
|
||||
goto leave;
|
||||
}
|
||||
|
||||
insert_inode_hash(inode);
|
||||
dentry->d_op = &ocfs2_dentry_ops;
|
||||
d_instantiate(dentry, inode);
|
||||
status = 0;
|
||||
leave:
|
||||
|
@ -1777,6 +1782,18 @@ static int ocfs2_symlink(struct inode *dir,
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do this before adding the entry to the directory. We add
|
||||
* also set d_op after success so that ->d_iput() will cleanup
|
||||
* the dentry lock even if ocfs2_add_entry() fails below.
|
||||
*/
|
||||
status = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
|
||||
if (status) {
|
||||
mlog_errno(status);
|
||||
goto bail;
|
||||
}
|
||||
dentry->d_op = &ocfs2_dentry_ops;
|
||||
|
||||
status = ocfs2_add_entry(handle, dentry, inode,
|
||||
le64_to_cpu(fe->i_blkno), parent_fe_bh,
|
||||
&lookup);
|
||||
|
@ -1785,14 +1802,7 @@ static int ocfs2_symlink(struct inode *dir,
|
|||
goto bail;
|
||||
}
|
||||
|
||||
status = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
|
||||
if (status) {
|
||||
mlog_errno(status);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
insert_inode_hash(inode);
|
||||
dentry->d_op = &ocfs2_dentry_ops;
|
||||
d_instantiate(dentry, inode);
|
||||
bail:
|
||||
if (status < 0 && did_quota)
|
||||
|
|
Loading…
Add table
Reference in a new issue