mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
Btrfs: don't clear the default compression type
We met a oops caused by the wrong compression type: [ 556.512356] BUG: unable to handle kernel NULL pointer dereference at (null) [ 556.512370] IP: [<ffffffff811dbaa0>] __list_del_entry+0x1/0x98 [SNIP] [ 556.512490] [<ffffffff811dbb44>] ? list_del+0xd/0x2b [ 556.512539] [<ffffffffa05dd5ce>] find_workspace+0x97/0x175 [btrfs] [ 556.512546] [<ffffffff813c14b5>] ? _raw_spin_lock+0xe/0x10 [ 556.512576] [<ffffffffa05de276>] btrfs_compress_pages+0x2d/0xa2 [btrfs] [ 556.512601] [<ffffffffa05af060>] compress_file_range.constprop.54+0x1f2/0x4e8 [btrfs] [ 556.512627] [<ffffffffa05af388>] async_cow_start+0x32/0x4d [btrfs] [ 556.512655] [<ffffffffa05cc7a1>] worker_loop+0x144/0x4c3 [btrfs] [ 556.512661] [<ffffffff81059404>] ? finish_task_switch+0x80/0xb8 [ 556.512689] [<ffffffffa05cc65d>] ? btrfs_queue_worker+0x244/0x244 [btrfs] [ 556.512695] [<ffffffff8104fa4e>] kthread+0x8d/0x95 [ 556.512699] [<ffffffff81050000>] ? bit_waitqueue+0x34/0x7d [ 556.512704] [<ffffffff8104f9c1>] ? __kthread_parkme+0x65/0x65 [ 556.512709] [<ffffffff813c7eec>] ret_from_fork+0x7c/0xb0 [ 556.512713] [<ffffffff8104f9c1>] ? __kthread_parkme+0x65/0x65 Steps to reproduce: # mkfs.btrfs -f <dev> # mount -o nodatacow <dev> <mnt> # touch <mnt>/<file> # chattr =c <mnt>/<file> # dd if=/dev/zero of=<mnt>/<file> bs=1M count=10 It is because we cleared the default compression type when setting the nodatacow. In fact, we needn't do it because we have used COMPRESS flag to indicate if we need compressed the file data or not, needn't use the variant -- compress_type -- in btrfs_info to do the same thing, and just use it to hold the default compression type. Or we would get a wrong compress type for a file whose own compress flag is set but the compress flag of its filesystem is not set. Reported-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Reviewed-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
c0778e2534
commit
a7e252af5a
1 changed files with 2 additions and 3 deletions
|
@ -432,7 +432,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_INFO "btrfs: setting nodatacow\n");
|
printk(KERN_INFO "btrfs: setting nodatacow\n");
|
||||||
}
|
}
|
||||||
info->compress_type = BTRFS_COMPRESS_NONE;
|
|
||||||
btrfs_clear_opt(info->mount_opt, COMPRESS);
|
btrfs_clear_opt(info->mount_opt, COMPRESS);
|
||||||
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
||||||
btrfs_set_opt(info->mount_opt, NODATACOW);
|
btrfs_set_opt(info->mount_opt, NODATACOW);
|
||||||
|
@ -461,7 +460,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
btrfs_set_fs_incompat(info, COMPRESS_LZO);
|
btrfs_set_fs_incompat(info, COMPRESS_LZO);
|
||||||
} else if (strncmp(args[0].from, "no", 2) == 0) {
|
} else if (strncmp(args[0].from, "no", 2) == 0) {
|
||||||
compress_type = "no";
|
compress_type = "no";
|
||||||
info->compress_type = BTRFS_COMPRESS_NONE;
|
|
||||||
btrfs_clear_opt(info->mount_opt, COMPRESS);
|
btrfs_clear_opt(info->mount_opt, COMPRESS);
|
||||||
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
||||||
compress_force = false;
|
compress_force = false;
|
||||||
|
@ -474,9 +472,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
|
btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
|
||||||
pr_info("btrfs: force %s compression\n",
|
pr_info("btrfs: force %s compression\n",
|
||||||
compress_type);
|
compress_type);
|
||||||
} else
|
} else if (btrfs_test_opt(root, COMPRESS)) {
|
||||||
pr_info("btrfs: use %s compression\n",
|
pr_info("btrfs: use %s compression\n",
|
||||||
compress_type);
|
compress_type);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_ssd:
|
case Opt_ssd:
|
||||||
printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
|
printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
|
||||||
|
|
Loading…
Reference in a new issue