[PATCH] 2.5 [3 of 8] 03-savelink_dir_truncate.diff

From: Oleg Drokin on behalf of Hans Reiser (reiser@namesys.com)
Date: Mon Feb 11 2002 - 09:24:49 EST


Hello!

   Do not panic on incorrect savelink entries (truncate on directory).
   Currently we suppose these can be created if switching between kernels
   with and without savelinks support.

--- linux/fs/reiserfs/super.c.orig Mon Feb 11 09:55:58 2002
+++ linux/fs/reiserfs/super.c Mon Feb 11 09:58:31 2002
@@ -115,7 +115,7 @@
    protecting unlink is bigger that a key lf "save link" which
    protects truncate), so there left no items to make truncate
    completion on */
-static void remove_save_link_only (struct super_block * s, struct key * key)
+static void remove_save_link_only (struct super_block * s, struct key * key, int oid_free)
 {
     struct reiserfs_transaction_handle th;
 
@@ -123,7 +123,7 @@
      journal_begin (&th, s, JOURNAL_PER_BALANCE_CNT);
  
      reiserfs_delete_solid_item (&th, key);
- if (is_direct_le_key (KEY_FORMAT_3_5, key))
+ if (oid_free)
         /* removals are protected by direct items */
         reiserfs_release_objectid (&th, le32_to_cpu (key->k_objectid));
 
@@ -196,7 +196,7 @@
                "save" link and release objectid */
             reiserfs_warning ("vs-2180: finish_unfinished: iget failed for %K\n",
                               &obj_key);
- remove_save_link_only (s, &save_link_key);
+ remove_save_link_only (s, &save_link_key, 1);
             continue;
         }
 
@@ -204,9 +204,21 @@
             /* file is not unlinked */
             reiserfs_warning ("vs-2185: finish_unfinished: file %K is not unlinked\n",
                               &obj_key);
- remove_save_link_only (s, &save_link_key);
+ remove_save_link_only (s, &save_link_key, 0);
             continue;
         }
+
+ if (truncate && S_ISDIR (inode->i_mode) ) {
+ /* We got a truncate request for a dir which is impossible.
+ The only imaginable way is to execute unfinished truncate request
+ then boot into old kernel, remove the file and create dir with
+ the same key. */
+ reiserfs_warning("green-2101: impossible truncate on a directory %k. Please report\n", INODE_PKEY (inode));
+ remove_save_link_only (s, &save_link_key, 0);
+ truncate = 0;
+ iput (inode);
+ continue;
+ }
  
         if (truncate) {
             REISERFS_I(inode) -> i_flags |= i_link_saved_truncate_mask;
@@ -272,6 +284,8 @@
                            4/*length*/, 0xffff/*free space*/);
     } else {
         /* truncate */
+ if (S_ISDIR (inode->i_mode))
+ reiserfs_warning("green-2102: Adding a truncate savelink for a directory %k! Please report\n", INODE_PKEY(inode));
         set_cpu_key_k_offset (&key, 1);
         set_cpu_key_k_type (&key, TYPE_INDIRECT);
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Feb 15 2002 - 21:00:39 EST