* [PATCH 4/7][retry remove] Add new "dm_device_has_holders" fn to libdm
@ 2011-09-20 12:57 Peter Rajnoha
2011-09-20 13:10 ` Zdenek Kabelac
0 siblings, 1 reply; 3+ messages in thread
From: Peter Rajnoha @ 2011-09-20 12:57 UTC (permalink / raw)
To: lvm-devel
This is a helper function used both in libdevmapper and in LVM
to test whether there are any devices that make use of certain
device given as parameter (this will partially replace "open_count"
check, see the following patch...).
Peter
---
libdm/libdevmapper.h | 6 ++++++
libdm/libdm-common.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index ae39262..9df34bb 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -267,6 +267,12 @@ const char *dm_sysfs_dir(void);
int dm_is_dm_major(uint32_t major);
/*
+ * Determine whether a device has holders.
+ * (this requires sysfs directory to be configured via dm_set_sysfs_dir)
+ */
+int dm_device_has_holders(uint32_t major, uint32_t minor);
+
+/*
* Release library resources
*/
void dm_lib_release(void);
diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
index 7517fb1..7ea78af 100644
--- a/libdm/libdm-common.c
+++ b/libdm/libdm-common.c
@@ -1051,6 +1051,42 @@ const char *dm_sysfs_dir(void)
return _sysfs_dir;
}
+static int _is_empty_dir(const char *dir)
+{
+ struct dirent *dirent;
+ DIR *d;
+
+ if (!(d = opendir(dir))) {
+ log_sys_error("opendir", dir);
+ return 0;
+ }
+
+ while ((dirent = readdir(d)))
+ if (strcmp(dirent->d_name, ".") && strcmp(dirent->d_name, ".."))
+ break;
+
+ if (closedir(d))
+ log_sys_error("closedir", dir);
+
+ return dirent ? 0 : 1;
+}
+
+int dm_device_has_holders(uint32_t major, uint32_t minor)
+{
+ char sysfs_path[PATH_MAX];
+
+ if (!*_sysfs_dir)
+ return 0;
+
+ if (dm_snprintf(sysfs_path, PATH_MAX, "%sdev/block/%" PRIu32
+ ":%" PRIu32 "/holders", _sysfs_dir, major, minor) < 0) {
+ log_error("sysfs_path dm_snprintf failed");
+ return 0;
+ }
+
+ return !_is_empty_dir(sysfs_path);
+}
+
int dm_mknodes(const char *name)
{
struct dm_task *dmt;
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH 4/7][retry remove] Add new "dm_device_has_holders" fn to libdm
2011-09-20 12:57 [PATCH 4/7][retry remove] Add new "dm_device_has_holders" fn to libdm Peter Rajnoha
@ 2011-09-20 13:10 ` Zdenek Kabelac
2011-09-21 11:23 ` Peter Rajnoha
0 siblings, 1 reply; 3+ messages in thread
From: Zdenek Kabelac @ 2011-09-20 13:10 UTC (permalink / raw)
To: lvm-devel
Dne 20.9.2011 14:57, Peter Rajnoha napsal(a):
> This is a helper function used both in libdevmapper and in LVM
> to test whether there are any devices that make use of certain
> device given as parameter (this will partially replace "open_count"
> check, see the following patch...).
>
> Peter
> ---
> libdm/libdevmapper.h | 6 ++++++
> libdm/libdm-common.c | 36 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 42 insertions(+), 0 deletions(-)
>
> diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
> index ae39262..9df34bb 100644
> --- a/libdm/libdevmapper.h
> +++ b/libdm/libdevmapper.h
> @@ -267,6 +267,12 @@ const char *dm_sysfs_dir(void);
> int dm_is_dm_major(uint32_t major);
>
> /*
> + * Determine whether a device has holders.
> + * (this requires sysfs directory to be configured via dm_set_sysfs_dir)
> + */
> +int dm_device_has_holders(uint32_t major, uint32_t minor);
> +
> +/*
> * Release library resources
> */
> void dm_lib_release(void);
> diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
> index 7517fb1..7ea78af 100644
> --- a/libdm/libdm-common.c
> +++ b/libdm/libdm-common.c
> @@ -1051,6 +1051,42 @@ const char *dm_sysfs_dir(void)
> return _sysfs_dir;
> }
>
> +static int _is_empty_dir(const char *dir)
> +{
> + struct dirent *dirent;
> + DIR *d;
> +
> + if (!(d = opendir(dir))) {
> + log_sys_error("opendir", dir);
> + return 0;
> + }
> +
> + while ((dirent = readdir(d)))
> + if (strcmp(dirent->d_name, ".") && strcmp(dirent->d_name, ".."))
> + break;
Hmm since readdir() may return -1 - this looks like error check is missing
here. And since it's copy from lvm-file.c - maybe generic dm_is_empty_dir
with all log_error code inside might be useful.
Zdenek
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH 4/7][retry remove] Add new "dm_device_has_holders" fn to libdm
2011-09-20 13:10 ` Zdenek Kabelac
@ 2011-09-21 11:23 ` Peter Rajnoha
0 siblings, 0 replies; 3+ messages in thread
From: Peter Rajnoha @ 2011-09-21 11:23 UTC (permalink / raw)
To: lvm-devel
On 09/20/2011 03:10 PM +0100, Zdenek Kabelac wrote:
> Dne 20.9.2011 14:57, Peter Rajnoha napsal(a):
>> + if (!(d = opendir(dir))) {
>> + log_sys_error("opendir", dir);
>> + return 0;
>> + }
>> +
>> + while ((dirent = readdir(d)))
>> + if (strcmp(dirent->d_name, ".") && strcmp(dirent->d_name, ".."))
>> + break;
>
> Hmm since readdir() may return -1 - this looks like error check is missing here
Well, this is a version of readdir that returns either NULL or a pointer to a dirent
structure - man 2 readdir vs. man 3 readdir (difference in POSIX compliance).
The POSIX version returns an error only if the DIR* stream descriptor is wrong, but
this one should be fine since we already check the error in opendir just before this
call. I think it's OK to do it this way.
Peter
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-09-21 11:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-20 12:57 [PATCH 4/7][retry remove] Add new "dm_device_has_holders" fn to libdm Peter Rajnoha
2011-09-20 13:10 ` Zdenek Kabelac
2011-09-21 11:23 ` Peter Rajnoha
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.