Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=42bf0383d1e09dd1b38f3debb13a76b2f87634b3
Commit:     42bf0383d1e09dd1b38f3debb13a76b2f87634b3
Parent:     2c98615d3b64ce7888cd46cc668023f456daf287
Author:     Aneesh Kumar K.V <[EMAIL PROTECTED]>
AuthorDate: Mon Feb 25 16:38:03 2008 -0500
Committer:  Theodore Ts'o <[EMAIL PROTECTED]>
CommitDate: Mon Feb 25 16:38:03 2008 -0500

    ext4: set EXT4_EXTENTS_FL only for directory and regular files
    
    In addition, don't inherit EXT4_EXTENTS_FL from parent directory.
    If we have a directory with extent flag set and later mount the file
    system with -o noextents, the files created in that directory will also
    have extent flag set but we would not have called ext4_ext_tree_init for
    them. This will cause error later when we are verifying the extent header
    
    Signed-off-by: Aneesh Kumar K.V <[EMAIL PROTECTED]>
    Acked-off-by: Eric Sandeen <[EMAIL PROTECTED]>
    Signed-off-by: Mingming Cao <[EMAIL PROTECTED]>
    Signed-off-by: "Theodore Ts'o" <[EMAIL PROTECTED]>
---
 fs/ext4/ialloc.c |   22 +++++++++++++++-------
 fs/ext4/namei.c  |    1 -
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index da18a74..8036b9b 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -702,7 +702,12 @@ got:
        ei->i_dir_start_lookup = 0;
        ei->i_disksize = 0;
 
-       ei->i_flags = EXT4_I(dir)->i_flags & ~EXT4_INDEX_FL;
+       /*
+        * Don't inherit extent flag from directory. We set extent flag on
+        * newly created directory and file only if -o extent mount option is
+        * specified
+        */
+       ei->i_flags = EXT4_I(dir)->i_flags & ~(EXT4_INDEX_FL|EXT4_EXTENTS_FL);
        if (S_ISLNK(mode))
                ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL);
        /* dirsync only applies to directories */
@@ -745,12 +750,15 @@ got:
                goto fail_free_drop;
        }
        if (test_opt(sb, EXTENTS)) {
-               EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
-               ext4_ext_tree_init(handle, inode);
-               err = ext4_update_incompat_feature(handle, sb,
-                                               EXT4_FEATURE_INCOMPAT_EXTENTS);
-               if (err)
-                       goto fail;
+               /* set extent flag only for directory and file */
+               if (S_ISDIR(mode) || S_ISREG(mode)) {
+                       EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
+                       ext4_ext_tree_init(handle, inode);
+                       err = ext4_update_incompat_feature(handle, sb,
+                                       EXT4_FEATURE_INCOMPAT_EXTENTS);
+                       if (err)
+                               goto fail;
+               }
        }
 
        ext4_debug("allocating inode %lu\n", inode->i_ino);
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 5a79c6b..28aa2ed 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2220,7 +2220,6 @@ retry:
                inode->i_op = &ext4_fast_symlink_inode_operations;
                memcpy((char*)&EXT4_I(inode)->i_data,symname,l);
                inode->i_size = l-1;
-               EXT4_I(inode)->i_flags &= ~EXT4_EXTENTS_FL;
        }
        EXT4_I(inode)->i_disksize = inode->i_size;
        err = ext4_add_nondir(handle, dentry, inode);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to