Re: ext3 warnings from LTP rename14
On Oct 16, 2007 21:17 -0500, Eric Sandeen wrote: Eric Sandeen wrote: Martin Habets wrote: I ran the ltp-full-20070930 tests on 2.6.23-rc9-mph4 (sparc32 SMP), and am seeing the following warnings: This makes me a little nervous about my change ef2b02d3e617cb0400eedf2668f86215e1b0e6af (ext34: ensure do_split leaves enough free space in both blocks) Do you know when this first showed up? Could you test -rc6? You say you can reproduce it; have you checked (fsck'd) the filesystem in between, and is it in good shape? -Eric FWIW, I ran rename14 standalone a few times on 2.6.23.1 with no problems... [EMAIL PROTECTED] ltp-full-20070930]# ./testcases/kernel/syscalls/rename/rename14 rename141 PASS : Test Passed [EMAIL PROTECTED] ltp-full-20070930]# ./testcases/kernel/syscalls/rename/rename14 rename141 PASS : Test Passed [EMAIL PROTECTED] ltp-full-20070930]# ./testcases/kernel/syscalls/rename/rename14 rename141 PASS : Test Passed [EMAIL PROTECTED] ~]# uname -a Linux bear-05.lab.msp.redhat.com 2.6.23.1 #1 SMP Mon Oct 15 15:28:08 CDT 2007 i686 athlon i386 GNU/Linux It is probably significant that the original machine is a sparc32 (big endian). I'd suspect you can reproduce this on a PPC system also. You might also consider running sparse on it ext3/ext4 in case you missed an le32_to_cpu() or something. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
How Inactive may be much greather than cached?
Hi all, could anybody explain how inactive may be much greater than cached? stress test (http://weather.ou.edu/~apw/projects/stress/) that writes into removed files in cycle puts the node to the following state: MemTotal: 16401648 kB MemFree: 636644 kB Buffers: 1122556 kB Cached: 362880 kB SwapCached: 700 kB Active: 1604180 kB Inactive: 13609828 kB At the first glance memory should be freed on file closing, nobody refers to file and ext3_delete_inode() truncates inode. We can see that memory is go away from cached, however could somebody explain why it become invalid instead be freed? Who holds the references to these pages? thank you, Vasily Averin - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: How Inactive may be much greather than cached?
Hi, On Thursday 18 October 2007 16:24, Vasily Averin wrote: Hi all, could anybody explain how inactive may be much greater than cached? stress test (http://weather.ou.edu/~apw/projects/stress/) that writes into removed files in cycle puts the node to the following state: MemTotal: 16401648 kB MemFree: 636644 kB Buffers: 1122556 kB Cached: 362880 kB SwapCached: 700 kB Active: 1604180 kB Inactive: 13609828 kB At the first glance memory should be freed on file closing, nobody refers to file and ext3_delete_inode() truncates inode. We can see that memory is go away from cached, however could somebody explain why it become invalid instead be freed? Who holds the references to these pages? Buffers, swap cache, and anonymous. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GIT PULL] ext4 update
On Oct 16, 2007 21:51 -0700, [EMAIL PROTECTED] wrote: On Wed, 17 Oct 2007, Theodore Ts'o wrote: It has a number random cleanups and bug fixes, and two new features. The first is uninitialized block groups, which allows fast mke2fs operations plus as well as speeding up e2fsck by allowing it to skip parts of the inode tables that haven't been used yet. nice feature, is there any work on a tool to go through a well-used filesystem and mark unused block groups as uninitialized? (I would guess that such a tool may want to move files to make this so) Yes, just set the feature flag via tune2fs and then run e2fsck on it. The second e2fsck shown below is just a demonstration of the speedup. # tune2fs -O uninit_groups /dev/foo tune2fs 1.39.cfs9 (7-Apr-2007) Please run e2fsck on the filesystem. # time e2fsck -fy /dev/foo e2fsck 1.39.cfs9 (7-Apr-2007) Group descriptor 0 checksum is invalid. Fix? yes {repeats for all groups} Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information lustre-OST: 9099/1640160 files (0.4% non-contiguous), 221996/6554520 blocks real0m17.273s user0m4.930s sys 0m1.749s # time e2fsck -fy /dev/hda3 e2fsck 1.39.cfs9 (7-Apr-2007) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information lustre-OST: 9099/1640160 files (0.4% non-contiguous), 221996/6554520 blocks real0m2.412s user0m0.604s sys 0m0.077s The caveats are: (a) this is a read-only feature, so you can't mount such a filesystem r/w on an older kernel. You can disable it with tune2fs -O ^uninit_groups and run a full e2fsck on it again. (b) I don't think there is an official e2fsprogs release with support for this feature yet (it's in the pipe, however). (c) The actual speedup depends on how full the filesystem is, but since ext* usually has way too many inodes, it is generally pretty good. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: How Inactive may be much greather than cached?
Nick Piggin wrote: Hi, On Thursday 18 October 2007 16:24, Vasily Averin wrote: Hi all, could anybody explain how inactive may be much greater than cached? stress test (http://weather.ou.edu/~apw/projects/stress/) that writes into removed files in cycle puts the node to the following state: MemTotal: 16401648 kB MemFree: 636644 kB Buffers: 1122556 kB Cached: 362880 kB SwapCached: 700 kB Active: 1604180 kB Inactive: 13609828 kB At the first glance memory should be freed on file closing, nobody refers to file and ext3_delete_inode() truncates inode. We can see that memory is go away from cached, however could somebody explain why it become invalid instead be freed? Who holds the references to these pages? Buffers, swap cache, and anonymous. But buffers and swap cache are low (1.1 Gb and 700kB in this example) and anonymous should go away when process finished. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
- ext3-remove-ifdef-config_ext3_index.patch removed from -mm tree
The patch titled ext3: remove #ifdef CONFIG_EXT3_INDEX has been removed from the -mm tree. Its filename was ext3-remove-ifdef-config_ext3_index.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext3: remove #ifdef CONFIG_EXT3_INDEX From: Eric Sandeen [EMAIL PROTECTED] CONFIG_EXT3_INDEX is not an exposed config option in the kernel, and it is unconditionally defined in ext3_fs.h. tune2fs is already able to turn off dir indexing, so at this point it's just cluttering up the code. Remove it. Signed-off-by: Eric Sandeen [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext3/dir.c |7 --- fs/ext3/namei.c | 19 --- include/linux/ext3_fs.h | 14 ++ 3 files changed, 2 insertions(+), 38 deletions(-) diff -puN fs/ext3/dir.c~ext3-remove-ifdef-config_ext3_index fs/ext3/dir.c --- a/fs/ext3/dir.c~ext3-remove-ifdef-config_ext3_index +++ a/fs/ext3/dir.c @@ -47,9 +47,7 @@ const struct file_operations ext3_dir_op .compat_ioctl = ext3_compat_ioctl, #endif .fsync = ext3_sync_file, /* BKL held */ -#ifdef CONFIG_EXT3_INDEX .release= ext3_release_dir, -#endif }; @@ -107,7 +105,6 @@ static int ext3_readdir(struct file * fi sb = inode-i_sb; -#ifdef CONFIG_EXT3_INDEX if (EXT3_HAS_COMPAT_FEATURE(inode-i_sb, EXT3_FEATURE_COMPAT_DIR_INDEX) ((EXT3_I(inode)-i_flags EXT3_INDEX_FL) || @@ -123,7 +120,6 @@ static int ext3_readdir(struct file * fi */ EXT3_I(filp-f_path.dentry-d_inode)-i_flags = ~EXT3_INDEX_FL; } -#endif stored = 0; offset = filp-f_pos (sb-s_blocksize - 1); @@ -232,7 +228,6 @@ out: return ret; } -#ifdef CONFIG_EXT3_INDEX /* * These functions convert from the major/minor hash to an f_pos * value. @@ -518,5 +513,3 @@ static int ext3_release_dir (struct inod return 0; } - -#endif diff -puN fs/ext3/namei.c~ext3-remove-ifdef-config_ext3_index fs/ext3/namei.c --- a/fs/ext3/namei.c~ext3-remove-ifdef-config_ext3_index +++ a/fs/ext3/namei.c @@ -144,7 +144,6 @@ struct dx_map_entry u16 size; }; -#ifdef CONFIG_EXT3_INDEX static inline unsigned dx_get_block (struct dx_entry *entry); static void dx_set_block (struct dx_entry *entry, unsigned value); static inline unsigned dx_get_hash (struct dx_entry *entry); @@ -768,8 +767,6 @@ static void dx_insert_block(struct dx_fr dx_set_block(new, block); dx_set_count(entries, count + 1); } -#endif - static void ext3_update_dx_flag(struct inode *inode) { @@ -871,7 +868,6 @@ static struct buffer_head * ext3_find_en name = dentry-d_name.name; if (namelen EXT3_NAME_LEN) return NULL; -#ifdef CONFIG_EXT3_INDEX if (is_dx(dir)) { bh = ext3_dx_find_entry(dentry, res_dir, err); /* @@ -883,7 +879,6 @@ static struct buffer_head * ext3_find_en return bh; dxtrace(printk(ext3_find_entry: dx failed, falling back\n)); } -#endif nblocks = dir-i_size EXT3_BLOCK_SIZE_BITS(sb); start = EXT3_I(dir)-i_dir_start_lookup; if (start = nblocks) @@ -959,7 +954,6 @@ cleanup_and_exit: return ret; } -#ifdef CONFIG_EXT3_INDEX static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, struct ext3_dir_entry_2 **res_dir, int *err) { @@ -1027,7 +1021,6 @@ errout: dx_release (frames); return NULL; } -#endif static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd) { @@ -1123,7 +1116,6 @@ static inline void ext3_set_de_type(stru de-file_type = ext3_type_by_mode[(mode S_IFMT)S_SHIFT]; } -#ifdef CONFIG_EXT3_INDEX /* * Move count entries from end of map between two memory locations. * Returns pointer to last entry moved. @@ -1268,7 +1260,6 @@ errout: *error = err; return NULL; } -#endif /* @@ -1366,7 +1357,6 @@ static int add_dirent_to_buf(handle_t *h return 0; } -#ifdef CONFIG_EXT3_INDEX /* * This converts a one block unindexed directory to a 3 block indexed * directory, and adds the dentry to the indexed directory. @@ -1445,7 +1435,6 @@ static int make_indexed_dir(handle_t *ha return add_dirent_to_buf(handle, dentry, inode, de, bh); } -#endif /* * ext3_add_entry() @@ -1466,9 +1455,7 @@ static int ext3_add_entry (handle_t *han struct ext3_dir_entry_2 *de; struct super_block * sb; int retval; -#ifdef CONFIG_EXT3_INDEX int dx_fallback=0; -#endif unsigned blocksize; u32 block, blocks; @@ -1476,7 +1463,6 @@ static int ext3_add_entry (handle_t *han blocksize = sb-s_blocksize;
Re: How Inactive may be much greather than cached?
On Thursday 18 October 2007 17:14, Vasily Averin wrote: Nick Piggin wrote: Hi, On Thursday 18 October 2007 16:24, Vasily Averin wrote: Hi all, could anybody explain how inactive may be much greater than cached? stress test (http://weather.ou.edu/~apw/projects/stress/) that writes into removed files in cycle puts the node to the following state: MemTotal: 16401648 kB MemFree:636644 kB Buffers: 1122556 kB Cached: 362880 kB SwapCached:700 kB Active:1604180 kB Inactive: 13609828 kB At the first glance memory should be freed on file closing, nobody refers to file and ext3_delete_inode() truncates inode. We can see that memory is go away from cached, however could somebody explain why it become invalid instead be freed? Who holds the references to these pages? Buffers, swap cache, and anonymous. But buffers and swap cache are low (1.1 Gb and 700kB in this example) and anonymous should go away when process finished. Ah, I didn't see it was an order of magnitude out. Some filesystems, including I believe, ext3 with data=ordered, can leave orphaned pages around after they have been truncated out of the pagecache. These pages get left on the LRU and vmscan reclaims them pretty easily. Try ext3 data=writeback, or even ext2. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
- ext4-show-all-mount-options.patch removed from -mm tree
The patch titled ext4: show all mount options has been removed from the -mm tree. Its filename was ext4-show-all-mount-options.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext4: show all mount options From: Miklos Szeredi [EMAIL PROTECTED] Signed-off-by: Miklos Szeredi [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext4/super.c| 72 +++ include/linux/ext4_fs_sb.h |1 2 files changed, 73 insertions(+) diff -puN fs/ext4/super.c~ext4-show-all-mount-options fs/ext4/super.c --- a/fs/ext4/super.c~ext4-show-all-mount-options +++ a/fs/ext4/super.c @@ -596,9 +596,80 @@ static inline void ext4_show_quota_optio #endif } +/* + * Show an option if + * - it's set to a non-default value OR + * - if the per-sb default is different from the global default + */ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) { struct super_block *sb = vfs-mnt_sb; + struct ext4_sb_info *sbi = EXT4_SB(sb); + struct ext4_super_block *es = sbi-s_es; + unsigned long def_mount_opts; + + def_mount_opts = le32_to_cpu(es-s_default_mount_opts); + + if (sbi-s_sb_block != 1) + seq_printf(seq, ,sb=%llu, sbi-s_sb_block); + if (test_opt(sb, MINIX_DF)) + seq_puts(seq, ,minixdf); + if (test_opt(sb, GRPID)) + seq_puts(seq, ,grpid); + if (!test_opt(sb, GRPID) (def_mount_opts EXT4_DEFM_BSDGROUPS)) + seq_puts(seq, ,nogrpid); + if (sbi-s_resuid != EXT4_DEF_RESUID || + le16_to_cpu(es-s_def_resuid) != EXT4_DEF_RESUID) { + seq_printf(seq, ,resuid=%u, sbi-s_resuid); + } + if (sbi-s_resgid != EXT4_DEF_RESGID || + le16_to_cpu(es-s_def_resgid) != EXT4_DEF_RESGID) { + seq_printf(seq, ,resgid=%u, sbi-s_resgid); + } + if (test_opt(sb, ERRORS_CONT)) { + int def_errors = le16_to_cpu(es-s_errors); + + if (def_errors == EXT4_ERRORS_PANIC || + def_errors == EXT4_ERRORS_RO) { + seq_puts(seq, ,errors=continue); + } + } + if (test_opt(sb, ERRORS_RO)) + seq_puts(seq, ,errors=remount-ro); + if (test_opt(sb, ERRORS_PANIC)) + seq_puts(seq, ,errors=panic); + if (test_opt(sb, NO_UID32)) + seq_puts(seq, ,nouid32); + if (test_opt(sb, DEBUG)) + seq_puts(seq, ,debug); + if (test_opt(sb, OLDALLOC)) + seq_puts(seq, ,oldalloc); +#ifdef CONFIG_EXT4_FS_XATTR + if (test_opt(sb, XATTR_USER)) + seq_puts(seq, ,user_xattr); + if (!test_opt(sb, XATTR_USER) + (def_mount_opts EXT4_DEFM_XATTR_USER)) { + seq_puts(seq, ,nouser_xattr); + } +#endif +#ifdef CONFIG_EXT4_FS_POSIX_ACL + if (test_opt(sb, POSIX_ACL)) + seq_puts(seq, ,acl); + if (!test_opt(sb, POSIX_ACL) (def_mount_opts EXT4_DEFM_ACL)) + seq_puts(seq, ,noacl); +#endif + if (!test_opt(sb, RESERVATION)) + seq_puts(seq, ,noreservation); + if (sbi-s_commit_interval) { + seq_printf(seq, ,commit=%u, + (unsigned) (sbi-s_commit_interval / HZ)); + } + if (test_opt(sb, BARRIER)) + seq_puts(seq, ,barrier=1); + if (test_opt(sb, NOBH)) + seq_puts(seq, ,nobh); + if (!test_opt(sb, EXTENTS)) + seq_puts(seq, ,noextents); if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) seq_puts(seq, ,data=journal); @@ -1486,6 +1557,7 @@ static int ext4_fill_super (struct super sbi-s_mount_opt = 0; sbi-s_resuid = EXT4_DEF_RESUID; sbi-s_resgid = EXT4_DEF_RESGID; + sbi-s_sb_block = sb_block; unlock_kernel(); diff -puN include/linux/ext4_fs_sb.h~ext4-show-all-mount-options include/linux/ext4_fs_sb.h --- a/include/linux/ext4_fs_sb.h~ext4-show-all-mount-options +++ a/include/linux/ext4_fs_sb.h @@ -45,6 +45,7 @@ struct ext4_sb_info { struct ext4_super_block * s_es; /* Pointer to the super block in the buffer */ struct buffer_head ** s_group_desc; unsigned long s_mount_opt; + ext4_fsblk_t s_sb_block; uid_t s_resuid; gid_t s_resgid; unsigned short s_mount_state; _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch unprivileged-mounts-add-user-mounts-to-the-kernel.patch unprivileged-mounts-allow-unprivileged-umount.patch unprivileged-mounts-account-user-mounts.patch unprivileged-mounts-propagate-error-values-from-clone_mnt.patch unprivileged-mounts-allow-unprivileged-bind-mounts.patch unprivileged-mounts-put-declaration-of-put_filesystem-in-fsh.patch
- ext2-show-all-mount-options.patch removed from -mm tree
The patch titled ext2: show all mount options has been removed from the -mm tree. Its filename was ext2-show-all-mount-options.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext2: show all mount options From: Miklos Szeredi [EMAIL PROTECTED] Using mtab is problematic for various reasons, one of them is that unprivileged mounts won't turn up in there. So we want to get rid of it, and use /proc/mounts instead. But most filesystems are lazy, and are not showing all mount options. Which means, that without mtab, the user won't be able to see some or all of the options. It would be nice if the generic code could remember the mount options, and show them without the need to add extra code to filesystems. But this is not easy, because different filesystems handle mount options given options, and not tough the rest. This is not taken into account by mount(8) either, so /etc/mtab will be broken in this case. This series fixes up -show_options() in ext[234]. Signed-off-by: Miklos Szeredi [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext2/super.c| 61 +-- include/linux/ext2_fs_sb.h |1 2 files changed, 60 insertions(+), 2 deletions(-) diff -puN fs/ext2/super.c~ext2-show-all-mount-options fs/ext2/super.c --- a/fs/ext2/super.c~ext2-show-all-mount-options +++ a/fs/ext2/super.c @@ -203,10 +203,66 @@ static void ext2_clear_inode(struct inod static int ext2_show_options(struct seq_file *seq, struct vfsmount *vfs) { - struct ext2_sb_info *sbi = EXT2_SB(vfs-mnt_sb); + struct super_block *sb = vfs-mnt_sb; + struct ext2_sb_info *sbi = EXT2_SB(sb); + struct ext2_super_block *es = sbi-s_es; + unsigned long def_mount_opts; + + def_mount_opts = le32_to_cpu(es-s_default_mount_opts); - if (sbi-s_mount_opt EXT2_MOUNT_GRPID) + if (sbi-s_sb_block != 1) + seq_printf(seq, ,sb=%lu, sbi-s_sb_block); + if (test_opt(sb, MINIX_DF)) + seq_puts(seq, ,minixdf); + if (test_opt(sb, GRPID)) seq_puts(seq, ,grpid); + if (!test_opt(sb, GRPID) (def_mount_opts EXT2_DEFM_BSDGROUPS)) + seq_puts(seq, ,nogrpid); + if (sbi-s_resuid != EXT2_DEF_RESUID || + le16_to_cpu(es-s_def_resuid) != EXT2_DEF_RESUID) { + seq_printf(seq, ,resuid=%u, sbi-s_resuid); + } + if (sbi-s_resgid != EXT2_DEF_RESGID || + le16_to_cpu(es-s_def_resgid) != EXT2_DEF_RESGID) { + seq_printf(seq, ,resgid=%u, sbi-s_resgid); + } + if (test_opt(sb, ERRORS_CONT)) { + int def_errors = le16_to_cpu(es-s_errors); + + if (def_errors == EXT2_ERRORS_PANIC || + def_errors == EXT2_ERRORS_RO) { + seq_puts(seq, ,errors=continue); + } + } + if (test_opt(sb, ERRORS_RO)) + seq_puts(seq, ,errors=remount-ro); + if (test_opt(sb, ERRORS_PANIC)) + seq_puts(seq, ,errors=panic); + if (test_opt(sb, NO_UID32)) + seq_puts(seq, ,nouid32); + if (test_opt(sb, DEBUG)) + seq_puts(seq, ,debug); + if (test_opt(sb, OLDALLOC)) + seq_puts(seq, ,oldalloc); + +#ifdef CONFIG_EXT2_FS_XATTR + if (test_opt(sb, XATTR_USER)) + seq_puts(seq, ,user_xattr); + if (!test_opt(sb, XATTR_USER) + (def_mount_opts EXT2_DEFM_XATTR_USER)) { + seq_puts(seq, ,nouser_xattr); + } +#endif + +#ifdef CONFIG_EXT2_FS_POSIX_ACL + if (test_opt(sb, POSIX_ACL)) + seq_puts(seq, ,acl); + if (!test_opt(sb, POSIX_ACL) (def_mount_opts EXT2_DEFM_ACL)) + seq_puts(seq, ,noacl); +#endif + + if (test_opt(sb, NOBH)) + seq_puts(seq, ,nobh); #if defined(CONFIG_QUOTA) if (sbi-s_mount_opt EXT2_MOUNT_USRQUOTA) @@ -659,6 +715,7 @@ static int ext2_fill_super(struct super_ if (!sbi) return -ENOMEM; sb-s_fs_info = sbi; + sbi-s_sb_block = sb_block; /* * See what the current blocksize for the device is, and diff -puN include/linux/ext2_fs_sb.h~ext2-show-all-mount-options include/linux/ext2_fs_sb.h --- a/include/linux/ext2_fs_sb.h~ext2-show-all-mount-options +++ a/include/linux/ext2_fs_sb.h @@ -39,6 +39,7 @@ struct ext2_sb_info { struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */ struct buffer_head ** s_group_desc; unsigned long s_mount_opt; + unsigned long s_sb_block; uid_t s_resuid; gid_t s_resgid; unsigned short s_mount_state; _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch unprivileged-mounts-add-user-mounts-to-the-kernel.patch
- remove-unused-bh-in-calls-to-ext234_get_group_desc.patch removed from -mm tree
The patch titled remove unused bh in calls to ext234_get_group_desc has been removed from the -mm tree. Its filename was remove-unused-bh-in-calls-to-ext234_get_group_desc.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: remove unused bh in calls to ext234_get_group_desc From: Eric Sandeen [EMAIL PROTECTED] ext[234]_get_group_desc never tests the bh argument, and only sets it if it is passed in; it is perfectly happy with a NULL bh argument. But, many callers send one in and never use it. May as well call with NULL like other callers who don't use the bh. Signed-off-by: Eric Sandeen [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext2/ialloc.c | 24 fs/ext2/inode.c |2 +- fs/ext3/ialloc.c | 17 +++-- fs/ext4/ialloc.c | 17 +++-- 4 files changed, 23 insertions(+), 37 deletions(-) diff -puN fs/ext2/ialloc.c~remove-unused-bh-in-calls-to-ext234_get_group_desc fs/ext2/ialloc.c --- a/fs/ext2/ialloc.c~remove-unused-bh-in-calls-to-ext234_get_group_desc +++ a/fs/ext2/ialloc.c @@ -177,7 +177,6 @@ static void ext2_preread_inode(struct in unsigned long block_group; unsigned long offset; unsigned long block; - struct buffer_head *bh; struct ext2_group_desc * gdp; struct backing_dev_info *bdi; @@ -188,7 +187,7 @@ static void ext2_preread_inode(struct in return; block_group = (inode-i_ino - 1) / EXT2_INODES_PER_GROUP(inode-i_sb); - gdp = ext2_get_group_desc(inode-i_sb, block_group, bh); + gdp = ext2_get_group_desc(inode-i_sb, block_group, NULL); if (gdp == NULL) return; @@ -217,11 +216,10 @@ static int find_group_dir(struct super_b int ngroups = EXT2_SB(sb)-s_groups_count; int avefreei = ext2_count_free_inodes(sb) / ngroups; struct ext2_group_desc *desc, *best_desc = NULL; - struct buffer_head *bh, *best_bh = NULL; int group, best_group = -1; for (group = 0; group ngroups; group++) { - desc = ext2_get_group_desc (sb, group, bh); + desc = ext2_get_group_desc (sb, group, NULL); if (!desc || !desc-bg_free_inodes_count) continue; if (le16_to_cpu(desc-bg_free_inodes_count) avefreei) @@ -231,7 +229,6 @@ static int find_group_dir(struct super_b le16_to_cpu(best_desc-bg_free_blocks_count))) { best_group = group; best_desc = desc; - best_bh = bh; } } if (!best_desc) @@ -284,7 +281,6 @@ static int find_group_orlov(struct super int max_debt, max_dirs, min_blocks, min_inodes; int group = -1, i; struct ext2_group_desc *desc; - struct buffer_head *bh; freei = percpu_counter_read_positive(sbi-s_freeinodes_counter); avefreei = freei / ngroups; @@ -295,7 +291,6 @@ static int find_group_orlov(struct super if ((parent == sb-s_root-d_inode) || (EXT2_I(parent)-i_flags EXT2_TOPDIR_FL)) { struct ext2_group_desc *best_desc = NULL; - struct buffer_head *best_bh = NULL; int best_ndir = inodes_per_group; int best_group = -1; @@ -303,7 +298,7 @@ static int find_group_orlov(struct super parent_group = (unsigned)group % ngroups; for (i = 0; i ngroups; i++) { group = (parent_group + i) % ngroups; - desc = ext2_get_group_desc (sb, group, bh); + desc = ext2_get_group_desc (sb, group, NULL); if (!desc || !desc-bg_free_inodes_count) continue; if (le16_to_cpu(desc-bg_used_dirs_count) = best_ndir) @@ -315,11 +310,9 @@ static int find_group_orlov(struct super best_group = group; best_ndir = le16_to_cpu(desc-bg_used_dirs_count); best_desc = desc; - best_bh = bh; } if (best_group = 0) { desc = best_desc; - bh = best_bh; group = best_group; goto found; } @@ -345,7 +338,7 @@ static int find_group_orlov(struct super for (i = 0; i ngroups; i++) { group = (parent_group + i) % ngroups; - desc = ext2_get_group_desc (sb, group, bh); + desc = ext2_get_group_desc (sb, group, NULL); if (!desc || !desc-bg_free_inodes_count) continue; if (sbi-s_debts[group] = max_debt) @@ -362,7 +355,7 @@ static int find_group_orlov(struct super
- fix-f_version-type-should-be-u64-instead-of-unsigned-long.patch removed from -mm tree
The patch titled Fix f_version type: should be u64 instead of unsigned long has been removed from the -mm tree. Its filename was fix-f_version-type-should-be-u64-instead-of-unsigned-long.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: Fix f_version type: should be u64 instead of unsigned long From: Mathieu Desnoyers [EMAIL PROTECTED] Fix f_version type: should be u64 instead of long There is a type inconsistency between struct inode i_version and struct file f_version. fs.h: struct inode u64 i_version; and struct file unsigned long f_version; Users do: fs/ext3/dir.c: if (filp-f_version != inode-i_version) { So why isn't f_version a u64 ? It becomes a problem if versions gets higher than 2^32 and we are on an architecture where longs are 32 bits. This patch changes the f_version type to u64, and updates the users accordingly. It applies to 2.6.23-rc2-mm2. Signed-off-by: Mathieu Desnoyers [EMAIL PROTECTED] Cc: Martin Bligh [EMAIL PROTECTED] Cc: Randy.Dunlap [EMAIL PROTECTED] Cc: Al Viro [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Cc: Mark Fasheh [EMAIL PROTECTED] Cc: Christoph Hellwig [EMAIL PROTECTED] Cc: J. Bruce Fields [EMAIL PROTECTED] Cc: Trond Myklebust [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext3/dir.c|2 +- fs/ext4/dir.c|2 +- fs/ocfs2/dir.c | 10 +- fs/proc/base.c |4 ++-- include/linux/fs.h |2 +- include/linux/seq_file.h |2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff -puN fs/ext3/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long fs/ext3/dir.c --- a/fs/ext3/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long +++ a/fs/ext3/dir.c @@ -210,7 +210,7 @@ revalidate: * not the directory has been modified * during the copy operation. */ - unsigned long version = filp-f_version; + u64 version = filp-f_version; error = filldir(dirent, de-name, de-name_len, diff -puN fs/ext4/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long fs/ext4/dir.c --- a/fs/ext4/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long +++ a/fs/ext4/dir.c @@ -210,7 +210,7 @@ revalidate: * not the directory has been modified * during the copy operation. */ - unsigned long version = filp-f_version; + u64 version = filp-f_version; error = filldir(dirent, de-name, de-name_len, diff -puN fs/ocfs2/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long fs/ocfs2/dir.c --- a/fs/ocfs2/dir.c~fix-f_version-type-should-be-u64-instead-of-unsigned-long +++ a/fs/ocfs2/dir.c @@ -586,7 +586,7 @@ bail: } static int ocfs2_dir_foreach_blk_id(struct inode *inode, - unsigned long *f_version, + u64 *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -648,7 +648,7 @@ revalidate: * not the directory has been modified * during the copy operation. */ - unsigned long version = *f_version; + u64 version = *f_version; unsigned char d_type = DT_UNKNOWN; if (de-file_type OCFS2_FT_MAX) @@ -677,7 +677,7 @@ out: } static int ocfs2_dir_foreach_blk_el(struct inode *inode, - unsigned long *f_version, + u64 *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -798,7 +798,7 @@ out: return stored; } -static int ocfs2_dir_foreach_blk(struct inode *inode, unsigned long *f_version, +static int ocfs2_dir_foreach_blk(struct inode *inode, u64 *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -818,7 +818,7 @@ int ocfs2_dir_foreach(struct inode *inod filldir_t filldir) { int ret = 0, filldir_err = 0; - unsigned long version = inode-i_version; + u64 version = inode-i_version; while (*f_pos i_size_read(inode)) { ret = ocfs2_dir_foreach_blk(inode, version, f_pos, priv, diff -puN
- ext3-show-all-mount-options.patch removed from -mm tree
The patch titled ext3: show all mount options has been removed from the -mm tree. Its filename was ext3-show-all-mount-options.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext3: show all mount options From: Miklos Szeredi [EMAIL PROTECTED] Signed-off-by: Miklos Szeredi [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext3/super.c| 70 +++ include/linux/ext3_fs_sb.h |1 2 files changed, 71 insertions(+) diff -puN fs/ext3/super.c~ext3-show-all-mount-options fs/ext3/super.c --- a/fs/ext3/super.c~ext3-show-all-mount-options +++ a/fs/ext3/super.c @@ -545,9 +545,78 @@ static inline void ext3_show_quota_optio #endif } +/* + * Show an option if + * - it's set to a non-default value OR + * - if the per-sb default is different from the global default + */ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) { struct super_block *sb = vfs-mnt_sb; + struct ext3_sb_info *sbi = EXT3_SB(sb); + struct ext3_super_block *es = sbi-s_es; + unsigned long def_mount_opts; + + def_mount_opts = le32_to_cpu(es-s_default_mount_opts); + + if (sbi-s_sb_block != 1) + seq_printf(seq, ,sb=%lu, sbi-s_sb_block); + if (test_opt(sb, MINIX_DF)) + seq_puts(seq, ,minixdf); + if (test_opt(sb, GRPID)) + seq_puts(seq, ,grpid); + if (!test_opt(sb, GRPID) (def_mount_opts EXT3_DEFM_BSDGROUPS)) + seq_puts(seq, ,nogrpid); + if (sbi-s_resuid != EXT3_DEF_RESUID || + le16_to_cpu(es-s_def_resuid) != EXT3_DEF_RESUID) { + seq_printf(seq, ,resuid=%u, sbi-s_resuid); + } + if (sbi-s_resgid != EXT3_DEF_RESGID || + le16_to_cpu(es-s_def_resgid) != EXT3_DEF_RESGID) { + seq_printf(seq, ,resgid=%u, sbi-s_resgid); + } + if (test_opt(sb, ERRORS_CONT)) { + int def_errors = le16_to_cpu(es-s_errors); + + if (def_errors == EXT3_ERRORS_PANIC || + def_errors == EXT3_ERRORS_RO) { + seq_puts(seq, ,errors=continue); + } + } + if (test_opt(sb, ERRORS_RO)) + seq_puts(seq, ,errors=remount-ro); + if (test_opt(sb, ERRORS_PANIC)) + seq_puts(seq, ,errors=panic); + if (test_opt(sb, NO_UID32)) + seq_puts(seq, ,nouid32); + if (test_opt(sb, DEBUG)) + seq_puts(seq, ,debug); + if (test_opt(sb, OLDALLOC)) + seq_puts(seq, ,oldalloc); +#ifdef CONFIG_EXT3_FS_XATTR + if (test_opt(sb, XATTR_USER)) + seq_puts(seq, ,user_xattr); + if (!test_opt(sb, XATTR_USER) + (def_mount_opts EXT3_DEFM_XATTR_USER)) { + seq_puts(seq, ,nouser_xattr); + } +#endif +#ifdef CONFIG_EXT3_FS_POSIX_ACL + if (test_opt(sb, POSIX_ACL)) + seq_puts(seq, ,acl); + if (!test_opt(sb, POSIX_ACL) (def_mount_opts EXT3_DEFM_ACL)) + seq_puts(seq, ,noacl); +#endif + if (!test_opt(sb, RESERVATION)) + seq_puts(seq, ,noreservation); + if (sbi-s_commit_interval) { + seq_printf(seq, ,commit=%u, + (unsigned) (sbi-s_commit_interval / HZ)); + } + if (test_opt(sb, BARRIER)) + seq_puts(seq, ,barrier=1); + if (test_opt(sb, NOBH)) + seq_puts(seq, ,nobh); if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) seq_puts(seq, ,data=journal); @@ -1425,6 +1494,7 @@ static int ext3_fill_super (struct super sbi-s_mount_opt = 0; sbi-s_resuid = EXT3_DEF_RESUID; sbi-s_resgid = EXT3_DEF_RESGID; + sbi-s_sb_block = sb_block; unlock_kernel(); diff -puN include/linux/ext3_fs_sb.h~ext3-show-all-mount-options include/linux/ext3_fs_sb.h --- a/include/linux/ext3_fs_sb.h~ext3-show-all-mount-options +++ a/include/linux/ext3_fs_sb.h @@ -44,6 +44,7 @@ struct ext3_sb_info { struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */ struct buffer_head ** s_group_desc; unsigned long s_mount_opt; + ext3_fsblk_t s_sb_block; uid_t s_resuid; gid_t s_resgid; unsigned short s_mount_state; _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch unprivileged-mounts-add-user-mounts-to-the-kernel.patch unprivileged-mounts-allow-unprivileged-umount.patch unprivileged-mounts-account-user-mounts.patch unprivileged-mounts-propagate-error-values-from-clone_mnt.patch unprivileged-mounts-allow-unprivileged-bind-mounts.patch unprivileged-mounts-put-declaration-of-put_filesystem-in-fsh.patch unprivileged-mounts-allow-unprivileged-mounts.patch
Re: [PATCH 2/2] ext2: Avoid rec_len overflow with 64KB block size
On Wed, 17 Oct 2007, Andrew Morton wrote: b) what happens when an old ext2 driver tries to read and/or write this directory entry? Do we need a compat flag for it? Old ext2 only supports up to 4k include/linux/ext2_fs.h: #define EXT2_MIN_BLOCK_SIZE 1024 #define EXT2_MAX_BLOCK_SIZE 4096 #define EXT2_MIN_BLOCK_LOG_SIZE 10 Should fail to mount the volume since the block size is too large. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 2/2] ext2: Avoid rec_len overflow with 64KB block size
On Thu, 18 Oct 2007 02:03:39 -0700 (PDT) Christoph Lameter [EMAIL PROTECTED] wrote: On Wed, 17 Oct 2007, Andrew Morton wrote: b) what happens when an old ext2 driver tries to read and/or write this directory entry? Do we need a compat flag for it? Old ext2 only supports up to 4k include/linux/ext2_fs.h: #define EXT2_MIN_BLOCK_SIZE 1024 #define EXT2_MAX_BLOCK_SIZE 4096 #define EXT2_MIN_BLOCK_LOG_SIZE 10 Should fail to mount the volume since the block size is too large. should, but does it? box:/usr/src/25 grep MAX_BLOCK_SIZE fs/ext2/*.[ch] include/linux/ext2* include/linux/ext2_fs.h:#define EXT2_MAX_BLOCK_SIZE 4096 box:/usr/src/25 - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[patch 129/155] ext3: fix setup_new_group_blocks locking
From: Eric Sandeen [EMAIL PROTECTED] setup_new_group_blocks() manipulates the group descriptor block bh under the block_bitmap bh's lock. It shouldn't matter since nobody but resize should be touching these blocks, but it's worth fixing up. Signed-off-by: Eric Sandeen [EMAIL PROTECTED] C: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext3/resize.c |6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff -puN fs/ext3/resize.c~ext3-fix-setup_new_group_blocks-locking fs/ext3/resize.c --- a/fs/ext3/resize.c~ext3-fix-setup_new_group_blocks-locking +++ a/fs/ext3/resize.c @@ -245,10 +245,10 @@ static int setup_new_group_blocks(struct brelse(gdb); goto exit_bh; } - lock_buffer(bh); - memcpy(gdb-b_data, sbi-s_group_desc[i]-b_data, bh-b_size); + lock_buffer(gdb); + memcpy(gdb-b_data, sbi-s_group_desc[i]-b_data, gdb-b_size); set_buffer_uptodate(gdb); - unlock_buffer(bh); + unlock_buffer(gdb); ext3_journal_dirty_metadata(handle, gdb); ext3_set_bit(bit, bh-b_data); brelse(gdb); _ - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[RFC][PATCH 2/6] ext4: code cleanup
Fix sparse warnings. Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] --- fs/ext4/extents.c |6 +++--- fs/ext4/inode.c | 14 -- include/linux/ext4_fs.h |2 ++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 392b76e..ce58d45 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -1230,7 +1230,7 @@ static ext4_lblk_t ext4_ext_next_leaf_block(struct inode *inode, * then we have to correct all indexes above. * TODO: do we need to correct tree in all cases? */ -int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode, +static int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode, struct ext4_ext_path *path) { struct ext4_extent_header *eh; @@ -1677,7 +1677,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block, * It's used in truncate case only, thus all requests are for * last index in the block only. */ -int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, +static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, struct ext4_ext_path *path) { struct buffer_head *bh; @@ -1947,7 +1947,7 @@ ext4_ext_more_to_rm(struct ext4_ext_path *path) return 1; } -int ext4_ext_remove_space(struct inode *inode, unsigned long start) +static int ext4_ext_remove_space(struct inode *inode, unsigned long start) { struct super_block *sb = inode-i_sb; int depth = ext_depth(inode); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index a557c5c..8908ab3 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2159,11 +2159,11 @@ static void ext4_clear_blocks(handle_t *handle, struct inode *inode, for (p = first; p last; p++) { u32 nr = le32_to_cpu(*p); if (nr) { - struct buffer_head *bh; + struct buffer_head *tbh; *p = 0; - bh = sb_find_get_block(inode-i_sb, nr); - ext4_forget(handle, 0, inode, bh, nr); + tbh = sb_find_get_block(inode-i_sb, nr); + ext4_forget(handle, 0, inode, tbh, nr); } } @@ -2431,8 +2431,10 @@ void ext4_truncate(struct inode *inode) return; } - if (EXT4_I(inode)-i_flags EXT4_EXTENTS_FL) - return ext4_ext_truncate(inode, page); + if (EXT4_I(inode)-i_flags EXT4_EXTENTS_FL) { + ext4_ext_truncate(inode, page); + return; + } handle = start_transaction(inode); if (IS_ERR(handle)) { @@ -3283,7 +3285,7 @@ ext4_reserve_inode_write(handle_t *handle, struct inode *inode, * Expand an inode by new_extra_isize bytes. * Returns 0 on success or negative error number on failure. */ -int ext4_expand_extra_isize(struct inode *inode, unsigned int new_extra_isize, +static int ext4_expand_extra_isize(struct inode *inode, unsigned int new_extra_isize, struct ext4_iloc iloc, handle_t *handle) { struct ext4_inode *raw_inode; diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index f6d4b4c..514464d 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h @@ -928,6 +928,8 @@ extern ext4_fsblk_t ext4_new_block (handle_t *handle, struct inode *inode, ext4_fsblk_t goal, int *errp); extern ext4_fsblk_t ext4_new_blocks (handle_t *handle, struct inode *inode, ext4_fsblk_t goal, unsigned long *count, int *errp); +extern ext4_fsblk_t ext4_new_blocks_old (handle_t *handle, struct inode *inode, + ext4_fsblk_t goal, unsigned long *count, int *errp); extern void ext4_free_blocks (handle_t *handle, struct inode *inode, ext4_fsblk_t block, unsigned long count, int metadata); extern void ext4_free_blocks_sb (handle_t *handle, struct super_block *sb, -- 1.5.3.4.206.g58ba4-dirty - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[RFC][PATCH 3/6] ext4: Code cleanup
rename i_file_acl to i_file_acl_lo Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] --- fs/ext4/inode.c |4 ++-- include/linux/ext4_fs.h |2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 8908ab3..ef073df 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2825,7 +2825,7 @@ void ext4_read_inode(struct inode * inode) } inode-i_blocks = le32_to_cpu(raw_inode-i_blocks); ei-i_flags = le32_to_cpu(raw_inode-i_flags); - ei-i_file_acl = le32_to_cpu(raw_inode-i_file_acl); + ei-i_file_acl = le32_to_cpu(raw_inode-i_file_acl_lo); if (EXT4_SB(inode-i_sb)-s_es-s_creator_os != cpu_to_le32(EXT4_OS_HURD)) ei-i_file_acl |= @@ -2980,7 +2980,7 @@ static int ext4_do_update_inode(handle_t *handle, cpu_to_le32(EXT4_OS_HURD)) raw_inode-i_file_acl_high = cpu_to_le16(ei-i_file_acl 32); - raw_inode-i_file_acl = cpu_to_le32(ei-i_file_acl); + raw_inode-i_file_acl_lo = cpu_to_le32(ei-i_file_acl); if (!S_ISREG(inode-i_mode)) { raw_inode-i_dir_acl = cpu_to_le32(ei-i_dir_acl); } else { diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index 514464d..6464ff9 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h @@ -325,7 +325,7 @@ struct ext4_inode { } osd1; /* OS dependent 1 */ __le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */ __le32 i_generation; /* File version (for NFS) */ - __le32 i_file_acl; /* File ACL */ + __le32 i_file_acl_lo; /* File ACL */ __le32 i_dir_acl; /* Directory ACL */ __le32 i_obso_faddr; /* Obsoleted fragment address */ union { -- 1.5.3.4.206.g58ba4-dirty - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[RFC][PATCH 4/6] ext4: code cleanup
rename ext4_inode.i_dir_acl to i_size_high drop ext4_inode_info.i_dir_acl as it is not used Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] --- fs/ext4/ialloc.c |1 - fs/ext4/inode.c | 55 ++--- include/linux/ext4_fs.h | 15 +-- include/linux/ext4_fs_i.h |1 - 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index de40401..d775170 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -708,7 +708,6 @@ got: if (!S_ISDIR(mode)) ei-i_flags = ~EXT4_DIRSYNC_FL; ei-i_file_acl = 0; - ei-i_dir_acl = 0; ei-i_dtime = 0; ei-i_block_alloc_info = NULL; ei-i_block_group = group; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ef073df..39859cf 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2801,7 +2801,6 @@ void ext4_read_inode(struct inode * inode) inode-i_gid |= le16_to_cpu(raw_inode-i_gid_high) 16; } inode-i_nlink = le16_to_cpu(raw_inode-i_links_count); - inode-i_size = le32_to_cpu(raw_inode-i_size); ei-i_state = 0; ei-i_dir_start_lookup = 0; @@ -2827,15 +2826,11 @@ void ext4_read_inode(struct inode * inode) ei-i_flags = le32_to_cpu(raw_inode-i_flags); ei-i_file_acl = le32_to_cpu(raw_inode-i_file_acl_lo); if (EXT4_SB(inode-i_sb)-s_es-s_creator_os != - cpu_to_le32(EXT4_OS_HURD)) + cpu_to_le32(EXT4_OS_HURD)) { ei-i_file_acl |= ((__u64)le16_to_cpu(raw_inode-i_file_acl_high)) 32; - if (!S_ISREG(inode-i_mode)) { - ei-i_dir_acl = le32_to_cpu(raw_inode-i_dir_acl); - } else { - inode-i_size |= - ((__u64)le32_to_cpu(raw_inode-i_size_high)) 32; } + inode-i_size = ext4_isize(raw_inode); ei-i_disksize = inode-i_size; inode-i_generation = le32_to_cpu(raw_inode-i_generation); ei-i_block_group = iloc.block_group; @@ -2966,7 +2961,6 @@ static int ext4_do_update_inode(handle_t *handle, raw_inode-i_gid_high = 0; } raw_inode-i_links_count = cpu_to_le16(inode-i_nlink); - raw_inode-i_size = cpu_to_le32(ei-i_disksize); EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); @@ -2981,32 +2975,27 @@ static int ext4_do_update_inode(handle_t *handle, raw_inode-i_file_acl_high = cpu_to_le16(ei-i_file_acl 32); raw_inode-i_file_acl_lo = cpu_to_le32(ei-i_file_acl); - if (!S_ISREG(inode-i_mode)) { - raw_inode-i_dir_acl = cpu_to_le32(ei-i_dir_acl); - } else { - raw_inode-i_size_high = - cpu_to_le32(ei-i_disksize 32); - if (ei-i_disksize 0x7fffULL) { - struct super_block *sb = inode-i_sb; - if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, - EXT4_FEATURE_RO_COMPAT_LARGE_FILE) || - EXT4_SB(sb)-s_es-s_rev_level == - cpu_to_le32(EXT4_GOOD_OLD_REV)) { - /* If this is the first large file - * created, add a flag to the superblock. - */ - err = ext4_journal_get_write_access(handle, - EXT4_SB(sb)-s_sbh); - if (err) - goto out_brelse; - ext4_update_dynamic_rev(sb); - EXT4_SET_RO_COMPAT_FEATURE(sb, + ext4_isize_set(raw_inode, ei-i_disksize); + if (ei-i_disksize 0x7fffULL) { + struct super_block *sb = inode-i_sb; + if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, + EXT4_FEATURE_RO_COMPAT_LARGE_FILE) || + EXT4_SB(sb)-s_es-s_rev_level == + cpu_to_le32(EXT4_GOOD_OLD_REV)) { + /* If this is the first large file +* created, add a flag to the superblock. +*/ + err = ext4_journal_get_write_access(handle, + EXT4_SB(sb)-s_sbh); + if (err) + goto out_brelse; + ext4_update_dynamic_rev(sb); + EXT4_SET_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_LARGE_FILE); - sb-s_dirt = 1; - handle-h_sync = 1; - err = ext4_journal_dirty_metadata(handle, - EXT4_SB(sb)-s_sbh); -
[RFC][PATCH 6/6] ext4: Support large files
This patch converts ext4_inode i_blocks to represent total blocks occupied by the inode in file system block size. Earlier the variable used to represent this in 512 byte block size. This actually limited the total size of the file. The feature is enabled transparently when we write an inode whose i_blocks cannot be represnted as 512 byte units in a 48 bit variable. inode flag EXT4_HUGE_FILE_FL Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] --- fs/ext4/inode.c | 34 ++ fs/ext4/super.c |9 ++--- include/linux/ext4_fs.h |3 ++- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 98dbcb7..479d9b1 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2778,14 +2778,20 @@ static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode, struct ext4_inode_info *ei) { blkcnt_t i_blocks ; - struct super_block *sb = ei-vfs_inode.i_sb; + struct inode *inode = (ei-vfs_inode); + struct super_block *sb = inode-i_sb; if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { /* we are using combined 48 bit field */ i_blocks = ((u64)le16_to_cpu(raw_inode-i_blocks_high)) 32 | le32_to_cpu(raw_inode-i_blocks_lo); - return i_blocks; + if (ei-i_flags EXT4_HUGE_FILE_FL) { + /* i_blocks represent file system block size */ + return i_blocks (inode-i_blkbits - 9); + } else { + return i_blocks; + } } else { return le32_to_cpu(raw_inode-i_blocks_lo); } @@ -2943,8 +2949,9 @@ static int ext4_inode_blocks_set(handle_t *handle, * i_blocks can be represnted in a 32 bit variable * as multiple of 512 bytes */ - raw_inode-i_blocks_lo = cpu_to_le32((u32)i_blocks); + raw_inode-i_blocks_lo = cpu_to_le32(i_blocks); raw_inode-i_blocks_high = 0; + ei-i_flags = ~EXT4_HUGE_FILE_FL; } else if (i_blocks = 0xULL) { /* * i_blocks can be represented in a 48 bit variable @@ -2955,12 +2962,23 @@ static int ext4_inode_blocks_set(handle_t *handle, if (err) goto err_out; /* i_block is stored in the split 48 bit fields */ - raw_inode-i_blocks_lo = cpu_to_le32((u32)i_blocks); + raw_inode-i_blocks_lo = cpu_to_le32(i_blocks); + raw_inode-i_blocks_high = cpu_to_le16(i_blocks 32); + ei-i_flags = ~EXT4_HUGE_FILE_FL; + } else { + /* +* i_blocks should be represented in a 48 bit variable +* as multiple of file system block size +*/ + err = ext4_update_rocompat_feature(handle, sb, + EXT4_FEATURE_RO_COMPAT_HUGE_FILE); + if (err) + goto err_out; + ei-i_flags |= EXT4_HUGE_FILE_FL; + /* i_block is stored in file system block size */ + i_blocks = i_blocks (inode-i_blkbits - 9); + raw_inode-i_blocks_lo = cpu_to_le32(i_blocks); raw_inode-i_blocks_high = cpu_to_le16(i_blocks 32); - }else { - ext4_error(sb, __FUNCTION__, - Wrong inode i_blocks count %llu\n, - (unsigned long long)inode-i_blocks); } err_out: return err; diff --git a/fs/ext4/super.c b/fs/ext4/super.c index fee3bd7..801c499 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1660,11 +1660,14 @@ static loff_t ext4_max_size(int bits) upper_limit = (bits - 9); } else { - /* We use 48 bit ext4_inode i_blocks */ + /* +* We use 48 bit ext4_inode i_blocks +* With EXT4_HUGE_FILE_FL set the i_blocks +* represent total number of blocks in +* file system block size +*/ upper_limit = (1LL 48) - 1; - /* total blocks in file system block size */ - upper_limit = (bits - 9); } /* indirect blocks */ diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index 8d55c16..71f0569 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h @@ -205,8 +205,9 @@ struct ext4_group_desc #define EXT4_NOTAIL_FL 0x8000 /* file tail should not be merged */ #define EXT4_DIRSYNC_FL0x0001 /* dirsync behaviour (directories only) */ #define EXT4_TOPDIR_FL 0x0002 /* Top of
[RFC][PATCH 5/6] ext4: Add support for 48 bit inode i_blocks.
use the __le16 l_i_reserved1 field of the linux2 struct of ext4_inode to represet the higher 16 bits for i_blocks. With this change max_file size becomes (2**48 -1 )* 512 bytes. We add a RO_COMPAT feature to the super block to indicate that inode have i_blocks represented as a split 48 bits. Super block with this feature set cannot be mounted read write on a kernel with CONFIG_LSF disabled. Super block flag EXT4_FEATURE_RO_COMPAT_HUGE_FILE Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] --- fs/ext4/inode.c | 58 ++- fs/ext4/super.c | 62 ++ include/linux/ext4_fs.h | 10 +-- 3 files changed, 119 insertions(+), 11 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 39859cf..98dbcb7 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2774,6 +2774,22 @@ void ext4_get_inode_flags(struct ext4_inode_info *ei) if (flags S_DIRSYNC) ei-i_flags |= EXT4_DIRSYNC_FL; } +static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode, + struct ext4_inode_info *ei) +{ + blkcnt_t i_blocks ; + struct super_block *sb = ei-vfs_inode.i_sb; + + if (EXT4_HAS_RO_COMPAT_FEATURE(sb, + EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) { + /* we are using combined 48 bit field */ + i_blocks = ((u64)le16_to_cpu(raw_inode-i_blocks_high)) 32 | + le32_to_cpu(raw_inode-i_blocks_lo); + return i_blocks; + } else { + return le32_to_cpu(raw_inode-i_blocks_lo); + } +} void ext4_read_inode(struct inode * inode) { @@ -2822,8 +2838,8 @@ void ext4_read_inode(struct inode * inode) * recovery code: that's fine, we're about to complete * the process of deleting those. */ } - inode-i_blocks = le32_to_cpu(raw_inode-i_blocks); ei-i_flags = le32_to_cpu(raw_inode-i_flags); + inode-i_blocks = ext4_inode_blocks(raw_inode, ei); ei-i_file_acl = le32_to_cpu(raw_inode-i_file_acl_lo); if (EXT4_SB(inode-i_sb)-s_es-s_creator_os != cpu_to_le32(EXT4_OS_HURD)) { @@ -2913,6 +2929,43 @@ bad_inode: return; } +static int ext4_inode_blocks_set(handle_t *handle, + struct ext4_inode *raw_inode, + struct ext4_inode_info *ei) +{ + struct inode *inode = (ei-vfs_inode); + u64 i_blocks = inode-i_blocks; + struct super_block *sb = inode-i_sb; + int err = 0; + + if (i_blocks = ~0U) { + /* +* i_blocks can be represnted in a 32 bit variable +* as multiple of 512 bytes +*/ + raw_inode-i_blocks_lo = cpu_to_le32((u32)i_blocks); + raw_inode-i_blocks_high = 0; + } else if (i_blocks = 0xULL) { + /* +* i_blocks can be represented in a 48 bit variable +* as multiple of 512 bytes +*/ + err = ext4_update_rocompat_feature(handle, sb, + EXT4_FEATURE_RO_COMPAT_HUGE_FILE); + if (err) + goto err_out; + /* i_block is stored in the split 48 bit fields */ + raw_inode-i_blocks_lo = cpu_to_le32((u32)i_blocks); + raw_inode-i_blocks_high = cpu_to_le16(i_blocks 32); + }else { + ext4_error(sb, __FUNCTION__, + Wrong inode i_blocks count %llu\n, + (unsigned long long)inode-i_blocks); + } +err_out: + return err; +} + /* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the @@ -2967,7 +3020,8 @@ static int ext4_do_update_inode(handle_t *handle, EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); EXT4_EINODE_SET_XTIME(i_crtime, ei, raw_inode); - raw_inode-i_blocks = cpu_to_le32(inode-i_blocks); + if (ext4_inode_blocks_set(handle, raw_inode, ei)) + goto out_brelse; raw_inode-i_dtime = cpu_to_le32(ei-i_dtime); raw_inode-i_flags = cpu_to_le32(ei-i_flags); if (EXT4_SB(inode-i_sb)-s_es-s_creator_os != diff --git a/fs/ext4/super.c b/fs/ext4/super.c index e2bed20..fee3bd7 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1632,17 +1632,50 @@ static void ext4_orphan_cleanup (struct super_block * sb, /* * Maximal file size. There is a direct, and {,double-,triple-}indirect - * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks. - * We need to be 1 filesystem block less than the 2^32 sector limit. + * block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks. + * We need to be 1 filesystem block less
Re: How Inactive may be much greather than cached?
Nick Piggin wrote: Some filesystems, including I believe, ext3 with data=ordered, can leave orphaned pages around after they have been truncated out of the pagecache. These pages get left on the LRU and vmscan reclaims them pretty easily. Try ext3 data=writeback, or even ext2. thanks, data=writeback helps. Resume: ext3 with data=ordered gets bh with data and moves it to journal transaction. If transaction handled immediately, ext3 frees bh on this page, and then frees this page. However if journal delays processing of this transaction, ext3 cannot free bh that is still busy. Later jbd layer decrements bh counter but it makes nothing with data page that is not freed and stays inactive. - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
patch queue updates
Hi Mingming, The patch queue updated on top of d85714d81cc0408daddb68c10f7fd69eafe7c213 The commit d85714d81cc0408daddb68c10f7fd69eafe7c213 contain changes that Andrew pushed to linus which had conflicts with patches in the patch queue. The update fixes them. Changes a) ext4_grpnum_t.patch got updated to take care of conflicts. b) The ext4-cleanup.patch is split into 4 small patches. ext4-cleanup.patch ext4-cleanup-2.patch ext4-cleanup-3.patch ext4-cleanup-4.patch c) mballoc-core.patch updated to fix compile error. The series can be found at http://www.radian.org/~kvaneesh/ext4/oct-18-2007/ http://www.radian.org/~kvaneesh/ext4/oct-18-2007/patch-series.tar -aneesh - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: How Inactive may be much greather than cached?
On Thu, 18 Oct 2007 17:27:00 +1000 Nick Piggin [EMAIL PROTECTED] wrote: Some filesystems, including I believe, ext3 with data=ordered, can leave orphaned pages around after they have been truncated out of the pagecache. These pages get left on the LRU and vmscan reclaims them pretty easily. How can the VM recognize those pages? Are they part of the buffer cache, part of the page cache, or different? I think it would make sense to at least try to rotate those pages to the end of the LRU so kswapd can get rid of them quickly. -- Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. - Brian W. Kernighan - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: ext3 warnings from LTP rename14
Andreas Dilger wrote: It is probably significant that the original machine is a sparc32 (big endian). Oh, true. I'd suspect you can reproduce this on a PPC system also. You might also consider running sparse on it ext3/ext4 in case you missed an le32_to_cpu() or something. sparse checks out ok... and, -rc6 which did not have that change showed the same behavior -Eric - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
can not find some patches from patch queue on ext4 git tree
Hi, my local ext4 git tree is from git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git, with commit commit d85714d81cc0408daddb68c10f7fd69eafe7c213. It seems some of patchese of patch queue are not in current tree, which were there 1 - 2 days ago. Is it because we are merging ext4 tree to 2.6.23 ? and after the merge, the patches will in pached in the tree again ? Should I generate my patch based on current version, or wait for some day ? Indeed, I try to add my patch to current version, but some patches missing from ext4 tree. Thanks for information :-) -- Coly Li SuSE PRC Labs - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: can not find some patches from patch queue on ext4 git tree
On Fri, Oct 19, 2007 at 01:41:00AM +0800, Coly Li wrote: Hi, my local ext4 git tree is from git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git, with commit commit d85714d81cc0408daddb68c10f7fd69eafe7c213. It seems some of patchese of patch queue are not in current tree, which were there 1 - 2 days ago. Is it because we are merging ext4 tree to 2.6.23 ? and after the merge, the patches will in pached in the tree again ? Should I generate my patch based on current version, or wait for some day ? Indeed, I try to add my patch to current version, but some patches missing from ext4 tree. You're apparently looking at the master branch of ext4.git. There are multiple branch heads, and the master branch head moves around a lot. If you look at the web page, it might be clearer: http://git.kernel.org/?p=linux/kernel/git/tytso/ext4.git At the bottom of the page, there is a list of branch heads. 2.6.23-ext4-1 was the last ext4 snapshot that we published. The for_linus branch contains the stable version of the patch queue that I have requested that Linus pull from. The master branch is one that I haven't been careful about maintaining stably, although maybe I should be more careful about that, since it's one people tend to use by default. OK, it's fixed. I've repointed the master pointer to point at 2.6.23-ext4-1. Sorry about any confusion that this might have caused. Right now, during the merge window, things are a little crazy, just because patches are flowing in from the -mm tree as well as from the ext4 tree. So it's probably easier to do your development against 2.6.23-ext4-1 and then after the merge carnage settles down, we can fix up the patch. If it's easier, you can also see the ext4 patches as a quilt stack here: http://repo.or.cz/w/ext4-patch-queue.git git://repo.or.cz/ext4-patch-queue.git It's currently in a state of flux as well as we're waiting for patches to get merged, but hopefully that will settle down within a day or two. To explain how things work, a number of people have write access into the ext4-patch-queue, and it gets run through an automated test system located at IBM (both the whole patch queue, as well as the first part up to the stable boundary, which is the list of patches we plan to push to Linus). This allows us to work in parallel cleaning up varoius patches, and periodically I'll generate an ext4 patch series which is what gets pulled into the -mm tree for testing. This all works pretty well, except during the merge window; but fortunately that's a relaively short period of time. Regards, - Ted - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
- ext3-support-large-blocksize-up-to-pagesize.patch removed from -mm tree
The patch titled ext3: support large blocksize up to PAGESIZE has been removed from the -mm tree. Its filename was ext3-support-large-blocksize-up-to-pagesize.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext3: support large blocksize up to PAGESIZE From: Takashi Sato [EMAIL PROTECTED] This patch set supports large block size(4k, =64k) in ext3 just enlarging the block size limit. But it is NOT possible to have 64kB blocksize on ext3 without some changes to the directory handling code. The reason is that an empty 64kB directory block would have a rec_len == (__u16)2^16 == 0, and this would cause an error to be hit in the filesystem. The proposed solution is treat 64k rec_len with a an impossible value like rec_len = 0x to handle this. The Patch-set consists of the following 2 patches. [1/2] ext3: enlarge blocksize - Allow blocksize up to pagesize [2/2] ext3: fix rec_len overflow - prevent rec_len from overflow with 64KB blocksize Now on 64k page ppc64 box runs with this patch set we could create a 64k block size ext3, and able to handle empty directory block. Signed-off-by: Takashi Sato [EMAIL PROTECTED] Signed-off-by: Mingming Cao [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Acked-by: Christoph Lameter [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext3/super.c |6 +- include/linux/ext3_fs.h |4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff -puN fs/ext3/super.c~ext3-support-large-blocksize-up-to-pagesize fs/ext3/super.c --- a/fs/ext3/super.c~ext3-support-large-blocksize-up-to-pagesize +++ a/fs/ext3/super.c @@ -1620,7 +1620,11 @@ static int ext3_fill_super (struct super } brelse (bh); - sb_set_blocksize(sb, blocksize); + if (!sb_set_blocksize(sb, blocksize)) { + printk(KERN_ERR EXT3-fs: bad blocksize %d.\n, + blocksize); + goto out_fail; + } logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize; offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize; bh = sb_bread(sb, logic_sb_block); diff -puN include/linux/ext3_fs.h~ext3-support-large-blocksize-up-to-pagesize include/linux/ext3_fs.h --- a/include/linux/ext3_fs.h~ext3-support-large-blocksize-up-to-pagesize +++ a/include/linux/ext3_fs.h @@ -72,8 +72,8 @@ * Macro-instructions used to manage several block sizes */ #define EXT3_MIN_BLOCK_SIZE1024 -#defineEXT3_MAX_BLOCK_SIZE 4096 -#define EXT3_MIN_BLOCK_LOG_SIZE 10 +#defineEXT3_MAX_BLOCK_SIZE 65536 +#define EXT3_MIN_BLOCK_LOG_SIZE10 #ifdef __KERNEL__ # define EXT3_BLOCK_SIZE(s)((s)-s_blocksize) #else _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
- ext4-uninitialized-block-groups.patch removed from -mm tree
The patch titled Ext4: Uninitialized Block Groups has been removed from the -mm tree. Its filename was ext4-uninitialized-block-groups.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: Ext4: Uninitialized Block Groups From: Andreas Dilger [EMAIL PROTECTED] In pass1 of e2fsck, every inode table in the fileystem is scanned and checked, regardless of whether it is in use. This is this the most time consuming part of the filesystem check. The unintialized block group feature can greatly reduce e2fsck time by eliminating checking of uninitialized inodes. With this feature, there is a a high water mark of used inodes for each block group. Block and inode bitmaps can be uninitialized on disk via a flag in the group descriptor to avoid reading or scanning them at e2fsck time. A checksum of each group descriptor is used to ensure that corruption in the group descriptor's bit flags does not cause incorrect operation. The feature is enabled through a mkfs option mke2fs /dev/ -O uninit_groups A patch adding support for uninitialized block groups to e2fsprogs tools has been posted to the linux-ext4 mailing list. The patches have been stress tested with fsstress and fsx. In performance tests testing e2fsck time, we have seen that e2fsck time on ext3 grows linearly with the total number of inodes in the filesytem. In ext4 with the uninitialized block groups feature, the e2fsck time is constant, based solely on the number of used inodes rather than the total inode count. Since typical ext4 filesystems only use 1-10% of their inodes, this feature can greatly reduce e2fsck time for users. With performance improvement of 2-20 times, depending on how full the filesystem is. The attached graph shows the major improvements in e2fsck times in filesystems with a large total inode count, but few inodes in use. In each group descriptor if we have EXT4_BG_INODE_UNINIT set in bg_flags: Inode table is not initialized/used in this group. So we can skip the consistency check during fsck. EXT4_BG_BLOCK_UNINIT set in bg_flags: No block in the group is used. So we can skip the block bitmap verification for this group. We also add two new fields to group descriptor as a part of uninitialized group patch. __le16 bg_itable_unused; /* Unused inodes count */ __le16 bg_checksum;/* crc16(sb_uuid+group+desc) */ bg_itable_unused: If we have EXT4_BG_INODE_UNINIT not set in bg_flags then bg_itable_unused will give the offset within the inode table till the inodes are used. This can be used by fsck to skip list of inodes that are marked unused. bg_checksum: Now that we depend on bg_flags and bg_itable_unused to determine the block and inode usage, we need to make sure group descriptor is not corrupt. We add checksum to group descriptor to detect corruption. If the descriptor is found to be corrupt, we mark all the blocks and inodes in the group used. Signed-off-by: Andreas Dilger [EMAIL PROTECTED] Signed-off-by: Avantika Mathur [EMAIL PROTECTED] Signed-off-by: Mingming Cao [EMAIL PROTECTED] Signed-off-by: Aneesh Kumar K.V [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/Kconfig |1 fs/ext4/balloc.c| 112 - fs/ext4/group.h | 27 +++ fs/ext4/ialloc.c| 146 +++--- fs/ext4/resize.c| 21 - fs/ext4/super.c | 47 include/linux/ext4_fs.h | 16 +++- 7 files changed, 335 insertions(+), 35 deletions(-) diff -puN fs/Kconfig~ext4-uninitialized-block-groups fs/Kconfig --- a/fs/Kconfig~ext4-uninitialized-block-groups +++ a/fs/Kconfig @@ -140,6 +140,7 @@ config EXT4DEV_FS tristate Ext4dev/ext4 extended fs support development (EXPERIMENTAL) depends on EXPERIMENTAL select JBD2 + select CRC16 help Ext4dev is a predecessor filesystem of the next generation extended fs ext4, based on ext3 filesystem code. It will be diff -puN fs/ext4/balloc.c~ext4-uninitialized-block-groups fs/ext4/balloc.c --- a/fs/ext4/balloc.c~ext4-uninitialized-block-groups +++ a/fs/ext4/balloc.c @@ -20,6 +20,7 @@ #include linux/quotaops.h #include linux/buffer_head.h +#include group.h /* * balloc.c contains the blocks allocation and deallocation routines */ @@ -42,6 +43,94 @@ void ext4_get_group_no_and_offset(struct } +/* Initializes an uninitialized block bitmap if given, and returns the + * number of blocks free in the group. */ +unsigned ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh, + int block_group, struct ext4_group_desc *gdp) +{ + unsigned long start; + int bit, bit_max; + unsigned free_blocks, group_blocks; + struct ext4_sb_info *sbi
- jbd-config_jbd_debug-cannot-create-proc-entry-fix.patch removed from -mm tree
The patch titled jbd-config_jbd_debug-cannot-create-proc-entry-fix has been removed from the -mm tree. Its filename was jbd-config_jbd_debug-cannot-create-proc-entry-fix.patch This patch was dropped because it was folded into jbd-config_jbd_debug-cannot-create-proc-entry.patch -- Subject: jbd-config_jbd_debug-cannot-create-proc-entry-fix From: Andrew Morton [EMAIL PROTECTED] - use `#ifdef foo' instead of `#if defined(foo)' - CONFIG_JBD_DEBUG depends on CONFIG_DEBUG_FS so we don't need to duplicate that logic in the .c file ifdefs - Make journal_enable_debug __read_mostly just for the heck of it - Make jbd_debugfs_dir and jbd_debug static - debugfs_remove(NULL) is legal: remove unneeded tests - jbd_create_debugfs_entry is a better name than create_jbd_debugfs_entry - ditto remove_jbd_debugfs_entry - C functions are preferred over macros - Avoid declaring multiple variables in a single line. Cc: Jose R. Santos [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Cc: Jan Kara [EMAIL PROTECTED] Cc: Jose R. Santos [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/jbd/journal.c | 34 ++ 1 file changed, 18 insertions(+), 16 deletions(-) diff -puN fs/jbd/journal.c~jbd-config_jbd_debug-cannot-create-proc-entry-fix fs/jbd/journal.c --- a/fs/jbd/journal.c~jbd-config_jbd_debug-cannot-create-proc-entry-fix +++ a/fs/jbd/journal.c @@ -1858,16 +1858,15 @@ void journal_put_journal_head(struct jou /* * debugfs tunables */ -#if defined(CONFIG_JBD_DEBUG) -u8 journal_enable_debug; -EXPORT_SYMBOL(journal_enable_debug); -#endif +#ifdef CONFIG_JBD_DEBUG -#if defined(CONFIG_JBD_DEBUG) defined(CONFIG_DEBUG_FS) +u8 journal_enable_debug __read_mostly; +EXPORT_SYMBOL(journal_enable_debug); -struct dentry *jbd_debugfs_dir, *jbd_debug; +static struct dentry *jbd_debugfs_dir; +static struct dentry *jbd_debug; -static void __init create_jbd_debugfs_entry(void) +static void __init jbd_create_debugfs_entry(void) { jbd_debugfs_dir = debugfs_create_dir(jbd, NULL); if (jbd_debugfs_dir) @@ -1876,18 +1875,21 @@ static void __init create_jbd_debugfs_en journal_enable_debug); } -static void __exit remove_jbd_debugfs_entry(void) +static void __exit jbd_remove_debugfs_entry(void) { - if (jbd_debug) - debugfs_remove(jbd_debug); - if (jbd_debugfs_dir) - debugfs_remove(jbd_debugfs_dir); + debugfs_remove(jbd_debug); + debugfs_remove(jbd_debugfs_dir); } #else -#define create_jbd_debugfs_entry() do {} while (0) -#define remove_jbd_debugfs_entry() do {} while (0) +static inline void jbd_create_debugfs_entry(void) +{ +} + +static inline void jbd_remove_debugfs_entry(void) +{ +} #endif @@ -1945,7 +1947,7 @@ static int __init journal_init(void) ret = journal_init_caches(); if (ret != 0) journal_destroy_caches(); - create_jbd_debugfs_entry(); + jbd_create_debugfs_entry(); return ret; } @@ -1956,7 +1958,7 @@ static void __exit journal_exit(void) if (n) printk(KERN_EMERG JBD: leaked %d journal_heads!\n, n); #endif - remove_jbd_debugfs_entry(); + jbd_remove_debugfs_entry(); journal_destroy_caches(); } _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch console-keyboard-events-and-accessibility.patch add-kernel-notifierc.patch console-events-and-accessibility.patch fix-random-hard-freeze-with-avm-cards-using-b1dma.patch jbd-config_jbd_debug-cannot-create-proc-entry.patch jbd-config_jbd_debug-cannot-create-proc-entry-fix.patch task-containersv11-basic-task-container-framework-fix.patch task-containersv11-shared-container-subsystem-group-arrays-simplify-proc-cgroups-fix.patch task-containersv11-shared-container-subsystem-group-arrays-include-fix.patch add-containerstats-v3-fix.patch pid-namespaces-dynamic-kmem-cache-allocator-for-pid-namespaces-fix.patch pid-namespaces-define-is_global_init-and-is_container_init-fix.patch pid-namespaces-define-is_global_init-and-is_container_init-versus-x86_64-mm-i386-show-unhandled-signals-v3.patch lockdep-fix-mismatched-lockdep_depth-curr_chain_hash-checkpatch-fixes.patch fs-superc-use-list_for_each_entry-instead-of-list_for_each-fix.patch pid-namespaces-helpers-to-find-the-task-by-its-numerical-ids-fix.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix-2.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix-3.patch pid-namespaces-changes-to-show-virtual-ids-to-user-fix.patch cpuset-sched_load_balance-flag-fix.patch
Re: [PATCH 2/2] ext2: Avoid rec_len overflow with 64KB block size
On Wed, 2007-10-17 at 21:09 -0700, Andrew Morton wrote: On Thu, 11 Oct 2007 13:18:49 +0200 Jan Kara [EMAIL PROTECTED] wrote: With 64KB blocksize, a directory entry can have size 64KB which does not fit into 16 bits we have for entry lenght. So we store 0x instead and convert value when read from / written to disk. btw, this changes ext2's on-disk format. Just to clarify this is only changes the directory entries format on ext2/3/4 fs with 64k block size. But currently without kernel changes ext2/3/4 does not support 64 block size. a) is the ext2 format documented anywhere? If so, that document will need updating. The e2fsprogs needs to be changed to sync up with this change. Ted has a paper a while back to show ext2 disk format http://web.mit.edu/tytso/www/linux/ext2intro.html The Documentation/filesystems/ext2.txt doesn't have the ext2 format documented. That document is out-dated need to be reviewed and cleaned up. b) what happens when an old ext2 driver tries to read and/or write this directory entry? Do we need a compat flag for it? c) what happens when old and new ext3 or ext4 try to read/write this directory entry? Without the first patch in this series: ext2 large blocksize support patches, it fails to mount a ext2 filesystem with 64k block size. [PATCH 1/2] ext2: Support large blocksize up to PAGESIZE http://lkml.org/lkml/2007/10/1/361 So the old ext2/3/4 driver will not get access the directory entry with 64k block size format changes. Regards, Mingming - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
- ext4-flex_bg-kernel-support-v2.patch removed from -mm tree
The patch titled ext4: FLEX_BG Kernel support has been removed from the -mm tree. Its filename was ext4-flex_bg-kernel-support-v2.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: ext4: FLEX_BG Kernel support From: Jose R. Santos [EMAIL PROTECTED] This feature relaxes check restrictions on where each block groups meta data is located within the storage media. This allows for the allocation of bitmaps or inode tables outside the block group boundaries in cases where bad blocks forces us to look for new blocks which the owning block group can not satisfy. This will also allow for new meta-data allocation schemes to improve performance and scalability. Signed-off-by: Jose R. Santos [EMAIL PROTECTED] Cc: linux-ext4@vger.kernel.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- fs/ext4/super.c |9 +++-- include/linux/ext4_fs.h |4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff -puN fs/ext4/super.c~ext4-flex_bg-kernel-support-v2 fs/ext4/super.c --- a/fs/ext4/super.c~ext4-flex_bg-kernel-support-v2 +++ a/fs/ext4/super.c @@ -1358,13 +1358,17 @@ static int ext4_check_descriptors (struc ext4_fsblk_t inode_table; struct ext4_group_desc * gdp = NULL; int desc_block = 0; + int flexbg_flag = 0; int i; + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) + flexbg_flag = 1; + ext4_debug (Checking group descriptors); for (i = 0; i sbi-s_groups_count; i++) { - if (i == sbi-s_groups_count - 1) + if (i == sbi-s_groups_count - 1 || flexbg_flag) last_block = ext4_blocks_count(sbi-s_es) - 1; else last_block = first_block + @@ -1409,7 +1413,8 @@ static int ext4_check_descriptors (struc le16_to_cpu(gdp-bg_checksum)); return 0; } - first_block += EXT4_BLOCKS_PER_GROUP(sb); + if (!flexbg_flag) + first_block += EXT4_BLOCKS_PER_GROUP(sb); gdp = (struct ext4_group_desc *) ((__u8 *)gdp + EXT4_DESC_SIZE(sb)); } diff -puN include/linux/ext4_fs.h~ext4-flex_bg-kernel-support-v2 include/linux/ext4_fs.h --- a/include/linux/ext4_fs.h~ext4-flex_bg-kernel-support-v2 +++ a/include/linux/ext4_fs.h @@ -682,13 +682,15 @@ static inline int ext4_valid_inum(struct #define EXT4_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */ #define EXT4_FEATURE_INCOMPAT_64BIT0x0080 +#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 #define EXT4_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \ EXT4_FEATURE_INCOMPAT_RECOVER| \ EXT4_FEATURE_INCOMPAT_META_BG| \ EXT4_FEATURE_INCOMPAT_EXTENTS| \ -EXT4_FEATURE_INCOMPAT_64BIT) +EXT4_FEATURE_INCOMPAT_64BIT| \ +EXT4_FEATURE_INCOMPAT_FLEX_BG) #define EXT4_FEATURE_RO_COMPAT_SUPP(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch jbd-config_jbd_debug-cannot-create-proc-entry.patch jbd-config_jbd_debug-cannot-create-proc-entry-fix.patch jbd-fix-jbd-warnings-when-compiling-with-config_jbd_debug.patch - To unsubscribe from this list: send the line unsubscribe linux-ext4 in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html