From: Goffredo Baroncelli <kreijack@inwind.it>
To: Anand Jain <anand.jain@oracle.com>, linux-btrfs@vger.kernel.org
Cc: clm@fb.com, dsterba@suse.cz
Subject: Re: [PATCH 2/2] btrfs-progs: device delete to accept devid
Date: Mon, 17 Aug 2015 09:00:42 +0200 [thread overview]
Message-ID: <55D1869A.8080802@inwind.it> (raw)
In-Reply-To: <1439548611-29730-3-git-send-email-anand.jain@oracle.com>
On 2015-08-14 12:36, Anand Jain wrote:
> This patch introduces new option <devid> for the command
>
> btrfs device delete <device_path|devid>[..] <mnt>
>
> In a user reported issue on a 3-disk-RAID1, one disk failed with its
> SB unreadable. Now with this patch user will have a choice to delete
> the device using devid.
>
> The other method we could do, is to match the input device_path
> to the available device_paths with in the kernel. But that won't
> work in all the cases, like what if user provided mapper path
> when the path within the kernel is a non-mapper path.
>
> This patch depends on the below kernel patch for the new feature to work,
> however it will fail-back to the old interface for the kernel without the
> patch
>
> Btrfs: device delete by devid
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> Documentation/btrfs-device.asciidoc | 2 +-
> cmds-device.c | 45 ++++++++++++++++++++++++++++---------
> ioctl.h | 8 +++++++
> 3 files changed, 44 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/btrfs-device.asciidoc b/Documentation/btrfs-device.asciidoc
> index 2827598..61ede6e 100644
> --- a/Documentation/btrfs-device.asciidoc
> +++ b/Documentation/btrfs-device.asciidoc
> @@ -74,7 +74,7 @@ do not perform discard by default
> -f|--force::::
> force overwrite of existing filesystem on the given disk(s)
>
> -*remove* <dev> [<dev>...] <path>::
> +*remove* <dev>|<devid> [<dev>|<devid>...] <path>::
> Remove device(s) from a filesystem identified by <path>.
>
> *delete* <dev> [<dev>...] <path>::
also here is missing <devid> (below you added)
> diff --git a/cmds-device.c b/cmds-device.c
> index 0e60500..eb4358d 100644
> --- a/cmds-device.c
> +++ b/cmds-device.c
> @@ -164,16 +164,34 @@ static int _cmd_rm_dev(int argc, char **argv, const char * const *usagestr)
> struct btrfs_ioctl_vol_args arg;
> int res;
>
> - if (!is_block_device(argv[i])) {
> + struct btrfs_ioctl_vol_args_v3 argv3 = {0};
> + int its_num = false;
> +
> + if (is_numerical(argv[i])) {
> + argv3.devid = arg_strtou64(argv[i]);
> + its_num = true;
> + } else if (is_block_device(argv[i])) {
> + strncpy_null(argv3.name, argv[i]);
> + } else {
> fprintf(stderr,
> - "ERROR: %s is not a block device\n", argv[i]);
> + "ERROR: %s is not a block device or devid\n", argv[i]);
> ret++;
> continue;
> }
> - memset(&arg, 0, sizeof(arg));
> - strncpy_null(arg.name, argv[i]);
> - res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
> + res = ioctl(fdmnt, BTRFS_IOC_RM_DEV_V2, &argv3);
> e = errno;
> + if (res && e == ENOTTY) {
> + if (its_num) {
> + fprintf(stderr,
> + "Error: Kernel does not support delete by devid\n");
> + ret = 1;
> + continue;
> + }
> + memset(&arg, 0, sizeof(arg));
> + strncpy_null(arg.name, argv[i]);
> + res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
> + e = errno;
> + }
> if (res) {
> const char *msg;
>
> @@ -181,9 +199,16 @@ static int _cmd_rm_dev(int argc, char **argv, const char * const *usagestr)
> msg = btrfs_err_str(res);
> else
> msg = strerror(e);
> - fprintf(stderr,
> - "ERROR: error removing the device '%s' - %s\n",
> - argv[i], msg);
> +
> + if (its_num)
> + fprintf(stderr,
> + "ERROR: error removing the devid '%llu' - %s\n",
> + argv3.devid, msg);
> + else
> + fprintf(stderr,
> + "ERROR: error removing the device '%s' - %s\n",
> + argv[i], msg);
> +
> ret++;
> }
> }
> @@ -193,7 +218,7 @@ static int _cmd_rm_dev(int argc, char **argv, const char * const *usagestr)
> }
>
> static const char * const cmd_rm_dev_usage[] = {
> - "btrfs device remove <device> [<device>...] <path>",
> + "btrfs device remove <device>|<devid> [<device>|<devid>...] <path>",
> "Remove a device from a filesystem",
> NULL
> };
> @@ -204,7 +229,7 @@ static int cmd_rm_dev(int argc, char **argv)
> }
>
> static const char * const cmd_del_dev_usage[] = {
> - "btrfs device delete <device> [<device>...] <path>",
> + "btrfs device delete <device>|<devid> [<device>|<devid>...] <path>",
> "Remove a device from a filesystem",
> NULL
> };
> diff --git a/ioctl.h b/ioctl.h
> index dff015a..6870931 100644
> --- a/ioctl.h
> +++ b/ioctl.h
> @@ -40,6 +40,12 @@ struct btrfs_ioctl_vol_args {
> char name[BTRFS_PATH_NAME_MAX + 1];
> };
>
> +struct btrfs_ioctl_vol_args_v3 {
> + __s64 fd;
> + char name[BTRFS_PATH_NAME_MAX + 1];
> + __u64 devid;
> +};
> +
> #define BTRFS_DEVICE_PATH_NAME_MAX 1024
>
> #define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0)
> @@ -683,6 +689,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code)
> struct btrfs_ioctl_feature_flags[2])
> #define BTRFS_IOC_GET_SUPPORTED_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, \
> struct btrfs_ioctl_feature_flags[3])
> +#define BTRFS_IOC_RM_DEV_V2 _IOW(BTRFS_IOCTL_MAGIC, 58, \
> + struct btrfs_ioctl_vol_args_v3)
> #ifdef __cplusplus
> }
> #endif
>
--
gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it>
Key fingerprint BBF5 1610 0B64 DAC6 5F7D 17B2 0EDA 9B37 8B82 E0B5
next prev parent reply other threads:[~2015-08-17 7:09 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-14 10:36 [PATCH 0/2] Btrfs-progs: device delete to accept devid Anand Jain
2015-08-14 10:36 ` [PATCH 1/2] btrfs-progs: move is_numerical to utils-lib.h and make it non static Anand Jain
2015-08-14 10:36 ` [PATCH 2/2] btrfs-progs: device delete to accept devid Anand Jain
2015-08-17 7:00 ` Goffredo Baroncelli [this message]
2015-08-17 11:17 ` Anand Jain
2015-08-20 11:29 ` Goffredo Baroncelli
2015-08-28 14:17 ` Anand Jain
2015-08-28 16:56 ` Goffredo Baroncelli
2015-08-28 16:57 ` Goffredo Baroncelli
-- strict thread matches above, loose matches on Subject: below --
2015-04-20 10:29 [PATCH] device delete by devid Anand Jain
2015-04-20 10:29 ` [PATCH 2/2] btrfs-progs: device delete to accept devid Anand Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55D1869A.8080802@inwind.it \
--to=kreijack@inwind.it \
--cc=anand.jain@oracle.com \
--cc=clm@fb.com \
--cc=dsterba@suse.cz \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.