diff -Nru a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
--- a/fs/reiserfs/inode.c       Tue Apr  2 14:44:38 2002
+++ b/fs/reiserfs/inode.c       Tue Apr  2 14:44:38 2002
@@ -1107,8 +1107,19 @@
    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) ;
}


@@ -1128,7 +1139,7 @@
    int retval;

    if (!p) {
-       make_bad_inode(inode) ;
+       reiserfs_make_bad_inode(inode) ;
       return;
    }

@@ -1148,13 +1159,13 @@
       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;
    }
@@ -1181,7 +1192,7 @@
                             "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 */
diff -Nru a/fs/reiserfs/super.c b/fs/reiserfs/super.c
--- a/fs/reiserfs/super.c       Tue Apr  2 14:44:38 2002
+++ b/fs/reiserfs/super.c       Tue Apr  2 14:44:38 2002
@@ -740,9 +740,8 @@
    //
    // 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) {