Merge git://oss.sgi.com:8090/oss/git/xfs-2.6
authorLinus Torvalds <torvalds@g5.osdl.org>
Wed, 1 Feb 2006 03:30:48 +0000 (19:30 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 1 Feb 2006 03:30:48 +0000 (19:30 -0800)
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_iops.c

index e44b7c1..a36a8e3 100644 (file)
@@ -822,6 +822,13 @@ xfs_buf_rele(
 
        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 (bp->b_relse) {
                        atomic_inc(&bp->b_hold);
index 76c6df3..eda7919 100644 (file)
@@ -262,6 +262,31 @@ has_fs_struct(struct task_struct *task)
        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
 linvfs_mknod(
        struct inode    *dir,
@@ -316,30 +341,19 @@ linvfs_mknod(
        }
 
        if (!error)
+       {
                error = linvfs_init_security(vp, dir);
+               if (error)
+                       cleanup_inode(dvp, vp, dentry, mode);
+       }
 
        if (default_acl) {
                if (!error) {
                        error = _ACL_INHERIT(vp, &va, default_acl);
-                       if (!error) {
+                       if (!error) 
                                VMODIFY(vp);
-                       } else {
-                               struct dentry   teardown = {};
-                               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);
-                       }
+                       else
+                               cleanup_inode(dvp, vp, dentry, mode);
                }
                _ACL_FREE(default_acl);
        }