From patchwork Fri Nov 30 08:52:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anand Jain X-Patchwork-Id: 10705967 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1D5991057 for ; Fri, 30 Nov 2018 08:52:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F2AA2F1F5 for ; Fri, 30 Nov 2018 08:52:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 038802F20B; Fri, 30 Nov 2018 08:52:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8BF762F1F5 for ; Fri, 30 Nov 2018 08:52:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727260AbeK3UBI (ORCPT ); Fri, 30 Nov 2018 15:01:08 -0500 Received: from userp2120.oracle.com ([156.151.31.85]:34258 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726825AbeK3UBI (ORCPT ); Fri, 30 Nov 2018 15:01:08 -0500 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id wAU8iLrd072047 for ; Fri, 30 Nov 2018 08:52:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : in-reply-to : references; s=corp-2018-07-02; bh=TVzDE8kRYDbo2XzjLL45EJ8i8VRrKDp8N/9vxiklv94=; b=v69r3dywGPQnNCxqBRseq92Yx79h/8rYujzT9r8IvQ3H9DZQSuR1rfHZ1zeb0aXW7LQk CdMrpYWx+hEkMdczrjUFjJkBsAttHaevZcTkpA7b86FeggZ273eujTwpzmYuCnqakaLx OR0zk03IST8pbXCnBs57260uUjNiHVa3culCWMP8wDbdrEuGaoUVmSKbGHa+K+9AzoTH uNlCkwsC4By+cfzJJ93PFO7/cMNy4acvBhgGEp9kZCpyVWcf2ZXf7SbhJYfliVq3e7Ov aAJB37wMfupS/rQRrbXqIR+z12PyI76X69PSOsmlBLkFnYY/vQ/ijHIAyv9VBGEz1a96 Uw== Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp2120.oracle.com with ESMTP id 2nxy9rmpkw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 30 Nov 2018 08:52:32 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id wAU8qVHB022680 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 30 Nov 2018 08:52:31 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id wAU8qUph007330 for ; Fri, 30 Nov 2018 08:52:31 GMT Received: from tpasj.localdomain (/202.156.140.209) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 30 Nov 2018 00:52:30 -0800 From: Anand Jain To: linux-btrfs@vger.kernel.org Subject: [PATCH RESEND v12] btrfs-progs: add cli to forget one or all scanned devices Date: Fri, 30 Nov 2018 16:52:04 +0800 Message-Id: <1543567926-20080-3-git-send-email-anand.jain@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1543567926-20080-1-git-send-email-anand.jain@oracle.com> References: <1543567926-20080-1-git-send-email-anand.jain@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9092 signatures=668686 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=4 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1811300077 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds cli btrfs device forget [dev] to remove the given device structure in the kernel if the device is unmounted. If no argument is given it shall remove all stale (device which are not mounted) from the kernel. Signed-off-by: Anand Jain Reviewed-by: Nikolay Borisov --- v11->v12: none. v1->v12: pls ref to the cover-letter. cmds-device.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++----------- ioctl.h | 2 ++ 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/cmds-device.c b/cmds-device.c index 2a05f70a76a9..280d6f555377 100644 --- a/cmds-device.c +++ b/cmds-device.c @@ -254,10 +254,32 @@ static int cmd_device_delete(int argc, char **argv) return _cmd_device_remove(argc, argv, cmd_device_delete_usage); } +static int btrfs_forget_devices(char *path) +{ + struct btrfs_ioctl_vol_args args; + int ret; + int fd; + + fd = open("/dev/btrfs-control", O_RDWR); + if (fd < 0) + return -errno; + + memset(&args, 0, sizeof(args)); + if (path) + strncpy_null(args.name, path); + ret = ioctl(fd, BTRFS_IOC_FORGET_DEV, &args); + if (ret) + ret = -errno; + close(fd); + return ret; +} + static const char * const cmd_device_scan_usage[] = { - "btrfs device scan [(-d|--all-devices)| [...]]", - "Scan devices for a btrfs filesystem", + "btrfs device scan [(-d|--all-devices)|(-u|--forget)| "\ + "[...]]", + "Scan or forget (deregister) devices for a btrfs filesystem", " -d|--all-devices (deprecated)", + " -u|--forget [ ..]", NULL }; @@ -267,37 +289,53 @@ static int cmd_device_scan(int argc, char **argv) int devstart; int all = 0; int ret = 0; + int forget = 0; optind = 0; while (1) { int c; static const struct option long_options[] = { { "all-devices", no_argument, NULL, 'd'}, + { "forget", no_argument, NULL, 'u'}, { NULL, 0, NULL, 0} }; - c = getopt_long(argc, argv, "d", long_options, NULL); + c = getopt_long(argc, argv, "du", long_options, NULL); if (c < 0) break; switch (c) { case 'd': all = 1; break; + case 'u': + forget = 1; + break; default: usage(cmd_device_scan_usage); } } devstart = optind; + if (all && forget) + usage(cmd_device_scan_usage); + if (all && check_argc_max(argc - optind, 1)) usage(cmd_device_scan_usage); if (all || argc - optind == 0) { - printf("Scanning for Btrfs filesystems\n"); - ret = btrfs_scan_devices(); - error_on(ret, "error %d while scanning", ret); - ret = btrfs_register_all_devices(); - error_on(ret, "there are %d errors while registering devices", ret); + if (forget) { + ret = btrfs_forget_devices(NULL); + error_on(ret, "'%s', forget failed", + strerror(-ret)); + } else { + printf("Scanning for Btrfs filesystems\n"); + ret = btrfs_scan_devices(); + error_on(ret, "error %d while scanning", ret); + ret = btrfs_register_all_devices(); + error_on(ret, + "there are %d errors while registering devices", + ret); + } goto out; } @@ -315,11 +353,19 @@ static int cmd_device_scan(int argc, char **argv) ret = 1; goto out; } - printf("Scanning for Btrfs filesystems in '%s'\n", path); - if (btrfs_register_one_device(path) != 0) { - ret = 1; - free(path); - goto out; + if (forget) { + ret = btrfs_forget_devices(path); + if (ret) + error("Can't forget '%s': %s", + path, strerror(-ret)); + } else { + printf("Scanning for Btrfs filesystems in '%s'\n", + path); + if (btrfs_register_one_device(path) != 0) { + ret = 1; + free(path); + goto out; + } } free(path); } diff --git a/ioctl.h b/ioctl.h index 709e996f401c..e27d80e09392 100644 --- a/ioctl.h +++ b/ioctl.h @@ -721,6 +721,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code) struct btrfs_ioctl_vol_args) #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \ struct btrfs_ioctl_vol_args) +#define BTRFS_IOC_FORGET_DEV _IOW(BTRFS_IOCTL_MAGIC, 5, \ + struct btrfs_ioctl_vol_args) /* trans start and trans end are dangerous, and only for * use by applications that know how to avoid the * resulting deadlocks