All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.