Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (43 commits) ext4: fix a BUG in mb_mark_used during trim. ext4: unused variables cleanup in fs/ext4/extents.c ext4: remove redundant set_buffer_mapped() in ext4_da_get_block_prep() ext4: add more tracepoints and use dev_t in the trace buffer ext4: don't kfree uninitialized s_group_info members ext4: add missing space in printk's in __ext4_grp_locked_error() ext4: add FITRIM to compat_ioctl. ext4: handle errors in ext4_clear_blocks() ext4: unify the ext4_handle_release_buffer() api ext4: handle errors in ext4_rename jbd2: add COW fields to struct jbd2_journal_handle jbd2: add the b_cow_tid field to journal_head struct ext4: Initialize fsync transaction ids in ext4_new_inode() ext4: Use single thread to perform DIO unwritten convertion ext4: optimize ext4_bio_write_page() when no extent conversion is needed ext4: skip orphan cleanup if fs has unknown ROCOMPAT features ext4: use the nblocks arg to ext4_truncate_restart_trans() ext4: fix missing iput of root inode for some mount error paths ext4: make FIEMAP and delayed allocation play well together ext4: suppress verbose debugging information if malloc-debug is off ... Fi up conflicts in fs/ext4/super.c due to workqueue changes
This commit is contained in:
@@ -54,9 +54,9 @@
|
||||
|
||||
static struct proc_dir_entry *ext4_proc_root;
|
||||
static struct kset *ext4_kset;
|
||||
struct ext4_lazy_init *ext4_li_info;
|
||||
struct mutex ext4_li_mtx;
|
||||
struct ext4_features *ext4_feat;
|
||||
static struct ext4_lazy_init *ext4_li_info;
|
||||
static struct mutex ext4_li_mtx;
|
||||
static struct ext4_features *ext4_feat;
|
||||
|
||||
static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
|
||||
unsigned long journal_devnum);
|
||||
@@ -75,6 +75,7 @@ static void ext4_write_super(struct super_block *sb);
|
||||
static int ext4_freeze(struct super_block *sb);
|
||||
static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
|
||||
const char *dev_name, void *data);
|
||||
static int ext4_feature_set_ok(struct super_block *sb, int readonly);
|
||||
static void ext4_destroy_lazyinit_thread(void);
|
||||
static void ext4_unregister_li_request(struct super_block *sb);
|
||||
static void ext4_clear_request_list(void);
|
||||
@@ -594,7 +595,7 @@ __acquires(bitlock)
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: group %u",
|
||||
printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: group %u, ",
|
||||
sb->s_id, function, line, grp);
|
||||
if (ino)
|
||||
printk(KERN_CONT "inode %lu: ", ino);
|
||||
@@ -997,13 +998,10 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
if (test_opt(sb, OLDALLOC))
|
||||
seq_puts(seq, ",oldalloc");
|
||||
#ifdef CONFIG_EXT4_FS_XATTR
|
||||
if (test_opt(sb, XATTR_USER) &&
|
||||
!(def_mount_opts & EXT4_DEFM_XATTR_USER))
|
||||
if (test_opt(sb, XATTR_USER))
|
||||
seq_puts(seq, ",user_xattr");
|
||||
if (!test_opt(sb, XATTR_USER) &&
|
||||
(def_mount_opts & EXT4_DEFM_XATTR_USER)) {
|
||||
if (!test_opt(sb, XATTR_USER))
|
||||
seq_puts(seq, ",nouser_xattr");
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
||||
if (test_opt(sb, POSIX_ACL) && !(def_mount_opts & EXT4_DEFM_ACL))
|
||||
@@ -1041,8 +1039,8 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
!(def_mount_opts & EXT4_DEFM_NODELALLOC))
|
||||
seq_puts(seq, ",nodelalloc");
|
||||
|
||||
if (test_opt(sb, MBLK_IO_SUBMIT))
|
||||
seq_puts(seq, ",mblk_io_submit");
|
||||
if (!test_opt(sb, MBLK_IO_SUBMIT))
|
||||
seq_puts(seq, ",nomblk_io_submit");
|
||||
if (sbi->s_stripe)
|
||||
seq_printf(seq, ",stripe=%lu", sbi->s_stripe);
|
||||
/*
|
||||
@@ -1451,7 +1449,7 @@ static int parse_options(char *options, struct super_block *sb,
|
||||
* Initialize args struct so we know whether arg was
|
||||
* found; some options take optional arguments.
|
||||
*/
|
||||
args[0].to = args[0].from = 0;
|
||||
args[0].to = args[0].from = NULL;
|
||||
token = match_token(p, tokens, args);
|
||||
switch (token) {
|
||||
case Opt_bsd_df:
|
||||
@@ -1771,7 +1769,7 @@ set_qf_format:
|
||||
return 0;
|
||||
if (option < 0 || option > (1 << 30))
|
||||
return 0;
|
||||
if (!is_power_of_2(option)) {
|
||||
if (option && !is_power_of_2(option)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"EXT4-fs: inode_readahead_blks"
|
||||
" must be a power of 2");
|
||||
@@ -2120,6 +2118,13 @@ static void ext4_orphan_cleanup(struct super_block *sb,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if feature set would not allow a r/w mount */
|
||||
if (!ext4_feature_set_ok(sb, 0)) {
|
||||
ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to "
|
||||
"unknown ROCOMPAT features");
|
||||
return;
|
||||
}
|
||||
|
||||
if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
|
||||
if (es->s_last_orphan)
|
||||
jbd_debug(1, "Errors on filesystem, "
|
||||
@@ -2412,7 +2417,7 @@ static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
|
||||
if (parse_strtoul(buf, 0x40000000, &t))
|
||||
return -EINVAL;
|
||||
|
||||
if (!is_power_of_2(t))
|
||||
if (t && !is_power_of_2(t))
|
||||
return -EINVAL;
|
||||
|
||||
sbi->s_inode_readahead_blks = t;
|
||||
@@ -3095,14 +3100,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
||||
}
|
||||
if (def_mount_opts & EXT4_DEFM_UID16)
|
||||
set_opt(sb, NO_UID32);
|
||||
/* xattr user namespace & acls are now defaulted on */
|
||||
#ifdef CONFIG_EXT4_FS_XATTR
|
||||
if (def_mount_opts & EXT4_DEFM_XATTR_USER)
|
||||
set_opt(sb, XATTR_USER);
|
||||
set_opt(sb, XATTR_USER);
|
||||
#endif
|
||||
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
||||
if (def_mount_opts & EXT4_DEFM_ACL)
|
||||
set_opt(sb, POSIX_ACL);
|
||||
set_opt(sb, POSIX_ACL);
|
||||
#endif
|
||||
set_opt(sb, MBLK_IO_SUBMIT);
|
||||
if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)
|
||||
set_opt(sb, JOURNAL_DATA);
|
||||
else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)
|
||||
@@ -3516,7 +3521,7 @@ no_journal:
|
||||
* concurrency isn't really necessary. Limit it to 1.
|
||||
*/
|
||||
EXT4_SB(sb)->dio_unwritten_wq =
|
||||
alloc_workqueue("ext4-dio-unwritten", WQ_MEM_RECLAIM, 1);
|
||||
alloc_workqueue("ext4-dio-unwritten", WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
|
||||
if (!EXT4_SB(sb)->dio_unwritten_wq) {
|
||||
printk(KERN_ERR "EXT4-fs: failed to create DIO workqueue\n");
|
||||
goto failed_mount_wq;
|
||||
@@ -3531,17 +3536,16 @@ no_journal:
|
||||
if (IS_ERR(root)) {
|
||||
ext4_msg(sb, KERN_ERR, "get root inode failed");
|
||||
ret = PTR_ERR(root);
|
||||
root = NULL;
|
||||
goto failed_mount4;
|
||||
}
|
||||
if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
|
||||
iput(root);
|
||||
ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
|
||||
goto failed_mount4;
|
||||
}
|
||||
sb->s_root = d_alloc_root(root);
|
||||
if (!sb->s_root) {
|
||||
ext4_msg(sb, KERN_ERR, "get root dentry failed");
|
||||
iput(root);
|
||||
ret = -ENOMEM;
|
||||
goto failed_mount4;
|
||||
}
|
||||
@@ -3657,6 +3661,8 @@ cantfind_ext4:
|
||||
goto failed_mount;
|
||||
|
||||
failed_mount4:
|
||||
iput(root);
|
||||
sb->s_root = NULL;
|
||||
ext4_msg(sb, KERN_ERR, "mount failed");
|
||||
destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq);
|
||||
failed_mount_wq:
|
||||
|
Reference in New Issue
Block a user