patch-2.4.18 linux/fs/reiserfs/super.c
Next file: linux/fs/romfs/inode.c
Previous file: linux/fs/reiserfs/stree.c
Back to the patch index
Back to the overall index
- Lines: 59
- Date:
Wed Feb 13 17:30:42 2002
- Orig file:
linux.orig/fs/reiserfs/super.c
- Orig date:
Mon Feb 18 20:18:40 2002
diff -Naur -X /home/marcelo/lib/dontdiff linux.orig/fs/reiserfs/super.c linux/fs/reiserfs/super.c
@@ -86,7 +86,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;
@@ -94,7 +94,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));
@@ -167,7 +167,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;
}
@@ -175,9 +175,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) {
inode -> u.reiserfs_i.i_flags |= i_link_saved_truncate_mask;
@@ -243,6 +255,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);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)