.. | .. |
---|
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"); |
---|