diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 210 |
1 files changed, 178 insertions, 32 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index a6d8efa46bfe..0401397b5c92 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -59,6 +59,32 @@ | |||
| 59 | #include "props.h" | 59 | #include "props.h" |
| 60 | #include "sysfs.h" | 60 | #include "sysfs.h" |
| 61 | 61 | ||
| 62 | #ifdef CONFIG_64BIT | ||
| 63 | /* If we have a 32-bit userspace and 64-bit kernel, then the UAPI | ||
| 64 | * structures are incorrect, as the timespec structure from userspace | ||
| 65 | * is 4 bytes too small. We define these alternatives here to teach | ||
| 66 | * the kernel about the 32-bit struct packing. | ||
| 67 | */ | ||
| 68 | struct btrfs_ioctl_timespec_32 { | ||
| 69 | __u64 sec; | ||
| 70 | __u32 nsec; | ||
| 71 | } __attribute__ ((__packed__)); | ||
| 72 | |||
| 73 | struct btrfs_ioctl_received_subvol_args_32 { | ||
| 74 | char uuid[BTRFS_UUID_SIZE]; /* in */ | ||
| 75 | __u64 stransid; /* in */ | ||
| 76 | __u64 rtransid; /* out */ | ||
| 77 | struct btrfs_ioctl_timespec_32 stime; /* in */ | ||
| 78 | struct btrfs_ioctl_timespec_32 rtime; /* out */ | ||
| 79 | __u64 flags; /* in */ | ||
| 80 | __u64 reserved[16]; /* in */ | ||
| 81 | } __attribute__ ((__packed__)); | ||
| 82 | |||
| 83 | #define BTRFS_IOC_SET_RECEIVED_SUBVOL_32 _IOWR(BTRFS_IOCTL_MAGIC, 37, \ | ||
| 84 | struct btrfs_ioctl_received_subvol_args_32) | ||
| 85 | #endif | ||
| 86 | |||
| 87 | |||
| 62 | static int btrfs_clone(struct inode *src, struct inode *inode, | 88 | static int btrfs_clone(struct inode *src, struct inode *inode, |
| 63 | u64 off, u64 olen, u64 olen_aligned, u64 destoff); | 89 | u64 off, u64 olen, u64 olen_aligned, u64 destoff); |
| 64 | 90 | ||
| @@ -585,6 +611,23 @@ fail: | |||
| 585 | return ret; | 611 | return ret; |
| 586 | } | 612 | } |
| 587 | 613 | ||
| 614 | static void btrfs_wait_nocow_write(struct btrfs_root *root) | ||
| 615 | { | ||
| 616 | s64 writers; | ||
| 617 | DEFINE_WAIT(wait); | ||
| 618 | |||
| 619 | do { | ||
| 620 | prepare_to_wait(&root->subv_writers->wait, &wait, | ||
| 621 | TASK_UNINTERRUPTIBLE); | ||
| 622 | |||
| 623 | writers = percpu_counter_sum(&root->subv_writers->counter); | ||
| 624 | if (writers) | ||
| 625 | schedule(); | ||
| 626 | |||
| 627 | finish_wait(&root->subv_writers->wait, &wait); | ||
| 628 | } while (writers); | ||
| 629 | } | ||
| 630 | |||
| 588 | static int create_snapshot(struct btrfs_root *root, struct inode *dir, | 631 | static int create_snapshot(struct btrfs_root *root, struct inode *dir, |
| 589 | struct dentry *dentry, char *name, int namelen, | 632 | struct dentry *dentry, char *name, int namelen, |
| 590 | u64 *async_transid, bool readonly, | 633 | u64 *async_transid, bool readonly, |
| @@ -598,15 +641,21 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
| 598 | if (!root->ref_cows) | 641 | if (!root->ref_cows) |
| 599 | return -EINVAL; | 642 | return -EINVAL; |
| 600 | 643 | ||
| 644 | atomic_inc(&root->will_be_snapshoted); | ||
| 645 | smp_mb__after_atomic_inc(); | ||
| 646 | btrfs_wait_nocow_write(root); | ||
| 647 | |||
| 601 | ret = btrfs_start_delalloc_inodes(root, 0); | 648 | ret = btrfs_start_delalloc_inodes(root, 0); |
| 602 | if (ret) | 649 | if (ret) |
| 603 | return ret; | 650 | goto out; |
| 604 | 651 | ||
| 605 | btrfs_wait_ordered_extents(root, -1); | 652 | btrfs_wait_ordered_extents(root, -1); |
| 606 | 653 | ||
| 607 | pending_snapshot = kzalloc(sizeof(*pending_snapshot), GFP_NOFS); | 654 | pending_snapshot = kzalloc(sizeof(*pending_snapshot), GFP_NOFS); |
| 608 | if (!pending_snapshot) | 655 | if (!pending_snapshot) { |
| 609 | return -ENOMEM; | 656 | ret = -ENOMEM; |
| 657 | goto out; | ||
| 658 | } | ||
| 610 | 659 | ||
| 611 | btrfs_init_block_rsv(&pending_snapshot->block_rsv, | 660 | btrfs_init_block_rsv(&pending_snapshot->block_rsv, |
| 612 | BTRFS_BLOCK_RSV_TEMP); | 661 | BTRFS_BLOCK_RSV_TEMP); |
| @@ -623,7 +672,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
| 623 | &pending_snapshot->qgroup_reserved, | 672 | &pending_snapshot->qgroup_reserved, |
| 624 | false); | 673 | false); |
| 625 | if (ret) | 674 | if (ret) |
| 626 | goto out; | 675 | goto free; |
| 627 | 676 | ||
| 628 | pending_snapshot->dentry = dentry; | 677 | pending_snapshot->dentry = dentry; |
| 629 | pending_snapshot->root = root; | 678 | pending_snapshot->root = root; |
| @@ -674,8 +723,10 @@ fail: | |||
| 674 | btrfs_subvolume_release_metadata(BTRFS_I(dir)->root, | 723 | btrfs_subvolume_release_metadata(BTRFS_I(dir)->root, |
| 675 | &pending_snapshot->block_rsv, | 724 | &pending_snapshot->block_rsv, |
| 676 | pending_snapshot->qgroup_reserved); | 725 | pending_snapshot->qgroup_reserved); |
| 677 | out: | 726 | free: |
| 678 | kfree(pending_snapshot); | 727 | kfree(pending_snapshot); |
| 728 | out: | ||
| 729 | atomic_dec(&root->will_be_snapshoted); | ||
| 679 | return ret; | 730 | return ret; |
| 680 | } | 731 | } |
| 681 | 732 | ||
| @@ -884,12 +935,14 @@ static int find_new_extents(struct btrfs_root *root, | |||
| 884 | min_key.type = BTRFS_EXTENT_DATA_KEY; | 935 | min_key.type = BTRFS_EXTENT_DATA_KEY; |
| 885 | min_key.offset = *off; | 936 | min_key.offset = *off; |
| 886 | 937 | ||
| 887 | path->keep_locks = 1; | ||
| 888 | |||
| 889 | while (1) { | 938 | while (1) { |
| 939 | path->keep_locks = 1; | ||
| 890 | ret = btrfs_search_forward(root, &min_key, path, newer_than); | 940 | ret = btrfs_search_forward(root, &min_key, path, newer_than); |
| 891 | if (ret != 0) | 941 | if (ret != 0) |
| 892 | goto none; | 942 | goto none; |
| 943 | path->keep_locks = 0; | ||
| 944 | btrfs_unlock_up_safe(path, 1); | ||
| 945 | process_slot: | ||
| 893 | if (min_key.objectid != ino) | 946 | if (min_key.objectid != ino) |
| 894 | goto none; | 947 | goto none; |
| 895 | if (min_key.type != BTRFS_EXTENT_DATA_KEY) | 948 | if (min_key.type != BTRFS_EXTENT_DATA_KEY) |
| @@ -908,6 +961,12 @@ static int find_new_extents(struct btrfs_root *root, | |||
| 908 | return 0; | 961 | return 0; |
| 909 | } | 962 | } |
| 910 | 963 | ||
| 964 | path->slots[0]++; | ||
| 965 | if (path->slots[0] < btrfs_header_nritems(leaf)) { | ||
| 966 | btrfs_item_key_to_cpu(leaf, &min_key, path->slots[0]); | ||
| 967 | goto process_slot; | ||
| 968 | } | ||
| 969 | |||
| 911 | if (min_key.offset == (u64)-1) | 970 | if (min_key.offset == (u64)-1) |
| 912 | goto none; | 971 | goto none; |
| 913 | 972 | ||
| @@ -935,10 +994,13 @@ static struct extent_map *defrag_lookup_extent(struct inode *inode, u64 start) | |||
| 935 | read_unlock(&em_tree->lock); | 994 | read_unlock(&em_tree->lock); |
| 936 | 995 | ||
| 937 | if (!em) { | 996 | if (!em) { |
| 997 | struct extent_state *cached = NULL; | ||
| 998 | u64 end = start + len - 1; | ||
| 999 | |||
| 938 | /* get the big lock and read metadata off disk */ | 1000 | /* get the big lock and read metadata off disk */ |
| 939 | lock_extent(io_tree, start, start + len - 1); | 1001 | lock_extent_bits(io_tree, start, end, 0, &cached); |
| 940 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); | 1002 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); |
| 941 | unlock_extent(io_tree, start, start + len - 1); | 1003 | unlock_extent_cached(io_tree, start, end, &cached, GFP_NOFS); |
| 942 | 1004 | ||
| 943 | if (IS_ERR(em)) | 1005 | if (IS_ERR(em)) |
| 944 | return NULL; | 1006 | return NULL; |
| @@ -957,7 +1019,8 @@ static bool defrag_check_next_extent(struct inode *inode, struct extent_map *em) | |||
| 957 | return false; | 1019 | return false; |
| 958 | 1020 | ||
| 959 | next = defrag_lookup_extent(inode, em->start + em->len); | 1021 | next = defrag_lookup_extent(inode, em->start + em->len); |
| 960 | if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE) | 1022 | if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE || |
| 1023 | (em->block_start + em->block_len == next->block_start)) | ||
| 961 | ret = false; | 1024 | ret = false; |
| 962 | 1025 | ||
| 963 | free_extent_map(next); | 1026 | free_extent_map(next); |
| @@ -1076,10 +1139,12 @@ again: | |||
| 1076 | page_start = page_offset(page); | 1139 | page_start = page_offset(page); |
| 1077 | page_end = page_start + PAGE_CACHE_SIZE - 1; | 1140 | page_end = page_start + PAGE_CACHE_SIZE - 1; |
| 1078 | while (1) { | 1141 | while (1) { |
| 1079 | lock_extent(tree, page_start, page_end); | 1142 | lock_extent_bits(tree, page_start, page_end, |
| 1143 | 0, &cached_state); | ||
| 1080 | ordered = btrfs_lookup_ordered_extent(inode, | 1144 | ordered = btrfs_lookup_ordered_extent(inode, |
| 1081 | page_start); | 1145 | page_start); |
| 1082 | unlock_extent(tree, page_start, page_end); | 1146 | unlock_extent_cached(tree, page_start, page_end, |
| 1147 | &cached_state, GFP_NOFS); | ||
| 1083 | if (!ordered) | 1148 | if (!ordered) |
| 1084 | break; | 1149 | break; |
| 1085 | 1150 | ||
| @@ -1356,8 +1421,12 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
| 1356 | } | 1421 | } |
| 1357 | } | 1422 | } |
| 1358 | 1423 | ||
| 1359 | if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) | 1424 | if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) { |
| 1360 | filemap_flush(inode->i_mapping); | 1425 | filemap_flush(inode->i_mapping); |
| 1426 | if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, | ||
| 1427 | &BTRFS_I(inode)->runtime_flags)) | ||
| 1428 | filemap_flush(inode->i_mapping); | ||
| 1429 | } | ||
| 1361 | 1430 | ||
| 1362 | if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { | 1431 | if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { |
| 1363 | /* the filemap_flush will queue IO into the worker threads, but | 1432 | /* the filemap_flush will queue IO into the worker threads, but |
| @@ -1573,7 +1642,7 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file, | |||
| 1573 | if (src_inode->i_sb != file_inode(file)->i_sb) { | 1642 | if (src_inode->i_sb != file_inode(file)->i_sb) { |
| 1574 | btrfs_info(BTRFS_I(src_inode)->root->fs_info, | 1643 | btrfs_info(BTRFS_I(src_inode)->root->fs_info, |
| 1575 | "Snapshot src from another FS"); | 1644 | "Snapshot src from another FS"); |
| 1576 | ret = -EINVAL; | 1645 | ret = -EXDEV; |
| 1577 | } else if (!inode_owner_or_capable(src_inode)) { | 1646 | } else if (!inode_owner_or_capable(src_inode)) { |
| 1578 | /* | 1647 | /* |
| 1579 | * Subvolume creation is not restricted, but snapshots | 1648 | * Subvolume creation is not restricted, but snapshots |
| @@ -1797,7 +1866,9 @@ static noinline int may_destroy_subvol(struct btrfs_root *root) | |||
| 1797 | if (di && !IS_ERR(di)) { | 1866 | if (di && !IS_ERR(di)) { |
| 1798 | btrfs_dir_item_key_to_cpu(path->nodes[0], di, &key); | 1867 | btrfs_dir_item_key_to_cpu(path->nodes[0], di, &key); |
| 1799 | if (key.objectid == root->root_key.objectid) { | 1868 | if (key.objectid == root->root_key.objectid) { |
| 1800 | ret = -ENOTEMPTY; | 1869 | ret = -EPERM; |
| 1870 | btrfs_err(root->fs_info, "deleting default subvolume " | ||
| 1871 | "%llu is not allowed", key.objectid); | ||
| 1801 | goto out; | 1872 | goto out; |
| 1802 | } | 1873 | } |
| 1803 | btrfs_release_path(path); | 1874 | btrfs_release_path(path); |
| @@ -2994,8 +3065,9 @@ process_slot: | |||
| 2994 | new_key.offset + datal, | 3065 | new_key.offset + datal, |
| 2995 | 1); | 3066 | 1); |
| 2996 | if (ret) { | 3067 | if (ret) { |
| 2997 | btrfs_abort_transaction(trans, root, | 3068 | if (ret != -EINVAL) |
| 2998 | ret); | 3069 | btrfs_abort_transaction(trans, |
| 3070 | root, ret); | ||
| 2999 | btrfs_end_transaction(trans, root); | 3071 | btrfs_end_transaction(trans, root); |
| 3000 | goto out; | 3072 | goto out; |
| 3001 | } | 3073 | } |
| @@ -3153,8 +3225,9 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 3153 | * decompress into destination's address_space (the file offset | 3225 | * decompress into destination's address_space (the file offset |
| 3154 | * may change, so source mapping won't do), then recompress (or | 3226 | * may change, so source mapping won't do), then recompress (or |
| 3155 | * otherwise reinsert) a subrange. | 3227 | * otherwise reinsert) a subrange. |
| 3156 | * - allow ranges within the same file to be cloned (provided | 3228 | * |
| 3157 | * they don't overlap)? | 3229 | * - split destination inode's inline extents. The inline extents can |
| 3230 | * be either compressed or non-compressed. | ||
| 3158 | */ | 3231 | */ |
| 3159 | 3232 | ||
| 3160 | /* the destination must be opened for writing */ | 3233 | /* the destination must be opened for writing */ |
| @@ -4353,10 +4426,9 @@ static long btrfs_ioctl_quota_rescan_wait(struct file *file, void __user *arg) | |||
| 4353 | return btrfs_qgroup_wait_for_completion(root->fs_info); | 4426 | return btrfs_qgroup_wait_for_completion(root->fs_info); |
| 4354 | } | 4427 | } |
| 4355 | 4428 | ||
| 4356 | static long btrfs_ioctl_set_received_subvol(struct file *file, | 4429 | static long _btrfs_ioctl_set_received_subvol(struct file *file, |
| 4357 | void __user *arg) | 4430 | struct btrfs_ioctl_received_subvol_args *sa) |
| 4358 | { | 4431 | { |
| 4359 | struct btrfs_ioctl_received_subvol_args *sa = NULL; | ||
| 4360 | struct inode *inode = file_inode(file); | 4432 | struct inode *inode = file_inode(file); |
| 4361 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4433 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 4362 | struct btrfs_root_item *root_item = &root->root_item; | 4434 | struct btrfs_root_item *root_item = &root->root_item; |
| @@ -4384,13 +4456,6 @@ static long btrfs_ioctl_set_received_subvol(struct file *file, | |||
| 4384 | goto out; | 4456 | goto out; |
| 4385 | } | 4457 | } |
| 4386 | 4458 | ||
| 4387 | sa = memdup_user(arg, sizeof(*sa)); | ||
| 4388 | if (IS_ERR(sa)) { | ||
| 4389 | ret = PTR_ERR(sa); | ||
| 4390 | sa = NULL; | ||
| 4391 | goto out; | ||
| 4392 | } | ||
| 4393 | |||
| 4394 | /* | 4459 | /* |
| 4395 | * 1 - root item | 4460 | * 1 - root item |
| 4396 | * 2 - uuid items (received uuid + subvol uuid) | 4461 | * 2 - uuid items (received uuid + subvol uuid) |
| @@ -4444,14 +4509,91 @@ static long btrfs_ioctl_set_received_subvol(struct file *file, | |||
| 4444 | goto out; | 4509 | goto out; |
| 4445 | } | 4510 | } |
| 4446 | 4511 | ||
| 4512 | out: | ||
| 4513 | up_write(&root->fs_info->subvol_sem); | ||
| 4514 | mnt_drop_write_file(file); | ||
| 4515 | return ret; | ||
| 4516 | } | ||
| 4517 | |||
| 4518 | #ifdef CONFIG_64BIT | ||
| 4519 | static long btrfs_ioctl_set_received_subvol_32(struct file *file, | ||
| 4520 | void __user *arg) | ||
| 4521 | { | ||
| 4522 | struct btrfs_ioctl_received_subvol_args_32 *args32 = NULL; | ||
| 4523 | struct btrfs_ioctl_received_subvol_args *args64 = NULL; | ||
| 4524 | int ret = 0; | ||
| 4525 | |||
| 4526 | args32 = memdup_user(arg, sizeof(*args32)); | ||
| 4527 | if (IS_ERR(args32)) { | ||
| 4528 | ret = PTR_ERR(args32); | ||
| 4529 | args32 = NULL; | ||
| 4530 | goto out; | ||
| 4531 | } | ||
| 4532 | |||
| 4533 | args64 = kmalloc(sizeof(*args64), GFP_NOFS); | ||
| 4534 | if (IS_ERR(args64)) { | ||
| 4535 | ret = PTR_ERR(args64); | ||
| 4536 | args64 = NULL; | ||
| 4537 | goto out; | ||
| 4538 | } | ||
| 4539 | |||
| 4540 | memcpy(args64->uuid, args32->uuid, BTRFS_UUID_SIZE); | ||
| 4541 | args64->stransid = args32->stransid; | ||
| 4542 | args64->rtransid = args32->rtransid; | ||
| 4543 | args64->stime.sec = args32->stime.sec; | ||
| 4544 | args64->stime.nsec = args32->stime.nsec; | ||
| 4545 | args64->rtime.sec = args32->rtime.sec; | ||
| 4546 | args64->rtime.nsec = args32->rtime.nsec; | ||
| 4547 | args64->flags = args32->flags; | ||
| 4548 | |||
| 4549 | ret = _btrfs_ioctl_set_received_subvol(file, args64); | ||
| 4550 | if (ret) | ||
| 4551 | goto out; | ||
| 4552 | |||
| 4553 | memcpy(args32->uuid, args64->uuid, BTRFS_UUID_SIZE); | ||
| 4554 | args32->stransid = args64->stransid; | ||
| 4555 | args32->rtransid = args64->rtransid; | ||
| 4556 | args32->stime.sec = args64->stime.sec; | ||
| 4557 | args32->stime.nsec = args64->stime.nsec; | ||
| 4558 | args32->rtime.sec = args64->rtime.sec; | ||
| 4559 | args32->rtime.nsec = args64->rtime.nsec; | ||
| 4560 | args32->flags = args64->flags; | ||
| 4561 | |||
| 4562 | ret = copy_to_user(arg, args32, sizeof(*args32)); | ||
| 4563 | if (ret) | ||
| 4564 | ret = -EFAULT; | ||
| 4565 | |||
| 4566 | out: | ||
| 4567 | kfree(args32); | ||
| 4568 | kfree(args64); | ||
| 4569 | return ret; | ||
| 4570 | } | ||
| 4571 | #endif | ||
| 4572 | |||
| 4573 | static long btrfs_ioctl_set_received_subvol(struct file *file, | ||
| 4574 | void __user *arg) | ||
| 4575 | { | ||
| 4576 | struct btrfs_ioctl_received_subvol_args *sa = NULL; | ||
| 4577 | int ret = 0; | ||
| 4578 | |||
| 4579 | sa = memdup_user(arg, sizeof(*sa)); | ||
| 4580 | if (IS_ERR(sa)) { | ||
| 4581 | ret = PTR_ERR(sa); | ||
| 4582 | sa = NULL; | ||
| 4583 | goto out; | ||
| 4584 | } | ||
| 4585 | |||
| 4586 | ret = _btrfs_ioctl_set_received_subvol(file, sa); | ||
| 4587 | |||
| 4588 | if (ret) | ||
| 4589 | goto out; | ||
| 4590 | |||
| 4447 | ret = copy_to_user(arg, sa, sizeof(*sa)); | 4591 | ret = copy_to_user(arg, sa, sizeof(*sa)); |
| 4448 | if (ret) | 4592 | if (ret) |
| 4449 | ret = -EFAULT; | 4593 | ret = -EFAULT; |
| 4450 | 4594 | ||
| 4451 | out: | 4595 | out: |
| 4452 | kfree(sa); | 4596 | kfree(sa); |
| 4453 | up_write(&root->fs_info->subvol_sem); | ||
| 4454 | mnt_drop_write_file(file); | ||
| 4455 | return ret; | 4597 | return ret; |
| 4456 | } | 4598 | } |
| 4457 | 4599 | ||
| @@ -4746,7 +4888,7 @@ long btrfs_ioctl(struct file *file, unsigned int | |||
| 4746 | case BTRFS_IOC_SYNC: { | 4888 | case BTRFS_IOC_SYNC: { |
| 4747 | int ret; | 4889 | int ret; |
| 4748 | 4890 | ||
| 4749 | ret = btrfs_start_delalloc_roots(root->fs_info, 0); | 4891 | ret = btrfs_start_delalloc_roots(root->fs_info, 0, -1); |
| 4750 | if (ret) | 4892 | if (ret) |
| 4751 | return ret; | 4893 | return ret; |
| 4752 | ret = btrfs_sync_fs(file->f_dentry->d_sb, 1); | 4894 | ret = btrfs_sync_fs(file->f_dentry->d_sb, 1); |
| @@ -4770,6 +4912,10 @@ long btrfs_ioctl(struct file *file, unsigned int | |||
| 4770 | return btrfs_ioctl_balance_progress(root, argp); | 4912 | return btrfs_ioctl_balance_progress(root, argp); |
| 4771 | case BTRFS_IOC_SET_RECEIVED_SUBVOL: | 4913 | case BTRFS_IOC_SET_RECEIVED_SUBVOL: |
| 4772 | return btrfs_ioctl_set_received_subvol(file, argp); | 4914 | return btrfs_ioctl_set_received_subvol(file, argp); |
| 4915 | #ifdef CONFIG_64BIT | ||
| 4916 | case BTRFS_IOC_SET_RECEIVED_SUBVOL_32: | ||
| 4917 | return btrfs_ioctl_set_received_subvol_32(file, argp); | ||
| 4918 | #endif | ||
| 4773 | case BTRFS_IOC_SEND: | 4919 | case BTRFS_IOC_SEND: |
| 4774 | return btrfs_ioctl_send(file, argp); | 4920 | return btrfs_ioctl_send(file, argp); |
| 4775 | case BTRFS_IOC_GET_DEV_STATS: | 4921 | case BTRFS_IOC_GET_DEV_STATS: |
