Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 346700
b: refs/heads/master
c: 3f6bcfb
h: refs/heads/master
v: v3
  • Loading branch information
Stefan Behrens authored and Chris Mason committed Dec 17, 2012
1 parent 174a26f commit 249f3af
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ad6d620e2a5704f6bf3a39c92a75aad962c51cb3
refs/heads/master: 3f6bcfbd4149875662773eb40a62294cddf215d4
48 changes: 48 additions & 0 deletions trunk/fs/btrfs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
#include "backref.h"
#include "rcu-string.h"
#include "send.h"
#include "dev-replace.h"

/* Mask out flags that are inappropriate for the given type of inode. */
static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags)
Expand Down Expand Up @@ -3171,6 +3172,51 @@ static long btrfs_ioctl_get_dev_stats(struct btrfs_root *root,
return ret;
}

static long btrfs_ioctl_dev_replace(struct btrfs_root *root, void __user *arg)
{
struct btrfs_ioctl_dev_replace_args *p;
int ret;

if (!capable(CAP_SYS_ADMIN))
return -EPERM;

p = memdup_user(arg, sizeof(*p));
if (IS_ERR(p))
return PTR_ERR(p);

switch (p->cmd) {
case BTRFS_IOCTL_DEV_REPLACE_CMD_START:
if (atomic_xchg(
&root->fs_info->mutually_exclusive_operation_running,
1)) {
pr_info("btrfs: dev add/delete/balance/replace/resize operation in progress\n");
ret = -EINPROGRESS;
} else {
ret = btrfs_dev_replace_start(root, p);
atomic_set(
&root->fs_info->mutually_exclusive_operation_running,
0);
}
break;
case BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS:
btrfs_dev_replace_status(root->fs_info, p);
ret = 0;
break;
case BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL:
ret = btrfs_dev_replace_cancel(root->fs_info, p);
break;
default:
ret = -EINVAL;
break;
}

if (copy_to_user(arg, p, sizeof(*p)))
ret = -EFAULT;

kfree(p);
return ret;
}

static long btrfs_ioctl_ino_to_path(struct btrfs_root *root, void __user *arg)
{
int ret = 0;
Expand Down Expand Up @@ -3826,6 +3872,8 @@ long btrfs_ioctl(struct file *file, unsigned int
return btrfs_ioctl_qgroup_create(root, argp);
case BTRFS_IOC_QGROUP_LIMIT:
return btrfs_ioctl_qgroup_limit(root, argp);
case BTRFS_IOC_DEV_REPLACE:
return btrfs_ioctl_dev_replace(root, argp);
}

return -ENOTTY;
Expand Down
7 changes: 4 additions & 3 deletions trunk/fs/btrfs/ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ struct btrfs_ioctl_vol_args {
char name[BTRFS_PATH_NAME_MAX + 1];
};

#define BTRFS_DEVICE_PATH_NAME_MAX 1024

#define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0)
#define BTRFS_SUBVOL_RDONLY (1ULL << 1)
#define BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2)
Expand Down Expand Up @@ -127,10 +129,10 @@ struct btrfs_ioctl_scrub_args {
#define BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID 1
struct btrfs_ioctl_dev_replace_start_params {
__u64 srcdevid; /* in, if 0, use srcdev_name instead */
__u8 srcdev_name[BTRFS_PATH_NAME_MAX + 1]; /* in */
__u8 tgtdev_name[BTRFS_PATH_NAME_MAX + 1]; /* in */
__u64 cont_reading_from_srcdev_mode; /* in, see #define
* above */
__u8 srcdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1]; /* in */
__u8 tgtdev_name[BTRFS_DEVICE_PATH_NAME_MAX + 1]; /* in */
};

#define BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED 0
Expand Down Expand Up @@ -165,7 +167,6 @@ struct btrfs_ioctl_dev_replace_args {
__u64 spare[64];
};

#define BTRFS_DEVICE_PATH_NAME_MAX 1024
struct btrfs_ioctl_dev_info_args {
__u64 devid; /* in/out */
__u8 uuid[BTRFS_UUID_SIZE]; /* in/out */
Expand Down

0 comments on commit 249f3af

Please sign in to comment.