Commit 2d06b235 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-5.1-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux

Pull btrfs fixes from David Sterba:

 - fix parsing of compression algorithm when set as a inode property,
   this could end up with eg. 'zst' or 'zli' in the value

 - don't allow trim on a filesystem with unreplayed log, this could
   cause data loss if there are pending updates to the block groups that
   would not be subject to trim after replay

* tag 'for-5.1-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: prop: fix vanished compression property after failed set
  btrfs: prop: fix zstd compression parameter validation
  Btrfs: do not allow trimming when a fs is mounted with the nologreplay option
parents 582549e3 272e5326
...@@ -501,6 +501,16 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg) ...@@ -501,6 +501,16 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
/*
* If the fs is mounted with nologreplay, which requires it to be
* mounted in RO mode as well, we can not allow discard on free space
* inside block groups, because log trees refer to extents that are not
* pinned in a block group's free space cache (pinning the extents is
* precisely the first phase of replaying a log tree).
*/
if (btrfs_test_opt(fs_info, NOLOGREPLAY))
return -EROFS;
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(device, &fs_info->fs_devices->devices, list_for_each_entry_rcu(device, &fs_info->fs_devices->devices,
dev_list) { dev_list) {
......
...@@ -366,11 +366,11 @@ int btrfs_subvol_inherit_props(struct btrfs_trans_handle *trans, ...@@ -366,11 +366,11 @@ int btrfs_subvol_inherit_props(struct btrfs_trans_handle *trans,
static int prop_compression_validate(const char *value, size_t len) static int prop_compression_validate(const char *value, size_t len)
{ {
if (!strncmp("lzo", value, len)) if (!strncmp("lzo", value, 3))
return 0; return 0;
else if (!strncmp("zlib", value, len)) else if (!strncmp("zlib", value, 4))
return 0; return 0;
else if (!strncmp("zstd", value, len)) else if (!strncmp("zstd", value, 4))
return 0; return 0;
return -EINVAL; return -EINVAL;
...@@ -396,7 +396,7 @@ static int prop_compression_apply(struct inode *inode, ...@@ -396,7 +396,7 @@ static int prop_compression_apply(struct inode *inode,
btrfs_set_fs_incompat(fs_info, COMPRESS_LZO); btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
} else if (!strncmp("zlib", value, 4)) { } else if (!strncmp("zlib", value, 4)) {
type = BTRFS_COMPRESS_ZLIB; type = BTRFS_COMPRESS_ZLIB;
} else if (!strncmp("zstd", value, len)) { } else if (!strncmp("zstd", value, 4)) {
type = BTRFS_COMPRESS_ZSTD; type = BTRFS_COMPRESS_ZSTD;
btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD); btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment