hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/btrfs/ioctl.c
....@@ -2550,6 +2550,13 @@
25502550 goto out_put;
25512551 }
25522552
2553
+ /*
2554
+ * We don't need the path anymore, so release it and
2555
+ * avoid deadlocks and lockdep warnings in case
2556
+ * btrfs_iget() needs to lookup the inode from its root
2557
+ * btree and lock the same leaf.
2558
+ */
2559
+ btrfs_release_path(path);
25532560 temp_inode = btrfs_iget(sb, key2.objectid, root);
25542561 if (IS_ERR(temp_inode)) {
25552562 ret = PTR_ERR(temp_inode);
....@@ -2569,7 +2576,6 @@
25692576 goto out_put;
25702577 }
25712578
2572
- btrfs_release_path(path);
25732579 key.objectid = key.offset;
25742580 key.offset = (u64)-1;
25752581 dirid = key.objectid;
....@@ -3401,13 +3407,10 @@
34013407 di_args->bytes_used = btrfs_device_get_bytes_used(dev);
34023408 di_args->total_bytes = btrfs_device_get_total_bytes(dev);
34033409 memcpy(di_args->uuid, dev->uuid, sizeof(di_args->uuid));
3404
- if (dev->name) {
3405
- strncpy(di_args->path, rcu_str_deref(dev->name),
3406
- sizeof(di_args->path) - 1);
3407
- di_args->path[sizeof(di_args->path) - 1] = 0;
3408
- } else {
3410
+ if (dev->name)
3411
+ strscpy(di_args->path, rcu_str_deref(dev->name), sizeof(di_args->path));
3412
+ else
34093413 di_args->path[0] = '\0';
3410
- }
34113414
34123415 out:
34133416 rcu_read_unlock();
....@@ -3704,6 +3707,11 @@
37043707 sa = memdup_user(arg, sizeof(*sa));
37053708 if (IS_ERR(sa))
37063709 return PTR_ERR(sa);
3710
+
3711
+ if (sa->flags & ~BTRFS_SCRUB_SUPPORTED_FLAGS) {
3712
+ ret = -EOPNOTSUPP;
3713
+ goto out;
3714
+ }
37073715
37083716 if (!(sa->flags & BTRFS_SCRUB_READONLY)) {
37093717 ret = mnt_want_write_file(file);
....@@ -4257,7 +4265,9 @@
42574265 }
42584266
42594267 /* update qgroup status and info */
4268
+ mutex_lock(&fs_info->qgroup_ioctl_lock);
42604269 err = btrfs_run_qgroups(trans);
4270
+ mutex_unlock(&fs_info->qgroup_ioctl_lock);
42614271 if (err < 0)
42624272 btrfs_handle_fs_error(fs_info, err,
42634273 "failed to update qgroup status and info");