From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from userp1040.oracle.com ([156.151.31.81]:48288 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750731Ab3DKJ4D (ORCPT ); Thu, 11 Apr 2013 05:56:03 -0400 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3B9u1Bm009960 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 11 Apr 2013 09:56:02 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3B9u1jb023393 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 11 Apr 2013 09:56:01 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r3B9u0Ss028174 for ; Thu, 11 Apr 2013 04:56:00 -0500 Message-ID: <51668911.4090609@oracle.com> Date: Thu, 11 Apr 2013 17:57:37 +0800 From: Anand Jain MIME-Version: 1.0 To: linux-btrfs@vger.kernel.org Subject: Re: [obsoleted] [PATCH 1/5 v5] btrfs-progs: make btrfs dev scan multi path aware References: <1362132800-29563-1-git-send-email-anand.jain@oracle.com> <1364378856-21053-1-git-send-email-anand.jain@oracle.com> <1364378856-21053-2-git-send-email-anand.jain@oracle.com> In-Reply-To: <1364378856-21053-2-git-send-email-anand.jain@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Sender: linux-btrfs-owner@vger.kernel.org List-ID: This patch is replaced By: btrfs-progs: avoid ioctl for multipath-dev with its non-multipath path which is also sent to this mailing list. thanks, Anand On 03/27/2013 06:07 PM, Anand Jain wrote: > We should avoid using non multi-path (mp) path for mp disks > As of now there is no good way (like api) to check that. > A workaround way is to check if the O_EXCL open is unsuccessful. > This is safe since otherwise the BTRFS_IOC_SCAN_DEV ioctl would > fail if the disk-path can not be opened with the flag O_EXCL set. > > This patch also includes some (error) print format changes related > to the btrfs dev scan.. > > Signed-off-by: Anand Jain > --- > cmds-device.c | 53 +++++++++++++++++++++++++++++++++++++++-------------- > utils.c | 31 ++++++++++++++++++++++++------- > 2 files changed, 63 insertions(+), 21 deletions(-) > > diff --git a/cmds-device.c b/cmds-device.c > index 41e79d3..b8d05fd 100644 > --- a/cmds-device.c > +++ b/cmds-device.c > @@ -185,7 +185,7 @@ static const char * const cmd_scan_dev_usage[] = { > > static int cmd_scan_dev(int argc, char **argv) > { > - int i, fd, e; > + int i, fd, e, ret = 0; > int checklist = 1; > int devstart = 1; > > @@ -197,6 +197,21 @@ static int cmd_scan_dev(int argc, char **argv) > devstart += 1; > } > > + fd = open("/dev/btrfs-control", O_RDWR); > + e = errno; > + if (fd < 0) { > + FILE *mfd = popen("lsmod | grep btrfs", "r"); > + char buf[16]; > + > + if (fread (buf, 1, sizeof (buf), mfd) > 0) > + fprintf(stderr, "ERROR: failed to open "\ > + "/dev/btrfs-control - %s\n", strerror(e)); > + else > + fprintf(stderr, "ERROR: btrfs kernel module "\ > + "is not loaded\n"); > + return 10; > + } > + > if(argc<=devstart){ > > int ret; > @@ -210,20 +225,30 @@ static int cmd_scan_dev(int argc, char **argv) > fprintf(stderr, "ERROR: error %d while scanning\n", ret); > return 18; > } > + printf("done\n"); > return 0; > } > > - fd = open("/dev/btrfs-control", O_RDWR); > - if (fd < 0) { > - perror("failed to open /dev/btrfs-control"); > - return 10; > - } > - > + printf("Scanning for Btrfs in\n"); > for( i = devstart ; i < argc ; i++ ){ > + int fdt; > struct btrfs_ioctl_vol_args args; > - int ret; > + printf(" %s ", argv[i]); > + fflush(stdout); > > - printf("Scanning for Btrfs filesystems in '%s'\n", argv[i]); > + /* > + * If for a multipath (mp) disk user provides the > + * non-mp path then open with flag O_EXCL will fail, > + * (also ioctl opens with O_EXCL), So test it before > + * calling ioctl. > + */ > + fdt = open(argv[i], O_RDONLY|O_EXCL); > + if (fdt < 0) { > + perror("ERROR"); > + ret = -1; > + continue; > + } > + close(fdt); > > strncpy_null(args.name, argv[i]); > /* > @@ -235,15 +260,15 @@ static int cmd_scan_dev(int argc, char **argv) > e = errno; > > if( ret < 0 ){ > - close(fd); > - fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n", > - argv[i], strerror(e)); > - return 11; > + fprintf(stderr, "ERROR: unable to scan - %s\n", > + strerror(e)); > + ret = -1; > } > + printf("found\n"); > } > > close(fd); > - return 0; > + return ret; > } > > static const char * const cmd_ready_dev_usage[] = { > diff --git a/utils.c b/utils.c > index a4f7b06..3a0d444 100644 > --- a/utils.c > +++ b/utils.c > @@ -1105,25 +1105,32 @@ again: > if (!S_ISBLK(st.st_mode)) { > continue; > } > - fd = open(fullpath, O_RDONLY); > + fd = open(fullpath, O_RDONLY|O_EXCL); > if (fd < 0) { > /* ignore the following errors: > ENXIO (device don't exists) > ENOMEDIUM (No medium found -> > like a cd tray empty) > + EBUSY (when mp disk is opened > + using non-mp path). > */ > - if(errno != ENXIO && errno != ENOMEDIUM) > + if(errno != ENXIO && errno != ENOMEDIUM && > + errno != EBUSY) > fprintf(stderr, "failed to read %s: %s\n", > fullpath, strerror(errno)); > continue; > } > + close(fd); > + > + fd = open(fullpath, O_RDONLY); > ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices, > &num_devices, > BTRFS_SUPER_INFO_OFFSET); > + close(fd); > + > if (ret == 0 && run_ioctl > 0) { > btrfs_register_one_device(fullpath); > } > - close(fd); > } > if (!list_empty(&pending_list)) { > free(pending); > @@ -1442,19 +1449,29 @@ scan_again: > continue; > } > > - fd = open(fullpath, O_RDONLY); > + /* This will fail for the multi path devices > + * when non multipath path is used. So we avoid > + * sending it to the kernel which eventually will > + * fail. > + */ > + fd = open(fullpath, O_RDONLY|O_EXCL); > if (fd < 0) { > - fprintf(stderr, "failed to open %s: %s\n", > - fullpath, strerror(errno)); > + if (errno != EBUSY) { > + fprintf(stderr, "failed to open %s: %s\n", > + fullpath, strerror(errno)); > + } > continue; > } > + close(fd); > + > + fd = open(fullpath, O_RDONLY); > ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices, > &num_devices, > BTRFS_SUPER_INFO_OFFSET); > + close(fd); > if (ret == 0 && run_ioctl > 0) { > btrfs_register_one_device(fullpath); > } > - close(fd); > } > > fclose(proc_partitions); >