diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 196 |
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 | ||
609 | fail: | 613 | fail: |
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 | |||
638 | fail_free: | ||
639 | kfree(root_item); | ||
640 | return ret; | ||
632 | } | 641 | } |
633 | 642 | ||
634 | static void btrfs_wait_for_no_snapshoting_writes(struct btrfs_root *root) | 643 | static 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 | ||
2670 | static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) | 2679 | static 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 | } | ||
2705 | out: | 2726 | out: |
2706 | kfree(vol_args); | 2727 | kfree(vol_args); |
2707 | err_drop: | 2728 | err_drop: |
@@ -2709,6 +2730,47 @@ err_drop: | |||
2709 | return ret; | 2730 | return ret; |
2710 | } | 2731 | } |
2711 | 2732 | ||
2733 | static 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); | ||
2766 | out: | ||
2767 | atomic_set(&root->fs_info->mutually_exclusive_operation_running, 0); | ||
2768 | out_drop_write: | ||
2769 | mnt_drop_write_file(file); | ||
2770 | |||
2771 | return ret; | ||
2772 | } | ||
2773 | |||
2712 | static long btrfs_ioctl_fs_info(struct btrfs_root *root, void __user *arg) | 2774 | static 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 | ||
3776 | out: | 3841 | out: |
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); |
5490 | out_drop_write: | ||
5491 | mnt_drop_write_file(file); | ||
5492 | |||
5493 | return ret; | ||
5419 | } | 5494 | } |
5420 | 5495 | ||
5421 | long btrfs_ioctl(struct file *file, unsigned int | 5496 | long 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 | ||
5634 | long 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 | ||