[PATCH][CFT] Re: 2.4.15-pre9 breakage (inode.c)

From: Alexander Viro (viro@math.psu.edu)
Date: Fri Nov 23 2001 - 16:51:03 EST


        Untested fix follows. And please, pass the brown paperbag... ;-/

diff -urN S15/fs/inode.c S15-fix/fs/inode.c
--- S15/fs/inode.c Fri Nov 23 06:45:43 2001
+++ S15-fix/fs/inode.c Fri Nov 23 16:33:33 2001
@@ -1065,24 +1065,27 @@
                         if (inode->i_state != I_CLEAR)
                                 BUG();
                 } else {
- if (!list_empty(&inode->i_hash) && sb && sb->s_root) {
+ if (!list_empty(&inode->i_hash) {
                                 if (!(inode->i_state & (I_DIRTY|I_LOCK))) {
                                         list_del(&inode->i_list);
                                         list_add(&inode->i_list, &inode_unused);
                                 }
                                 inodes_stat.nr_unused++;
                                 spin_unlock(&inode_lock);
- return;
- } else {
- list_del_init(&inode->i_list);
+ if (!sb || sb->s_flags & MS_ACTIVE))
+ return;
+ write_inode_now(inode);
+ spin_lock(&inode_lock);
+ inodes_stat.nr_unused--;
                                 list_del_init(&inode->i_hash);
- inode->i_state|=I_FREEING;
- inodes_stat.nr_inodes--;
- spin_unlock(&inode_lock);
- if (inode->i_data.nrpages)
- truncate_inode_pages(&inode->i_data, 0);
- clear_inode(inode);
                         }
+ list_del_init(&inode->i_list);
+ inode->i_state|=I_FREEING;
+ inodes_stat.nr_inodes--;
+ spin_unlock(&inode_lock);
+ if (inode->i_data.nrpages)
+ truncate_inode_pages(&inode->i_data, 0);
+ clear_inode(inode);
                 }
                 destroy_inode(inode);
         }
diff -urN S15/fs/super.c S15-fix/fs/super.c
--- S15/fs/super.c Fri Nov 23 06:45:43 2001
+++ S15-fix/fs/super.c Fri Nov 23 16:26:18 2001
@@ -462,6 +462,7 @@
         lock_super(s);
         if (!type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
                 goto out_fail;
+ s->s_flags |= MS_ACTIVE;
         unlock_super(s);
         /* tell bdcache that we are going to keep this one */
         if (bdev)
@@ -614,6 +615,7 @@
         lock_super(s);
         if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
                 goto out_fail;
+ s->s_flags |= MS_ACTIVE;
         unlock_super(s);
         get_filesystem(fs_type);
         path_release(&nd);
@@ -695,6 +697,7 @@
                 lock_super(s);
                 if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
                         goto out_fail;
+ s->s_flags |= MS_ACTIVE;
                 unlock_super(s);
                 get_filesystem(fs_type);
                 return s;
@@ -739,6 +742,7 @@
         dput(root);
         fsync_super(sb);
         lock_super(sb);
+ sb->s_flags &= ~MS_ACTIVE;
         invalidate_inodes(sb); /* bad name - it should be evict_inodes() */
         if (sop) {
                 if (sop->write_super && sb->s_dirt)
diff -urN S15/include/linux/fs.h S15-fix/include/linux/fs.h
--- S15/include/linux/fs.h Fri Nov 23 06:45:44 2001
+++ S15-fix/include/linux/fs.h Fri Nov 23 16:24:44 2001
@@ -110,6 +110,7 @@
 #define MS_BIND 4096
 #define MS_REC 16384
 #define MS_VERBOSE 32768
+#define MS_ACTIVE (1<<30)
 #define MS_NOUSER (1<<31)
 
 /*

-
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 Nov 23 2001 - 21:00:35 EST