]> git.hungrycats.org Git - linux/commitdiff
[PATCH] ReiserFS inode cleanup
authorHans Reiser <reiser@namesys.com>
Wed, 10 Apr 2002 06:45:38 +0000 (23:45 -0700)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Wed, 10 Apr 2002 06:45:38 +0000 (23:45 -0700)
 This patch fixes a problem that was created during inode structure
 cleanup/ private parts separation. This fix was made by Chris Mason.
 This is very critical bugfix. Without it, filesystem corruption
 happens on savelinks processing and possibly in some other cases.

fs/reiserfs/inode.c
fs/reiserfs/super.c

index 3c69d5078903c7df763b85c862c46f9a1ddada1a..c2aaee758d4b2634d6c98e182c0efe8725304380 100644 (file)
@@ -1111,8 +1111,19 @@ void reiserfs_update_sd (struct reiserfs_transaction_handle *th,
     return;
 }
 
+/* reiserfs_read_inode2 is called to read the inode off disk, and it
+** does a make_bad_inode when things go wrong.  But, we need to make sure
+** and clear the key in the private portion of the inode, otherwise a
+** corresponding iput might try to delete whatever object the inode last
+** represented.
+*/
+static void reiserfs_make_bad_inode(struct inode *inode) {
+    memset(INODE_PKEY(inode), 0, KEY_SIZE);
+    make_bad_inode(inode);
+}
+
 void reiserfs_read_inode(struct inode *inode) {
-    make_bad_inode(inode) ;
+    reiserfs_make_bad_inode(inode) ;
 }
 
 
@@ -1132,7 +1143,7 @@ void reiserfs_read_inode2 (struct inode * inode, void *p)
     int retval;
 
     if (!p) {
-       make_bad_inode(inode) ;
+       reiserfs_make_bad_inode(inode) ;
        return;
     }
 
@@ -1152,13 +1163,13 @@ void reiserfs_read_inode2 (struct inode * inode, void *p)
        reiserfs_warning ("vs-13070: reiserfs_read_inode2: "
                     "i/o failure occurred trying to find stat data of %K\n",
                     &key);
-       make_bad_inode(inode) ;
+       reiserfs_make_bad_inode(inode) ;
        return;
     }
     if (retval != ITEM_FOUND) {
        /* a stale NFS handle can trigger this without it being an error */
        pathrelse (&path_to_sd);
-       make_bad_inode(inode) ;
+       reiserfs_make_bad_inode(inode) ;
        inode->i_nlink = 0;
        return;
     }
@@ -1185,7 +1196,7 @@ void reiserfs_read_inode2 (struct inode * inode, void *p)
                              "dead inode read from disk %K. "
                              "This is likely to be race with knfsd. Ignore\n", 
                              &key );
-           make_bad_inode( inode );
+           reiserfs_make_bad_inode( inode );
     }
 
     reiserfs_check_path(&path_to_sd) ; /* init inode should be relsing */
index 453eefb14023b7b6f96da5592ef9f9edeafbeb76..55fcf9cf7457b3c3b46af2369f03a5334c18f02a 100644 (file)
@@ -746,9 +746,8 @@ static int read_super_block (struct super_block * s, int offset)
     //
     // ok, reiserfs signature (old or new) found in at the given offset
     //    
-    brelse (bh);
-    
     sb_set_blocksize (s, sb_blocksize(rs));
+    brelse (bh);
     
     bh = reiserfs_bread (s, offset / s->s_blocksize);
     if (!bh) {