From patchwork Fri Jul 27 00:25: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: 10546535 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 210F61822 for ; Fri, 27 Jul 2018 00:21:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C0202BA1F for ; Fri, 27 Jul 2018 00:21:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0047A2BA23; Fri, 27 Jul 2018 00:21:42 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID,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 8485D2BA25 for ; Fri, 27 Jul 2018 00:21:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731774AbeG0Bkx (ORCPT ); Thu, 26 Jul 2018 21:40:53 -0400 Received: from userp2120.oracle.com ([156.151.31.85]:33722 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731709AbeG0Bkx (ORCPT ); Thu, 26 Jul 2018 21:40:53 -0400 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 w6R0HfN8120577 for ; Fri, 27 Jul 2018 00:21:39 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=ZIj7mO+qj+7TCQ+jDXGBfIlg3tD9Kso+etBu6sOZeVM=; b=0dQmAddrRhUWVxM7mdbkEs1x8D7wvpM91dvpDqDPnArMbZb8JhBIOjjCb9Ymu04/Qd7a 98DLlLOmPbqi1g1lkbablRUmpUSnn8yH7gTESOpH5VcOdwbB0w7abeEidR+Y4slCKpQh qbVO1R8WRRAd+syoc7Zjfezjfw4eDbvVq7p1vRL8KOc/3pLL5G5G5EEbeB4FwedUQP3p Ax1/z7vbB80+9UPkRC4GDQZWw9WNWzliTHH4BOu3MvcOxe29RUX5juPZj4h4hntJf2wj KAq3E+MHg+dS0AvPB1CpgpkTHS+G474gxgWxe1FUQ7UYMnbeflp3gGXC4D0RNQ9OnZdq og== Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp2120.oracle.com with ESMTP id 2kbwfq55qe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 27 Jul 2018 00:21:39 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id w6R0Lcgq002862 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 27 Jul 2018 00:21:38 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w6R0LcPj027138 for ; Fri, 27 Jul 2018 00:21:38 GMT Received: from tp.sg.oracle.com (/10.191.34.248) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 Jul 2018 17:21:38 -0700 From: Anand Jain To: linux-btrfs@vger.kernel.org Subject: [PATCH] btrfs-progs: add cli to forget one or all scanned devices Date: Fri, 27 Jul 2018 08:25:04 +0800 Message-Id: <20180727002504.10142-3-anand.jain@oracle.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20180727002504.10142-1-anand.jain@oracle.com> References: <20180727002504.10142-1-anand.jain@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8966 signatures=668706 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=4 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=912 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1806210000 definitions=main-1807270002 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 --- cmds-device.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ioctl.h | 2 ++ 2 files changed, 60 insertions(+) diff --git a/cmds-device.c b/cmds-device.c index 86459d1b9564..49cfd4b41adb 100644 --- a/cmds-device.c +++ b/cmds-device.c @@ -326,6 +326,63 @@ out: return !!ret; } +static const char * const cmd_device_forget_usage[] = { + "btrfs device forget []", + "Forget a stale device or all stale devices in btrfs.ko", + NULL +}; + +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 int cmd_device_forget(int argc, char **argv) +{ + char *path; + int ret = 0; + + if (check_argc_max(argc - optind, 1)) + usage(cmd_device_forget_usage); + + if (argc == 1) { + ret = btrfs_forget_devices(NULL); + if (ret) + error("Can't forget: %s", strerror(-ret)); + return ret; + } + + path = canonicalize_path(argv[1]); + if (!path) { + error("Could not canonicalize path '%s': %s", + argv[1], strerror(errno)); + return -ENOENT; + } + + ret = btrfs_forget_devices(path); + if (ret) + error("Can't forget '%s': %s", path, strerror(-ret)); + + free(path); + + return ret; +} + static const char * const cmd_device_ready_usage[] = { "btrfs device ready ", "Check device to see if it has all of its devices in cache for mounting", @@ -601,6 +658,7 @@ const struct cmd_group device_cmd_group = { CMD_ALIAS }, { "remove", cmd_device_remove, cmd_device_remove_usage, NULL, 0 }, { "scan", cmd_device_scan, cmd_device_scan_usage, NULL, 0 }, + { "forget", cmd_device_forget, cmd_device_forget_usage, NULL, 0 }, { "ready", cmd_device_ready, cmd_device_ready_usage, NULL, 0 }, { "stats", cmd_device_stats, cmd_device_stats_usage, NULL, 0 }, { "usage", cmd_device_usage, 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