Merge git://oss.sgi.com:8090/oss/git/xfs-2.6
This commit is contained in:
@@ -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)
|
|||||||
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(
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user