Discussion:
[PATCH 2/5] btrfs-progs: don't fall back to recursive /dev scan
(too old to reply)
Anand Jain
2014-09-13 01:21:19 UTC
Permalink
Raw Message
From: Eric Sandeen <***@redhat.com>

If we didn't find what we are looking for in /proc/partitions,
we're not going to find it by scanning every node under /dev, either.

But that's just what btrfs_scan_for_fsid() does.

Remove that fallback; at that point btrfs_scan_for_fsid() just calls
scan_for_btrfs(), so remove the wrapper & call it directly.

Side note: so, these paths always use /proc/partitions, not libblkid.
Userspace-intiated scans default to libblkid. I presume this is
part of the design, and intentional? Anyway, not changing it now!

Signed-off-by: Eric Sandeen <***@redhat.com>
Reviewed-by: Anand Jain <***@oracle.com>
---
disk-io.c | 2 +-
utils.c | 12 +-----------
2 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/disk-io.c b/disk-io.c
index f71f5ca..2a1f6d4 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1007,7 +1007,7 @@ int btrfs_scan_fs_devices(int fd, const char *path,
}

if (total_devs != 1) {
- ret = btrfs_scan_for_fsid(run_ioctl);
+ ret = scan_for_btrfs(BTRFS_SCAN_PROC, run_ioctl);
if (ret)
return ret;
}
diff --git a/utils.c b/utils.c
index 0064587..cf7635c 100644
--- a/utils.c
+++ b/utils.c
@@ -1148,7 +1148,7 @@ int check_mounted_where(int fd, const char *file, char *where, int size,

/* scan other devices */
if (is_btrfs && total_devs > 1) {
- if ((ret = btrfs_scan_for_fsid(!BTRFS_UPDATE_KERNEL)))
+ if ((ret = scan_for_btrfs(BTRFS_SCAN_PROC, !BTRFS_UPDATE_KERNEL)))
return ret;
}

@@ -1336,16 +1336,6 @@ fail:
return ret;
}

-int btrfs_scan_for_fsid(int run_ioctls)
-{
- int ret;
-
- ret = scan_for_btrfs(BTRFS_SCAN_PROC, run_ioctls);
- if (ret)
- ret = scan_for_btrfs(BTRFS_SCAN_DEV, run_ioctls);
- return ret;
-}
-
int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
int super_offset)
{
--
2.0.0.153.g79dcccc

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-09-13 01:21:20 UTC
Permalink
Raw Message
From: Eric Sandeen <***@redhat.com>

After the previous 2 patches, nothing uses
whole-dev-tree scanning, so remove the code which
implemented that functionality.

Signed-off-by: Eric Sandeen <***@redhat.com>
Reviewed-by: Anand Jain <***@oracle.com>
---
utils.c | 114 ----------------------------------------------------------------
utils.h | 6 ++--
2 files changed, 2 insertions(+), 118 deletions(-)

diff --git a/utils.c b/utils.c
index cf7635c..901127f 100644
--- a/utils.c
+++ b/utils.c
@@ -1225,117 +1225,6 @@ void btrfs_register_one_device(char *fname)
close(fd);
}

-int btrfs_scan_one_dir(char *dirname, int run_ioctl)
-{
- DIR *dirp = NULL;
- struct dirent *dirent;
- struct pending_dir *pending;
- struct stat st;
- int ret;
- int fd;
- int dirname_len;
- char *fullpath;
- struct list_head pending_list;
- struct btrfs_fs_devices *tmp_devices;
- u64 num_devices;
-
- INIT_LIST_HEAD(&pending_list);
-
- pending = malloc(sizeof(*pending));
- if (!pending)
- return -ENOMEM;
- strcpy(pending->name, dirname);
-
-again:
- dirname_len = strlen(pending->name);
- fullpath = malloc(PATH_MAX);
- dirname = pending->name;
-
- if (!fullpath) {
- ret = -ENOMEM;
- goto fail;
- }
- dirp = opendir(dirname);
- if (!dirp) {
- fprintf(stderr, "Unable to open %s for scanning\n", dirname);
- ret = -errno;
- goto fail;
- }
- while(1) {
- dirent = readdir(dirp);
- if (!dirent)
- break;
- if (dirent->d_name[0] == '.')
- continue;
- if (dirname_len + strlen(dirent->d_name) + 2 > PATH_MAX) {
- ret = -EFAULT;
- goto fail;
- }
- snprintf(fullpath, PATH_MAX, "%s/%s", dirname, dirent->d_name);
- ret = lstat(fullpath, &st);
- if (ret < 0) {
- fprintf(stderr, "failed to stat %s\n", fullpath);
- continue;
- }
- if (S_ISLNK(st.st_mode))
- continue;
- if (S_ISDIR(st.st_mode)) {
- struct pending_dir *next = malloc(sizeof(*next));
- if (!next) {
- ret = -ENOMEM;
- goto fail;
- }
- strcpy(next->name, fullpath);
- list_add_tail(&next->list, &pending_list);
- }
- if (!S_ISBLK(st.st_mode)) {
- continue;
- }
- fd = open(fullpath, O_RDONLY);
- if (fd < 0) {
- /* ignore the following errors:
- ENXIO (device don't exists)
- ENOMEDIUM (No medium found ->
- like a cd tray empty)
- */
- if(errno != ENXIO && errno != ENOMEDIUM)
- fprintf(stderr, "failed to read %s: %s\n",
- fullpath, strerror(errno));
- continue;
- }
- ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices,
- &num_devices,
- BTRFS_SUPER_INFO_OFFSET, 0);
- if (ret == 0 && run_ioctl > 0) {
- btrfs_register_one_device(fullpath);
- }
- close(fd);
- }
- if (!list_empty(&pending_list)) {
- free(pending);
- pending = list_entry(pending_list.next, struct pending_dir,
- list);
- free(fullpath);
- list_del(&pending->list);
- closedir(dirp);
- dirp = NULL;
- goto again;
- }
- ret = 0;
-fail:
- free(pending);
- free(fullpath);
- while (!list_empty(&pending_list)) {
- pending = list_entry(pending_list.next, struct pending_dir,
- list);
- list_del(&pending->list);
- free(pending);
- }
- if (dirp)
- closedir(dirp);
- return ret;
-}
-
int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
int super_offset)
{
@@ -2247,9 +2136,6 @@ int scan_for_btrfs(int where, int update_kernel)
case BTRFS_SCAN_PROC:
ret = btrfs_scan_block_devices(update_kernel);
break;
- case BTRFS_SCAN_DEV:
- ret = btrfs_scan_one_dir("/dev", update_kernel);
- break;
case BTRFS_SCAN_LBLKID:
ret = btrfs_scan_lblkid(update_kernel);
break;
diff --git a/utils.h b/utils.h
index 26c767b..52a9dfc 100644
--- a/utils.h
+++ b/utils.h
@@ -27,9 +27,8 @@
#define BTRFS_MKFS_SMALL_VOLUME_SIZE (1024 * 1024 * 1024)

#define BTRFS_SCAN_PROC (1ULL << 0)
-#define BTRFS_SCAN_DEV (1ULL << 1)
-#define BTRFS_SCAN_MOUNTED (1ULL << 2)
-#define BTRFS_SCAN_LBLKID (1ULL << 3)
+#define BTRFS_SCAN_MOUNTED (1ULL << 1)
+#define BTRFS_SCAN_LBLKID (1ULL << 2)

#define BTRFS_UPDATE_KERNEL 1

@@ -62,7 +61,6 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
u32 sectorsize);
int btrfs_scan_for_fsid(int run_ioctls);
void btrfs_register_one_device(char *fname);
-int btrfs_scan_one_dir(char *dirname, int run_ioctl);
char *canonicalize_dm_name(const char *ptname);
char *canonicalize_path(const char *path);
int check_mounted(const char *devicename);
--
2.0.0.153.g79dcccc

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-09-13 01:21:21 UTC
Permalink
Raw Message
The libblkid scan method which was introduced later, will also
scan devices under /proc/partitions. So we don't have to do
the explicit scan of the same.

Remove the scan method BTRFS_SCAN_PROC.

Signed-off-by: Anand Jain <***@oracle.com>
---
cmds-device.c | 5 ++---
cmds-filesystem.c | 10 +++++-----
disk-io.c | 2 +-
utils.c | 5 +----
utils.h | 5 ++---
5 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/cmds-device.c b/cmds-device.c
index ad0bd35..86787a4 100644
--- a/cmds-device.c
+++ b/cmds-device.c
@@ -199,13 +199,13 @@ static int cmd_rm_dev(int argc, char **argv)
static const char * const cmd_scan_dev_usage[] = {
"btrfs device scan [(-d|--all-devices)|<device> [<device>...]]",
"Scan devices for a btrfs filesystem",
+ " -d|--all-devices (deprecated)",
NULL
};

static int cmd_scan_dev(int argc, char **argv)
{
int i, fd, e;
- int where = BTRFS_SCAN_LBLKID;
int devstart = 1;
int all = 0;
int ret = 0;
@@ -223,7 +223,6 @@ static int cmd_scan_dev(int argc, char **argv)
break;
switch (c) {
case 'd':
- where = BTRFS_SCAN_PROC;
all = 1;
break;
default:
@@ -236,7 +235,7 @@ static int cmd_scan_dev(int argc, char **argv)

if (all || argc == 1) {
printf("Scanning for Btrfs filesystems\n");
- ret = scan_for_btrfs(where, BTRFS_UPDATE_KERNEL);
+ ret = btrfs_scan_lblkid(BTRFS_UPDATE_KERNEL);
if (ret)
fprintf(stderr, "ERROR: error %d while scanning\n", ret);
goto out;
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index 818e05f..ebaccca 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -542,7 +542,7 @@ static int cmd_show(int argc, char **argv)
struct list_head *cur_uuid;
char *search = NULL;
int ret;
- int where = BTRFS_SCAN_LBLKID;
+ int where = -1; // default, search both kernel and udev
int type = 0;
char mp[BTRFS_PATH_NAME_MAX + 1];
char path[PATH_MAX];
@@ -563,7 +563,7 @@ static int cmd_show(int argc, char **argv)
break;
switch (c) {
case 'd':
- where = BTRFS_SCAN_PROC;
+ where = BTRFS_SCAN_LBLKID;
break;
case 'm':
where = BTRFS_SCAN_MOUNTED;
@@ -587,7 +587,7 @@ static int cmd_show(int argc, char **argv)
* right away
*/
if (type == BTRFS_ARG_BLKDEV) {
- if (where == BTRFS_SCAN_PROC) {
+ if (where == BTRFS_SCAN_LBLKID) {
/* we need to do this because
* legacy BTRFS_SCAN_DEV
* provides /dev/dm-x paths
@@ -618,7 +618,7 @@ static int cmd_show(int argc, char **argv)
}
}

- if (where == BTRFS_SCAN_PROC)
+ if (where == BTRFS_SCAN_LBLKID)
goto devs_only;

/* show mounted btrfs */
@@ -633,7 +633,7 @@ static int cmd_show(int argc, char **argv)
goto out;

devs_only:
- ret = scan_for_btrfs(where, !BTRFS_UPDATE_KERNEL);
+ ret = btrfs_scan_lblkid(!BTRFS_UPDATE_KERNEL);

if (ret) {
fprintf(stderr, "ERROR: %d while scanning\n", ret);
diff --git a/disk-io.c b/disk-io.c
index 2a1f6d4..bb011d0 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1007,7 +1007,7 @@ int btrfs_scan_fs_devices(int fd, const char *path,
}

if (total_devs != 1) {
- ret = scan_for_btrfs(BTRFS_SCAN_PROC, run_ioctl);
+ ret = btrfs_scan_lblkid(run_ioctl);
if (ret)
return ret;
}
diff --git a/utils.c b/utils.c
index 901127f..7c1e48b 100644
--- a/utils.c
+++ b/utils.c
@@ -1148,7 +1148,7 @@ int check_mounted_where(int fd, const char *file, char *where, int size,

/* scan other devices */
if (is_btrfs && total_devs > 1) {
- if ((ret = scan_for_btrfs(BTRFS_SCAN_PROC, !BTRFS_UPDATE_KERNEL)))
+ if ((ret = btrfs_scan_lblkid(!BTRFS_UPDATE_KERNEL)))
return ret;
}

@@ -2133,9 +2133,6 @@ int scan_for_btrfs(int where, int update_kernel)
int ret = 0;

switch (where) {
- case BTRFS_SCAN_PROC:
- ret = btrfs_scan_block_devices(update_kernel);
- break;
case BTRFS_SCAN_LBLKID:
ret = btrfs_scan_lblkid(update_kernel);
break;
diff --git a/utils.h b/utils.h
index 52a9dfc..ea0d5d4 100644
--- a/utils.h
+++ b/utils.h
@@ -26,9 +26,8 @@
#define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024)
#define BTRFS_MKFS_SMALL_VOLUME_SIZE (1024 * 1024 * 1024)

-#define BTRFS_SCAN_PROC (1ULL << 0)
-#define BTRFS_SCAN_MOUNTED (1ULL << 1)
-#define BTRFS_SCAN_LBLKID (1ULL << 2)
+#define BTRFS_SCAN_MOUNTED (1ULL << 0)
+#define BTRFS_SCAN_LBLKID (1ULL << 1)

#define BTRFS_UPDATE_KERNEL 1
--
2.0.0.153.g79dcccc

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-10-07 00:08:31 UTC
Permalink
Raw Message
After Patch:
remove BTRFS_SCAN_PROC scan method
There isn't any consumer for btrfs_scan_block_devices() so delete it.

Signed-off-by: Anand Jain <***@oracle.com>
---
utils.c | 83 -----------------------------------------------------------------
utils.h | 1 -
2 files changed, 84 deletions(-)

diff --git a/utils.c b/utils.c
index 48d2d9a..b23f332 100644
--- a/utils.c
+++ b/utils.c
@@ -1542,89 +1542,6 @@ int set_label(const char *btrfs_dev, const char *label)
return ret;
}

-int btrfs_scan_block_devices(int run_ioctl)
-{
-
- struct stat st;
- int ret;
- int fd;
- struct btrfs_fs_devices *tmp_devices;
- u64 num_devices;
- FILE *proc_partitions;
- int i;
- char buf[1024];
- char fullpath[110];
- int scans = 0;
- int special;
-
-scan_again:
- proc_partitions = fopen("/proc/partitions","r");
- if (!proc_partitions) {
- fprintf(stderr, "Unable to open '/proc/partitions' for scanning\n");
- return -ENOENT;
- }
- /* skip the header */
- for (i = 0; i < 2; i++)
- if (!fgets(buf, 1023, proc_partitions)) {
- fprintf(stderr,
- "Unable to read '/proc/partitions' for scanning\n");
- fclose(proc_partitions);
- return -ENOENT;
- }
-
- strcpy(fullpath,"/dev/");
- while(fgets(buf, 1023, proc_partitions)) {
- i = sscanf(buf," %*d %*d %*d %99s", fullpath+5);
-
- /*
- * multipath and MD devices may register as a btrfs filesystem
- * both through the original block device and through
- * the special (/dev/mapper or /dev/mdX) entry.
- * This scans the special entries last
- */
- special = strncmp(fullpath, "/dev/dm-", strlen("/dev/dm-")) == 0;
- if (!special)
- special = strncmp(fullpath, "/dev/md", strlen("/dev/md")) == 0;
-
- if (scans == 0 && special)
- continue;
- if (scans > 0 && !special)
- continue;
-
- ret = lstat(fullpath, &st);
- if (ret < 0) {
- fprintf(stderr, "failed to stat %s\n", fullpath);
- continue;
- }
- if (!S_ISBLK(st.st_mode)) {
- continue;
- }
-
- fd = open(fullpath, O_RDONLY);
- if (fd < 0) {
- if (errno != ENOMEDIUM)
- fprintf(stderr, "failed to open %s: %s\n",
- fullpath, strerror(errno));
- continue;
- }
- ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices,
- &num_devices,
- BTRFS_SUPER_INFO_OFFSET, 0);
- if (ret == 0 && run_ioctl > 0) {
- btrfs_register_one_device(fullpath);
- }
- close(fd);
- }
-
- fclose(proc_partitions);
-
- if (scans == 0) {
- scans++;
- goto scan_again;
- }
- return 0;
-}
-
/*
* A not-so-good version fls64. No fascinating optimization since
* no one except parse_size use it
diff --git a/utils.h b/utils.h
index 1536469..e332fd1 100644
--- a/utils.h
+++ b/utils.h
@@ -100,7 +100,6 @@ int pretty_size_snprintf(u64 size, char *str, size_t str_bytes, unsigned unit_mo
})

int get_mountpt(char *dev, char *mntpt, size_t size);
-int btrfs_scan_block_devices(int run_ioctl);
u64 parse_size(char *s);
u64 arg_strtou64(const char *str);
int open_file_or_dir(const char *fname, DIR **dirstream);
--
2.0.0.153.g79dcccc

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-10-22 11:10:13 UTC
Permalink
Raw Message
This is just a clean up patch which looks like you have missed
it in 3.17. sorry if it confused you.
Post by Anand Jain
remove BTRFS_SCAN_PROC scan method
There isn't any consumer for btrfs_scan_block_devices() so delete it.
---
utils.c | 83 -----------------------------------------------------------------
utils.h | 1 -
2 files changed, 84 deletions(-)
diff --git a/utils.c b/utils.c
index 48d2d9a..b23f332 100644
--- a/utils.c
+++ b/utils.c
@@ -1542,89 +1542,6 @@ int set_label(const char *btrfs_dev, const char *label)
return ret;
}
-int btrfs_scan_block_devices(int run_ioctl)
-{
-
- struct stat st;
- int ret;
- int fd;
- struct btrfs_fs_devices *tmp_devices;
- u64 num_devices;
- FILE *proc_partitions;
- int i;
- char buf[1024];
- char fullpath[110];
- int scans = 0;
- int special;
-
- proc_partitions = fopen("/proc/partitions","r");
- if (!proc_partitions) {
- fprintf(stderr, "Unable to open '/proc/partitions' for scanning\n");
- return -ENOENT;
- }
- /* skip the header */
- for (i = 0; i < 2; i++)
- if (!fgets(buf, 1023, proc_partitions)) {
- fprintf(stderr,
- "Unable to read '/proc/partitions' for scanning\n");
- fclose(proc_partitions);
- return -ENOENT;
- }
-
- strcpy(fullpath,"/dev/");
- while(fgets(buf, 1023, proc_partitions)) {
- i = sscanf(buf," %*d %*d %*d %99s", fullpath+5);
-
- /*
- * multipath and MD devices may register as a btrfs filesystem
- * both through the original block device and through
- * the special (/dev/mapper or /dev/mdX) entry.
- * This scans the special entries last
- */
- special = strncmp(fullpath, "/dev/dm-", strlen("/dev/dm-")) == 0;
- if (!special)
- special = strncmp(fullpath, "/dev/md", strlen("/dev/md")) == 0;
-
- if (scans == 0 && special)
- continue;
- if (scans > 0 && !special)
- continue;
-
- ret = lstat(fullpath, &st);
- if (ret < 0) {
- fprintf(stderr, "failed to stat %s\n", fullpath);
- continue;
- }
- if (!S_ISBLK(st.st_mode)) {
- continue;
- }
-
- fd = open(fullpath, O_RDONLY);
- if (fd < 0) {
- if (errno != ENOMEDIUM)
- fprintf(stderr, "failed to open %s: %s\n",
- fullpath, strerror(errno));
- continue;
- }
- ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices,
- &num_devices,
- BTRFS_SUPER_INFO_OFFSET, 0);
- if (ret == 0 && run_ioctl > 0) {
- btrfs_register_one_device(fullpath);
- }
- close(fd);
- }
-
- fclose(proc_partitions);
-
- if (scans == 0) {
- scans++;
- goto scan_again;
- }
- return 0;
-}
-
/*
* A not-so-good version fls64. No fascinating optimization since
* no one except parse_size use it
diff --git a/utils.h b/utils.h
index 1536469..e332fd1 100644
--- a/utils.h
+++ b/utils.h
@@ -100,7 +100,6 @@ int pretty_size_snprintf(u64 size, char *str, size_t str_bytes, unsigned unit_mo
})
int get_mountpt(char *dev, char *mntpt, size_t size);
-int btrfs_scan_block_devices(int run_ioctl);
u64 parse_size(char *s);
u64 arg_strtou64(const char *str);
int open_file_or_dir(const char *fname, DIR **dirstream);
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-09-13 01:21:22 UTC
Permalink
Raw Message
With the changes as in the previous patch, now scan_for_btrfs()
is an unused function. So delete it.

Signed-off-by: Anand Jain <***@oracle.com>
---
utils.c | 15 ---------------
utils.h | 1 -
2 files changed, 16 deletions(-)

diff --git a/utils.c b/utils.c
index 7c1e48b..38d867d 100644
--- a/utils.c
+++ b/utils.c
@@ -2125,21 +2125,6 @@ int btrfs_scan_lblkid(int update_kernel)
return 0;
}

-/*
- * scans devs for the btrfs
-*/
-int scan_for_btrfs(int where, int update_kernel)
-{
- int ret = 0;
-
- switch (where) {
- case BTRFS_SCAN_LBLKID:
- ret = btrfs_scan_lblkid(update_kernel);
- break;
- }
- return ret;
-}
-
int is_vol_small(char *file)
{
int fd = -1;
diff --git a/utils.h b/utils.h
index ea0d5d4..b639bb6 100644
--- a/utils.h
+++ b/utils.h
@@ -100,7 +100,6 @@ u64 btrfs_device_size(int fd, struct stat *st);
/* Helper to always get proper size of the destination string */
#define strncpy_null(dest, src) __strncpy__null(dest, src, sizeof(dest))
int test_dev_for_mkfs(char *file, int force_overwrite, char *estr);
-int scan_for_btrfs(int where, int update_kernel);
int get_label_mounted(const char *mount_path, char *labelp);
int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
u64 dev_cnt, int mixed, char *estr);
--
2.0.0.153.g79dcccc

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
David Sterba
2014-09-23 17:00:02 UTC
Permalink
Raw Message
Hi,

all 5 patches will be in the next integration. I haven't tested them
yet, seems it's a bit more important to make a more stable devel base
for more updates you might want to send.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-10-06 09:31:39 UTC
Permalink
Raw Message
I am running some tests with larger disks pool (48 disks).
With that the performance of the various scan methods are as below..

----
scanning BTRFS_SCAN_LBLKID
real 0m0.330s
user 0m0.005s
sys 0m0.026s

scanning BTRFS_SCAN_DEV
real 0m0.010s
user 0m0.002s
sys 0m0.005s

scanning BTRFS_SCAN_PROC
real 0m0.010s
user 0m0.002s
sys 0m0.005s
-----

This is the time taken to scan 48disks one time by various methods
we have/had - but our progs do this scan 30times for btrfs fi show.
yep 30times as show below.. I am working to fix it.

-------
Function: time(us) count avg(us)
::
get_device_info: 1034 27 38
pretty_size_snprintf: 1218 124 9
btrfs_scan_one_device: 1790 186 9
btrfs_read_dev_super: 1956 116 16
cmd_show: 15418 335 46
btrfs_scan_lblkid: 148477 30 4949
-------

IMO we should still stick to LBLKID scan.
Just a thought - any idea if its better to provide a compile time
fallback scan switch, just in case if something fails with lblkid. ?


Thanks, Anand
Post by David Sterba
Hi,
all 5 patches will be in the next integration. I haven't tested them
yet, seems it's a bit more important to make a more stable devel base
for more updates you might want to send.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2014-10-23 13:12:48 UTC
Permalink
Raw Message
my stap func profiling script was wrong, I got the number of
times scan_lblkid func called per thread wrong, now its
been corrected as below. yet calling the system-wide device
scan more than once per thread does not make any sense. There
are quite a number of threads like that as below. The worst is
mkfs.btrfs which calls n number of times, where n is number of
disk being mkfs-ed.


btrfs-find-root 1
btrfs rescue super-recover 2
btrfs-debug-tree 1
btrfs-image -r 2
btrfs check 2
btrfs restore 2
calc-size NC
btrfs-corrupt-block NC
btrfs-image NC
btrfs-map-logical 1
btrfs-select-super NC
btrfstune 2
btrfs-zero-log NC
tester NC
quick-test.c NC
btrfs-convert 0
mkfs #number of devices to be mkfs
btrfs label set unmounted 2
btrfs get label unmounted 2
Post by Anand Jain
I am running some tests with larger disks pool (48 disks).
With that the performance of the various scan methods are as below..
----
scanning BTRFS_SCAN_LBLKID
real 0m0.330s
user 0m0.005s
sys 0m0.026s
scanning BTRFS_SCAN_DEV
real 0m0.010s
user 0m0.002s
sys 0m0.005s
scanning BTRFS_SCAN_PROC
real 0m0.010s
user 0m0.002s
sys 0m0.005s
-----
This is the time taken to scan 48disks one time by various methods
we have/had - but our progs do this scan 30times for btrfs fi show.
yep 30times as show below.. I am working to fix it.
-------
Function: time(us) count avg(us)
get_device_info: 1034 27 38
pretty_size_snprintf: 1218 124 9
btrfs_scan_one_device: 1790 186 9
btrfs_read_dev_super: 1956 116 16
cmd_show: 15418 335 46
btrfs_scan_lblkid: 148477 30 4949
-------
IMO we should still stick to LBLKID scan.
Just a thought - any idea if its better to provide a compile time
fallback scan switch, just in case if something fails with lblkid. ?
Thanks, Anand
Post by David Sterba
Hi,
all 5 patches will be in the next integration. I haven't tested them
yet, seems it's a bit more important to make a more stable devel base
for more updates you might want to send.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Loading...