@@ -185,9 +185,10 @@ static const char * const cmd_scan_dev_usage[] = {
static int cmd_scan_dev(int argc, char **argv)
{
- int i, fd, e;
+ int i, fd = -1, e, ret = 0;
int checklist = 1;
int devstart = 1;
+ u64 flag_reg = 0ull;
if( argc > 1 && !strcmp(argv[1],"--all-devices")){
if (check_argc_max(argc, 2))
@@ -197,11 +198,16 @@ static int cmd_scan_dev(int argc, char **argv)
devstart += 1;
}
+ if (is_btrfs_kernel_loaded())
+ flag_reg = BTRFS_SCAN_REGISTER;
+ else
+ fprintf(stderr, "btrfs kernel module is not loaded\n");
+
if(argc<=devstart){
int ret;
- printf("Scanning for Btrfs filesystems\n");
+ printf("Scanning for Btrfs filesystems ");
if(checklist)
ret = btrfs_scan_block_devices(BTRFS_SCAN_REGISTER);
else
@@ -210,20 +216,39 @@ 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;
+ if (!flag_reg)
+ return -1;
+
+ if ((fd = open("/dev/btrfs-control", O_RDWR)) < 0) {
+ fprintf(stderr, "ERROR: failed to open "\
+ "/dev/btrfs-control - %s\n", strerror(errno));
+ return -1;
}
+ 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,16 @@ 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;
+ } else {
+ printf("found\n");
}
}
close(fd);
- return 0;
+ return ret;
}
static const char * const cmd_ready_dev_usage[] = {
@@ -261,6 +287,10 @@ static int cmd_ready_dev(int argc, char **argv)
if (check_argc_min(argc, 2))
usage(cmd_ready_dev_usage);
+ if (!is_btrfs_kernel_loaded()) {
+ fprintf(stderr, "btrfs kernel module is not loaded\n");
+ return 10;
+ }
fd = open("/dev/btrfs-control", O_RDWR);
if (fd < 0) {
perror("failed to open /dev/btrfs-control");
@@ -1420,6 +1420,7 @@ int main(int ac, char **av)
u64 flags;
int dev_cnt=0;
int saved_optind;
+ int flag_reg=1;
while(1) {
int c;
@@ -1508,6 +1509,12 @@ int main(int ac, char **av)
printf("\nWARNING! - %s IS EXPERIMENTAL\n", BTRFS_BUILD_VERSION);
printf("WARNING! - see http://btrfs.wiki.kernel.org before using\n\n");
+ if (!is_btrfs_kernel_loaded()) {
+ printf("btrfs kernel module is not loaded, "
+ "would skip device registration\n");
+ flag_reg = 0;
+ }
+
file = av[optind++];
dev_cnt--;
@@ -1594,7 +1601,8 @@ int main(int ac, char **av)
if (dev_cnt == 0)
goto raid_groups;
- btrfs_register_one_device(file);
+ if (flag_reg)
+ btrfs_register_one_device(file);
zero_end = 1;
while(dev_cnt-- > 0) {
@@ -1629,7 +1637,8 @@ int main(int ac, char **av)
ret = btrfs_add_to_fsid(trans, root, fd, file, dev_block_count,
sectorsize, sectorsize, sectorsize);
BUG_ON(ret);
- btrfs_register_one_device(file);
+ if (flag_reg)
+ btrfs_register_one_device(file);
}
raid_groups:
@@ -1016,6 +1016,23 @@ struct pending_dir {
char name[PATH_MAX];
};
+/*
+ * return 1 for btrfs kernel module loaded
+ * return 0 for not
+ */
+int is_btrfs_kernel_loaded()
+{
+ FILE *mfd = popen("lsmod | grep btrfs", "r");
+ char buf[16];
+
+ if (fread (buf, 1, sizeof (buf), mfd) > 0) {
+ pclose(mfd);
+ return 1;
+ }
+ pclose(mfd);
+ return 0;
+}
+
void btrfs_register_one_device(char *fname)
{
struct btrfs_ioctl_vol_args args;
@@ -1023,6 +1040,11 @@ void btrfs_register_one_device(char *fname)
int ret;
int e;
+ if (!is_btrfs_kernel_loaded()) {
+ fprintf(stderr, "btrfs kernel module is not loaded, "
+ "skipping device registration\n");
+ return;
+ }
fd = open("/dev/btrfs-control", O_RDONLY);
if (fd < 0) {
fprintf(stderr, "failed to open /dev/btrfs-control "
@@ -64,6 +64,7 @@ int get_btrfs_mount(const char *path, char *mp, size_t mp_size);
int open_path_or_dev_mnt(const char *path);
int is_swap_device(const char *file);
u64 btrfs_device_size(int fd, struct stat *st);
+int is_btrfs_kernel_loaded();
/* Helper to always get proper size of the destination string */
#define strncpy_null(dest, src) __strncpy__null(dest, src, sizeof(dest))
when we have to report no such file error for /dev/btrfs-control we could confirm if btrfs kernel module is loaded and report it and skip registration where appropriate Further this patch pretty prints the dev scan results. Signed-off-by: Anand Jain <anand.jain@oracle.com> --- cmds-device.c | 56 +++++++++++++++++++++++++++++++++++++++++++------------- mkfs.c | 13 +++++++++++-- utils.c | 22 ++++++++++++++++++++++ utils.h | 1 + 4 files changed, 77 insertions(+), 15 deletions(-)