| .. | .. |
|---|
| 2550 | 2550 | goto out_put; |
|---|
| 2551 | 2551 | } |
|---|
| 2552 | 2552 | |
|---|
| 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); |
|---|
| 2553 | 2560 | temp_inode = btrfs_iget(sb, key2.objectid, root); |
|---|
| 2554 | 2561 | if (IS_ERR(temp_inode)) { |
|---|
| 2555 | 2562 | ret = PTR_ERR(temp_inode); |
|---|
| .. | .. |
|---|
| 2569 | 2576 | goto out_put; |
|---|
| 2570 | 2577 | } |
|---|
| 2571 | 2578 | |
|---|
| 2572 | | - btrfs_release_path(path); |
|---|
| 2573 | 2579 | key.objectid = key.offset; |
|---|
| 2574 | 2580 | key.offset = (u64)-1; |
|---|
| 2575 | 2581 | dirid = key.objectid; |
|---|
| .. | .. |
|---|
| 3401 | 3407 | di_args->bytes_used = btrfs_device_get_bytes_used(dev); |
|---|
| 3402 | 3408 | di_args->total_bytes = btrfs_device_get_total_bytes(dev); |
|---|
| 3403 | 3409 | 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 |
|---|
| 3409 | 3413 | di_args->path[0] = '\0'; |
|---|
| 3410 | | - } |
|---|
| 3411 | 3414 | |
|---|
| 3412 | 3415 | out: |
|---|
| 3413 | 3416 | rcu_read_unlock(); |
|---|
| .. | .. |
|---|
| 3704 | 3707 | sa = memdup_user(arg, sizeof(*sa)); |
|---|
| 3705 | 3708 | if (IS_ERR(sa)) |
|---|
| 3706 | 3709 | return PTR_ERR(sa); |
|---|
| 3710 | + |
|---|
| 3711 | + if (sa->flags & ~BTRFS_SCRUB_SUPPORTED_FLAGS) { |
|---|
| 3712 | + ret = -EOPNOTSUPP; |
|---|
| 3713 | + goto out; |
|---|
| 3714 | + } |
|---|
| 3707 | 3715 | |
|---|
| 3708 | 3716 | if (!(sa->flags & BTRFS_SCRUB_READONLY)) { |
|---|
| 3709 | 3717 | ret = mnt_want_write_file(file); |
|---|
| .. | .. |
|---|
| 4257 | 4265 | } |
|---|
| 4258 | 4266 | |
|---|
| 4259 | 4267 | /* update qgroup status and info */ |
|---|
| 4268 | + mutex_lock(&fs_info->qgroup_ioctl_lock); |
|---|
| 4260 | 4269 | err = btrfs_run_qgroups(trans); |
|---|
| 4270 | + mutex_unlock(&fs_info->qgroup_ioctl_lock); |
|---|
| 4261 | 4271 | if (err < 0) |
|---|
| 4262 | 4272 | btrfs_handle_fs_error(fs_info, err, |
|---|
| 4263 | 4273 | "failed to update qgroup status and info"); |
|---|