Commit fa3c791d authored by Linus Torvalds's avatar Linus Torvalds
parents bd3f8f2b fad3aa1e
...@@ -822,6 +822,13 @@ xfs_buf_rele( ...@@ -822,6 +822,13 @@ xfs_buf_rele(
XB_TRACE(bp, "rele", bp->b_relse); XB_TRACE(bp, "rele", bp->b_relse);
if (unlikely(!hash)) {
ASSERT(!bp->b_relse);
if (atomic_dec_and_test(&bp->b_hold))
xfs_buf_free(bp);
return;
}
if (atomic_dec_and_lock(&bp->b_hold, &hash->bh_lock)) { if (atomic_dec_and_lock(&bp->b_hold, &hash->bh_lock)) {
if (bp->b_relse) { if (bp->b_relse) {
atomic_inc(&bp->b_hold); atomic_inc(&bp->b_hold);
......
...@@ -262,6 +262,31 @@ has_fs_struct(struct task_struct *task) ...@@ -262,6 +262,31 @@ has_fs_struct(struct task_struct *task)
return (task->fs != init_task.fs); return (task->fs != init_task.fs);
} }
STATIC inline void
cleanup_inode(
vnode_t *dvp,
vnode_t *vp,
struct dentry *dentry,
int mode)
{
struct dentry teardown = {};
int err2;
/* Oh, the horror.
* If we can't add the ACL or we fail in
* linvfs_init_security we must back out.
* ENOSPC can hit here, among other things.
*/
teardown.d_inode = LINVFS_GET_IP(vp);
teardown.d_name = dentry->d_name;
if (S_ISDIR(mode))
VOP_RMDIR(dvp, &teardown, NULL, err2);
else
VOP_REMOVE(dvp, &teardown, NULL, err2);
VN_RELE(vp);
}
STATIC int STATIC int
linvfs_mknod( linvfs_mknod(
struct inode *dir, struct inode *dir,
...@@ -316,30 +341,19 @@ linvfs_mknod( ...@@ -316,30 +341,19 @@ linvfs_mknod(
} }
if (!error) if (!error)
{
error = linvfs_init_security(vp, dir); error = linvfs_init_security(vp, dir);
if (error)
cleanup_inode(dvp, vp, dentry, mode);
}
if (default_acl) { if (default_acl) {
if (!error) { if (!error) {
error = _ACL_INHERIT(vp, &va, default_acl); error = _ACL_INHERIT(vp, &va, default_acl);
if (!error) { if (!error)
VMODIFY(vp); VMODIFY(vp);
} else { else
struct dentry teardown = {}; cleanup_inode(dvp, vp, dentry, mode);
int err2;
/* Oh, the horror.
* If we can't add the ACL we must back out.
* ENOSPC can hit here, among other things.
*/
teardown.d_inode = ip = LINVFS_GET_IP(vp);
teardown.d_name = dentry->d_name;
if (S_ISDIR(mode))
VOP_RMDIR(dvp, &teardown, NULL, err2);
else
VOP_REMOVE(dvp, &teardown, NULL, err2);
VN_RELE(vp);
}
} }
_ACL_FREE(default_acl); _ACL_FREE(default_acl);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment