From: David Teigland Date: Tue, 9 Nov 2021 17:54:48 +0000 (-0600) Subject: filter-sysfs: support old kernels without sys/dev/block X-Git-Tag: v2_03_15~76 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=d608837b2a88d0ed0c7ef7d8e6135e2d37687ff1;p=lvm2.git filter-sysfs: support old kernels without sys/dev/block rhel5 for example doesn't have /sys/dev/block --- diff --git a/lib/filters/filter-sysfs.c b/lib/filters/filter-sysfs.c index 672211057..d8de7940b 100644 --- a/lib/filters/filter-sysfs.c +++ b/lib/filters/filter-sysfs.c @@ -15,6 +15,8 @@ #include "lib/misc/lib.h" #include "lib/filters/filter.h" +static int _sys_dev_block_found; + #ifdef __linux__ static int _accept_p(struct cmd_context *cmd, struct dev_filter *f, struct device *dev, const char *use_filter_name) @@ -23,6 +25,9 @@ static int _accept_p(struct cmd_context *cmd, struct dev_filter *f, struct devic const char *sysfs_dir; struct stat info; + if (!_sys_dev_block_found) + return 1; + dev->filtered_flags &= ~DEV_FILTERED_SYSFS; /* @@ -57,6 +62,26 @@ static void _destroy(struct dev_filter *f) free(f); } +static void _check_sys_dev_block(void) +{ + char path[PATH_MAX]; + const char *sysfs_dir; + struct stat info; + + sysfs_dir = dm_sysfs_dir(); + if (sysfs_dir && *sysfs_dir) { + if (dm_snprintf(path, sizeof(path), "%sdev/block", sysfs_dir) < 0) + return; + + if (lstat(path, &info)) { + log_debug("filter-sysfs disabled: /sys/dev/block not found"); + _sys_dev_block_found = 0; + } else { + _sys_dev_block_found = 1; + } + } +} + struct dev_filter *sysfs_filter_create(void) { const char *sysfs_dir = dm_sysfs_dir(); @@ -67,6 +92,9 @@ struct dev_filter *sysfs_filter_create(void) return NULL; } + /* support old kernels that don't have this */ + _check_sys_dev_block(); + if (!(f = zalloc(sizeof(*f)))) goto_bad;