aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r--fs/btrfs/ioctl.c196
1 files changed, 147 insertions, 49 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 5a23806ae418..aa97dfe8ae70 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -125,10 +125,10 @@ static unsigned int btrfs_flags_to_ioctl(unsigned int flags)
125 if (flags & BTRFS_INODE_NODATACOW) 125 if (flags & BTRFS_INODE_NODATACOW)
126 iflags |= FS_NOCOW_FL; 126 iflags |= FS_NOCOW_FL;
127 127
128 if ((flags & BTRFS_INODE_COMPRESS) && !(flags & BTRFS_INODE_NOCOMPRESS)) 128 if (flags & BTRFS_INODE_NOCOMPRESS)
129 iflags |= FS_COMPR_FL;
130 else if (flags & BTRFS_INODE_NOCOMPRESS)
131 iflags |= FS_NOCOMP_FL; 129 iflags |= FS_NOCOMP_FL;
130 else if (flags & BTRFS_INODE_COMPRESS)
131 iflags |= FS_COMPR_FL;
132 132
133 return iflags; 133 return iflags;
134} 134}
@@ -439,7 +439,7 @@ static noinline int create_subvol(struct inode *dir,
439{ 439{
440 struct btrfs_trans_handle *trans; 440 struct btrfs_trans_handle *trans;
441 struct btrfs_key key; 441 struct btrfs_key key;
442 struct btrfs_root_item root_item; 442 struct btrfs_root_item *root_item;
443 struct btrfs_inode_item *inode_item; 443 struct btrfs_inode_item *inode_item;
444 struct extent_buffer *leaf; 444 struct extent_buffer *leaf;
445 struct btrfs_root *root = BTRFS_I(dir)->root; 445 struct btrfs_root *root = BTRFS_I(dir)->root;
@@ -455,16 +455,22 @@ static noinline int create_subvol(struct inode *dir,
455 u64 qgroup_reserved; 455 u64 qgroup_reserved;
456 uuid_le new_uuid; 456 uuid_le new_uuid;
457 457
458 root_item = kzalloc(sizeof(*root_item), GFP_KERNEL);
459 if (!root_item)
460 return -ENOMEM;
461
458 ret = btrfs_find_free_objectid(root->fs_info->tree_root, &objectid); 462 ret = btrfs_find_free_objectid(root->fs_info->tree_root, &objectid);
459 if (ret) 463 if (ret)
460 return ret; 464 goto fail_free;
461 465
462 /* 466 /*
463 * Don't create subvolume whose level is not zero. Or qgroup will be 467 * Don't create subvolume whose level is not zero. Or qgroup will be
464 * screwed up since it assume subvolme qgroup's level to be 0. 468 * screwed up since it assume subvolme qgroup's level to be 0.
465 */ 469 */
466 if (btrfs_qgroup_level(objectid)) 470 if (btrfs_qgroup_level(objectid)) {
467 return -ENOSPC; 471 ret = -ENOSPC;
472 goto fail_free;
473 }
468 474
469 btrfs_init_block_rsv(&block_rsv, BTRFS_BLOCK_RSV_TEMP); 475 btrfs_init_block_rsv(&block_rsv, BTRFS_BLOCK_RSV_TEMP);
470 /* 476 /*
@@ -474,14 +480,14 @@ static noinline int create_subvol(struct inode *dir,
474 ret = btrfs_subvolume_reserve_metadata(root, &block_rsv, 480 ret = btrfs_subvolume_reserve_metadata(root, &block_rsv,
475 8, &qgroup_reserved, false); 481 8, &qgroup_reserved, false);
476 if (ret) 482 if (ret)
477 return ret; 483 goto fail_free;
478 484
479 trans = btrfs_start_transaction(root, 0); 485 trans = btrfs_start_transaction(root, 0);
480 if (IS_ERR(trans)) { 486 if (IS_ERR(trans)) {
481 ret = PTR_ERR(trans); 487 ret = PTR_ERR(trans);
482 btrfs_subvolume_release_metadata(root, &block_rsv, 488 btrfs_subvolume_release_metadata(root, &block_rsv,
483 qgroup_reserved); 489 qgroup_reserved);
484 return ret; 490 goto fail_free;
485 } 491 }
486 trans->block_rsv = &block_rsv; 492 trans->block_rsv = &block_rsv;
487 trans->bytes_reserved = block_rsv.size; 493 trans->bytes_reserved = block_rsv.size;
@@ -509,47 +515,45 @@ static noinline int create_subvol(struct inode *dir,
509 BTRFS_UUID_SIZE); 515 BTRFS_UUID_SIZE);
510 btrfs_mark_buffer_dirty(leaf); 516 btrfs_mark_buffer_dirty(leaf);
511 517
512 memset(&root_item, 0, sizeof(root_item)); 518 inode_item = &root_item->inode;
513
514 inode_item = &root_item.inode;
515 btrfs_set_stack_inode_generation(inode_item, 1); 519 btrfs_set_stack_inode_generation(inode_item, 1);
516 btrfs_set_stack_inode_size(inode_item, 3); 520 btrfs_set_stack_inode_size(inode_item, 3);
517 btrfs_set_stack_inode_nlink(inode_item, 1); 521 btrfs_set_stack_inode_nlink(inode_item, 1);
518 btrfs_set_stack_inode_nbytes(inode_item, root->nodesize); 522 btrfs_set_stack_inode_nbytes(inode_item, root->nodesize);
519 btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755); 523 btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
520 524
521 btrfs_set_root_flags(&root_item, 0); 525 btrfs_set_root_flags(root_item, 0);
522 btrfs_set_root_limit(&root_item, 0); 526 btrfs_set_root_limit(root_item, 0);
523 btrfs_set_stack_inode_flags(inode_item, BTRFS_INODE_ROOT_ITEM_INIT); 527 btrfs_set_stack_inode_flags(inode_item, BTRFS_INODE_ROOT_ITEM_INIT);
524 528
525 btrfs_set_root_bytenr(&root_item, leaf->start); 529 btrfs_set_root_bytenr(root_item, leaf->start);
526 btrfs_set_root_generation(&root_item, trans->transid); 530 btrfs_set_root_generation(root_item, trans->transid);
527 btrfs_set_root_level(&root_item, 0); 531 btrfs_set_root_level(root_item, 0);
528 btrfs_set_root_refs(&root_item, 1); 532 btrfs_set_root_refs(root_item, 1);
529 btrfs_set_root_used(&root_item, leaf->len); 533 btrfs_set_root_used(root_item, leaf->len);
530 btrfs_set_root_last_snapshot(&root_item, 0); 534 btrfs_set_root_last_snapshot(root_item, 0);
531 535
532 btrfs_set_root_generation_v2(&root_item, 536 btrfs_set_root_generation_v2(root_item,
533 btrfs_root_generation(&root_item)); 537 btrfs_root_generation(root_item));
534 uuid_le_gen(&new_uuid); 538 uuid_le_gen(&new_uuid);
535 memcpy(root_item.uuid, new_uuid.b, BTRFS_UUID_SIZE); 539 memcpy(root_item->uuid, new_uuid.b, BTRFS_UUID_SIZE);
536 btrfs_set_stack_timespec_sec(&root_item.otime, cur_time.tv_sec); 540 btrfs_set_stack_timespec_sec(&root_item->otime, cur_time.tv_sec);
537 btrfs_set_stack_timespec_nsec(&root_item.otime, cur_time.tv_nsec); 541 btrfs_set_stack_timespec_nsec(&root_item->otime, cur_time.tv_nsec);
538 root_item.ctime = root_item.otime; 542 root_item->ctime = root_item->otime;
539 btrfs_set_root_ctransid(&root_item, trans->transid); 543 btrfs_set_root_ctransid(root_item, trans->transid);
540 btrfs_set_root_otransid(&root_item, trans->transid); 544 btrfs_set_root_otransid(root_item, trans->transid);
541 545
542 btrfs_tree_unlock(leaf); 546 btrfs_tree_unlock(leaf);
543 free_extent_buffer(leaf); 547 free_extent_buffer(leaf);
544 leaf = NULL; 548 leaf = NULL;
545 549
546 btrfs_set_root_dirid(&root_item, new_dirid); 550 btrfs_set_root_dirid(root_item, new_dirid);
547 551
548 key.objectid = objectid; 552 key.objectid = objectid;
549 key.offset = 0; 553 key.offset = 0;
550 key.type = BTRFS_ROOT_ITEM_KEY; 554 key.type = BTRFS_ROOT_ITEM_KEY;
551 ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key, 555 ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key,
552 &root_item); 556 root_item);
553 if (ret) 557 if (ret)
554 goto fail; 558 goto fail;
555 559
@@ -601,12 +605,13 @@ static noinline int create_subvol(struct inode *dir,
601 BUG_ON(ret); 605 BUG_ON(ret);
602 606
603 ret = btrfs_uuid_tree_add(trans, root->fs_info->uuid_root, 607 ret = btrfs_uuid_tree_add(trans, root->fs_info->uuid_root,
604 root_item.uuid, BTRFS_UUID_KEY_SUBVOL, 608 root_item->uuid, BTRFS_UUID_KEY_SUBVOL,
605 objectid); 609 objectid);
606 if (ret) 610 if (ret)
607 btrfs_abort_transaction(trans, root, ret); 611 btrfs_abort_transaction(trans, root, ret);
608 612
609fail: 613fail:
614 kfree(root_item);
610 trans->block_rsv = NULL; 615 trans->block_rsv = NULL;
611 trans->bytes_reserved = 0; 616 trans->bytes_reserved = 0;
612 btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved); 617 btrfs_subvolume_release_metadata(root, &block_rsv, qgroup_reserved);
@@ -629,6 +634,10 @@ fail:
629 d_instantiate(dentry, inode); 634 d_instantiate(dentry, inode);
630 } 635 }
631 return ret; 636 return ret;
637
638fail_free:
639 kfree(root_item);
640 return ret;
632} 641}
633 642
634static void btrfs_wait_for_no_snapshoting_writes(struct btrfs_root *root) 643static void btrfs_wait_for_no_snapshoting_writes(struct btrfs_root *root)
@@ -2667,10 +2676,10 @@ out:
2667 return ret; 2676 return ret;
2668} 2677}
2669 2678
2670static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) 2679static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
2671{ 2680{
2672 struct btrfs_root *root = BTRFS_I(file_inode(file))->root; 2681 struct btrfs_root *root = BTRFS_I(file_inode(file))->root;
2673 struct btrfs_ioctl_vol_args *vol_args; 2682 struct btrfs_ioctl_vol_args_v2 *vol_args;
2674 int ret; 2683 int ret;
2675 2684
2676 if (!capable(CAP_SYS_ADMIN)) 2685 if (!capable(CAP_SYS_ADMIN))
@@ -2686,7 +2695,9 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
2686 goto err_drop; 2695 goto err_drop;
2687 } 2696 }
2688 2697
2689 vol_args->name[BTRFS_PATH_NAME_MAX] = '\0'; 2698 /* Check for compatibility reject unknown flags */
2699 if (vol_args->flags & ~BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED)
2700 return -EOPNOTSUPP;
2690 2701
2691 if (atomic_xchg(&root->fs_info->mutually_exclusive_operation_running, 2702 if (atomic_xchg(&root->fs_info->mutually_exclusive_operation_running,
2692 1)) { 2703 1)) {
@@ -2695,13 +2706,23 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
2695 } 2706 }
2696 2707
2697 mutex_lock(&root->fs_info->volume_mutex); 2708 mutex_lock(&root->fs_info->volume_mutex);
2698 ret = btrfs_rm_device(root, vol_args->name); 2709 if (vol_args->flags & BTRFS_DEVICE_SPEC_BY_ID) {
2710 ret = btrfs_rm_device(root, NULL, vol_args->devid);
2711 } else {
2712 vol_args->name[BTRFS_SUBVOL_NAME_MAX] = '\0';
2713 ret = btrfs_rm_device(root, vol_args->name, 0);
2714 }
2699 mutex_unlock(&root->fs_info->volume_mutex); 2715 mutex_unlock(&root->fs_info->volume_mutex);
2700 atomic_set(&root->fs_info->mutually_exclusive_operation_running, 0); 2716 atomic_set(&root->fs_info->mutually_exclusive_operation_running, 0);
2701 2717
2702 if (!ret) 2718 if (!ret) {
2703 btrfs_info(root->fs_info, "disk deleted %s",vol_args->name); 2719 if (vol_args->flags & BTRFS_DEVICE_SPEC_BY_ID)
2704 2720 btrfs_info(root->fs_info, "device deleted: id %llu",
2721 vol_args->devid);
2722 else
2723 btrfs_info(root->fs_info, "device deleted: %s",
2724 vol_args->name);
2725 }
2705out: 2726out:
2706 kfree(vol_args); 2727 kfree(vol_args);
2707err_drop: 2728err_drop:
@@ -2709,6 +2730,47 @@ err_drop:
2709 return ret; 2730 return ret;
2710} 2731}
2711 2732
2733static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
2734{
2735 struct btrfs_root *root = BTRFS_I(file_inode(file))->root;
2736 struct btrfs_ioctl_vol_args *vol_args;
2737 int ret;
2738
2739 if (!capable(CAP_SYS_ADMIN))
2740 return -EPERM;
2741
2742 ret = mnt_want_write_file(file);
2743 if (ret)
2744 return ret;
2745
2746 if (atomic_xchg(&root->fs_info->mutually_exclusive_operation_running,
2747 1)) {
2748 ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
2749 goto out_drop_write;
2750 }
2751
2752 vol_args = memdup_user(arg, sizeof(*vol_args));
2753 if (IS_ERR(vol_args)) {
2754 ret = PTR_ERR(vol_args);
2755 goto out;
2756 }
2757
2758 vol_args->name[BTRFS_PATH_NAME_MAX] = '\0';
2759 mutex_lock(&root->fs_info->volume_mutex);
2760 ret = btrfs_rm_device(root, vol_args->name, 0);
2761 mutex_unlock(&root->fs_info->volume_mutex);
2762
2763 if (!ret)
2764 btrfs_info(root->fs_info, "disk deleted %s",vol_args->name);
2765 kfree(vol_args);
2766out:
2767 atomic_set(&root->fs_info->mutually_exclusive_operation_running, 0);
2768out_drop_write:
2769 mnt_drop_write_file(file);
2770
2771 return ret;
2772}
2773
2712static long btrfs_ioctl_fs_info(struct btrfs_root *root, void __user *arg) 2774static long btrfs_ioctl_fs_info(struct btrfs_root *root, void __user *arg)
2713{ 2775{
2714 struct btrfs_ioctl_fs_info_args *fi_args; 2776 struct btrfs_ioctl_fs_info_args *fi_args;
@@ -3468,13 +3530,16 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
3468 u64 last_dest_end = destoff; 3530 u64 last_dest_end = destoff;
3469 3531
3470 ret = -ENOMEM; 3532 ret = -ENOMEM;
3471 buf = vmalloc(root->nodesize); 3533 buf = kmalloc(root->nodesize, GFP_KERNEL | __GFP_NOWARN);
3472 if (!buf) 3534 if (!buf) {
3473 return ret; 3535 buf = vmalloc(root->nodesize);
3536 if (!buf)
3537 return ret;
3538 }
3474 3539
3475 path = btrfs_alloc_path(); 3540 path = btrfs_alloc_path();
3476 if (!path) { 3541 if (!path) {
3477 vfree(buf); 3542 kvfree(buf);
3478 return ret; 3543 return ret;
3479 } 3544 }
3480 3545
@@ -3775,7 +3840,7 @@ process_slot:
3775 3840
3776out: 3841out:
3777 btrfs_free_path(path); 3842 btrfs_free_path(path);
3778 vfree(buf); 3843 kvfree(buf);
3779 return ret; 3844 return ret;
3780} 3845}
3781 3846
@@ -4376,7 +4441,7 @@ static long btrfs_ioctl_dev_replace(struct btrfs_root *root, void __user *arg)
4376 1)) { 4441 1)) {
4377 ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS; 4442 ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
4378 } else { 4443 } else {
4379 ret = btrfs_dev_replace_start(root, p); 4444 ret = btrfs_dev_replace_by_ioctl(root, p);
4380 atomic_set( 4445 atomic_set(
4381 &root->fs_info->mutually_exclusive_operation_running, 4446 &root->fs_info->mutually_exclusive_operation_running,
4382 0); 4447 0);
@@ -4847,8 +4912,8 @@ static long btrfs_ioctl_qgroup_assign(struct file *file, void __user *arg)
4847 /* update qgroup status and info */ 4912 /* update qgroup status and info */
4848 err = btrfs_run_qgroups(trans, root->fs_info); 4913 err = btrfs_run_qgroups(trans, root->fs_info);
4849 if (err < 0) 4914 if (err < 0)
4850 btrfs_std_error(root->fs_info, ret, 4915 btrfs_handle_fs_error(root->fs_info, err,
4851 "failed to update qgroup status and info\n"); 4916 "failed to update qgroup status and info");
4852 err = btrfs_end_transaction(trans, root); 4917 err = btrfs_end_transaction(trans, root);
4853 if (err && !ret) 4918 if (err && !ret)
4854 ret = err; 4919 ret = err;
@@ -5394,9 +5459,15 @@ static int btrfs_ioctl_set_features(struct file *file, void __user *arg)
5394 if (ret) 5459 if (ret)
5395 return ret; 5460 return ret;
5396 5461
5462 ret = mnt_want_write_file(file);
5463 if (ret)
5464 return ret;
5465
5397 trans = btrfs_start_transaction(root, 0); 5466 trans = btrfs_start_transaction(root, 0);
5398 if (IS_ERR(trans)) 5467 if (IS_ERR(trans)) {
5399 return PTR_ERR(trans); 5468 ret = PTR_ERR(trans);
5469 goto out_drop_write;
5470 }
5400 5471
5401 spin_lock(&root->fs_info->super_lock); 5472 spin_lock(&root->fs_info->super_lock);
5402 newflags = btrfs_super_compat_flags(super_block); 5473 newflags = btrfs_super_compat_flags(super_block);
@@ -5415,7 +5486,11 @@ static int btrfs_ioctl_set_features(struct file *file, void __user *arg)
5415 btrfs_set_super_incompat_flags(super_block, newflags); 5486 btrfs_set_super_incompat_flags(super_block, newflags);
5416 spin_unlock(&root->fs_info->super_lock); 5487 spin_unlock(&root->fs_info->super_lock);
5417 5488
5418 return btrfs_commit_transaction(trans, root); 5489 ret = btrfs_commit_transaction(trans, root);
5490out_drop_write:
5491 mnt_drop_write_file(file);
5492
5493 return ret;
5419} 5494}
5420 5495
5421long btrfs_ioctl(struct file *file, unsigned int 5496long btrfs_ioctl(struct file *file, unsigned int
@@ -5459,6 +5534,8 @@ long btrfs_ioctl(struct file *file, unsigned int
5459 return btrfs_ioctl_add_dev(root, argp); 5534 return btrfs_ioctl_add_dev(root, argp);
5460 case BTRFS_IOC_RM_DEV: 5535 case BTRFS_IOC_RM_DEV:
5461 return btrfs_ioctl_rm_dev(file, argp); 5536 return btrfs_ioctl_rm_dev(file, argp);
5537 case BTRFS_IOC_RM_DEV_V2:
5538 return btrfs_ioctl_rm_dev_v2(file, argp);
5462 case BTRFS_IOC_FS_INFO: 5539 case BTRFS_IOC_FS_INFO:
5463 return btrfs_ioctl_fs_info(root, argp); 5540 return btrfs_ioctl_fs_info(root, argp);
5464 case BTRFS_IOC_DEV_INFO: 5541 case BTRFS_IOC_DEV_INFO:
@@ -5552,3 +5629,24 @@ long btrfs_ioctl(struct file *file, unsigned int
5552 5629
5553 return -ENOTTY; 5630 return -ENOTTY;
5554} 5631}
5632
5633#ifdef CONFIG_COMPAT
5634long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
5635{
5636 switch (cmd) {
5637 case FS_IOC32_GETFLAGS:
5638 cmd = FS_IOC_GETFLAGS;
5639 break;
5640 case FS_IOC32_SETFLAGS:
5641 cmd = FS_IOC_SETFLAGS;
5642 break;
5643 case FS_IOC32_GETVERSION:
5644 cmd = FS_IOC_GETVERSION;
5645 break;
5646 default:
5647 return -ENOIOCTLCMD;
5648 }
5649
5650 return btrfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
5651}
5652#endif