Re: [PATCH 28/44] libmultipath: implement dm_is_mpath() with new API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2024-07-10 at 20:21 -0400, Benjamin Marzinski wrote:
> On Tue, Jul 09, 2024 at 11:39:19PM +0200, Martin Wilck wrote:
> > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx>
> > ---
> >  libmultipath/devmapper.c | 53 ++++++------------------------------
> > ----
> >  1 file changed, 8 insertions(+), 45 deletions(-)
> > 
> > diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
> > index 859a861..6276041 100644
> > --- a/libmultipath/devmapper.c
> > +++ b/libmultipath/devmapper.c
> > @@ -965,52 +965,15 @@ static int dm_type_match(const char *name,
> > char *type)
> >  
> >  int dm_is_mpath(const char *name)
> >  {
> > -	int r = DM_IS_MPATH_ERR;
> > -	struct dm_task __attribute__((cleanup(cleanup_dm_task)))
> > *dmt = NULL;
> > -	struct dm_info info;
> > -	uint64_t start, length;
> > -	char *target_type = NULL;
> > -	char *params;
> > -	const char *uuid;
> > +	char uuid[DM_UUID_LEN];
> > +	int rc = libmp_mapinfo(DM_MAP_BY_NAME,
> > +			       (mapid_t) { .str = name },
> > +			       (mapinfo_t) { .uuid = uuid,
> > .tgt_type = TGT_MPATH });
> >  
> > -	if (!(dmt = libmp_dm_task_create(DM_DEVICE_TABLE)))
> > -		goto out;
> > -
> > -	if (!dm_task_set_name(dmt, name))
> > -		goto out;
> > -
> > -	if (!libmp_dm_task_run(dmt)) {
> > -		dm_log_error(3, DM_DEVICE_TABLE, dmt);
> > -		goto out;
> > -	}
> > -
> > -	if (!dm_task_get_info(dmt, &info))
> > -		goto out;
> > -
> > -	r = DM_IS_MPATH_NO;
> > -
> > -	if (!info.exists)
> > -		goto out;
> > -
> > -	uuid = dm_task_get_uuid(dmt);
> > -
> > -	if (!uuid || strncmp(uuid, UUID_PREFIX, UUID_PREFIX_LEN)
> > != 0)
> > -		goto out;
> > -
> > -	/* Fetch 1st target */
> > -	if (dm_get_next_target(dmt, NULL, &start, &length,
> > &target_type,
> > -			       &params) != NULL)
> > -		/* multiple targets */
> > -		goto out;
> > -
> > -	if (!target_type || strcmp(target_type, TGT_MPATH) != 0)
> > -		goto out;
> > -
> > -	r = DM_IS_MPATH_YES;
> > -out:
> > -	if (r < 0)
> > -		condlog(3, "%s: dm command failed in %s: %s",
> > name, __func__, strerror(errno));
> > -	return r;
> 
> Since dm_get_events() and watch_dmevents() need to differentiate
> between
> DM_IS_MPATH_NO and DM_IS_MPATH_ERR, this function needs to return
> DM_IS_MPATH_ERR if libmp_mapinfo() returns DM_ERR.
> 
> Looking over this function, I did notice one thing.  It returns
> DM_IS_MPATH_ERR if dm_task_get_info() fails, while libmp_mapinfo__()
> returns DMP_NOT_FOUND if dm_task_get_info() fails.
>  Looking at the
> current lvm code, I can't see a way for dm_task_get_info() to fail
> if we just called libmp_dm_task_run() and it succeeded. On the other
> hand dm_task_get_info() failing does seem to be an error, not a
> a sign that the device doesn't exist, so perhaps ibmp_mapinfo__()
> should treat it like one. Although most of our code doesn't, and like
> I
> said, I don't see how it could fail unless dm_task_run() already
> failed
> (or wasn't called).

Right. I also looked at the lvm code, and dm_task_get_XYZ functions
hardly ever fail if running the task succeeded, and they probably never
will. But we shouldn't make any assumptions about libdevmapper in
libmultipath. I will change libmp_mapinfo() to return DMP_ERR in this
case.

Thanks,
Martin


> 
> Any thoughts?
> 
> -Ben
> 
> 
> > +	if (rc != DMP_OK || strncmp(uuid, UUID_PREFIX,
> > UUID_PREFIX_LEN))
> > +		return DM_IS_MPATH_NO;
> > +	else
> > +		return DM_IS_MPATH_YES;
> >  }
> >  
> >  int dm_map_present_by_wwid(const char *wwid)
> > -- 
> > 2.45.2
> 






[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux