From: Hannes Reinecke <hare@suse.de>
To: Benjamin Marzinski <bmarzins@redhat.com>
Cc: dm-devel@redhat.com, Mike Snitzer <snitzer@redhat.com>,
Christophe Varoqui <christophe.varoqui@gmail.com>
Subject: Re: [PATCH 36/57] libmultipath: pass in 'cookie' as argument for dm_addmap()
Date: Tue, 3 May 2016 11:31:19 +0200 [thread overview]
Message-ID: <57286FE7.7000402@suse.de> (raw)
In-Reply-To: <20160502222313.GU26117@octiron.msp.redhat.com>
On 05/03/2016 12:23 AM, Benjamin Marzinski wrote:
> On Wed, Apr 27, 2016 at 01:10:37PM +0200, Hannes Reinecke wrote:
>> Instead of generating the cookie internally we should be
>> passing in the cookie to dm_addmap().
>
> These look like they could actually cause problems. With
> dm_addmap_create and dm_addmap_reload, you could be in a situation where
> you get a cookie back on your first call to dm_task_set_cookie, wait on
> it, so that cookie is no longer in use, and then use that same cookie
> id again. It's possible that after you first waited on the cookie,
> someone else could have been given that cookie id (without looking into
> the dm cookie code more, I'm not sure how likely this is). If that is
> so, the second call to dm_addmap would be adding its command to the list
> of other commands for that cookie (since you are allowed to use a cookie
> for multiple dm commands). Calling dm_udev_wait would make it wait of
> all the commands.
>
> We can use a cookie multiple times and then wait on it once. But we
> can't keep reusing the cookie after we've waited on it, because someone
> else could be using the same cookie.
>
> -Ben
>
>>
>> Signed-off-by: Hannes Reinecke <hare@suse.de>
>> ---
>> libmultipath/devmapper.c | 23 ++++++++++++++---------
>> 1 file changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
>> index e6156f7..a96cc0e 100644
>> --- a/libmultipath/devmapper.c
>> +++ b/libmultipath/devmapper.c
>> @@ -274,11 +274,10 @@ dm_device_remove (const char *name, int needsync, int deferred_remove) {
>>
>> extern int
>> dm_addmap (int task, const char *target, struct multipath *mpp,
>> - char * params, int ro) {
>> + char * params, int ro, uint32_t *cookie) {
>> int r = 0;
>> struct dm_task *dmt;
>> char *prefixed_uuid = NULL;
>> - uint32_t cookie = 0;
>>
>> if (!(dmt = dm_task_create (task)))
>> return 0;
>> @@ -319,18 +318,18 @@ dm_addmap (int task, const char *target, struct multipath *mpp,
>> dm_task_no_open_count(dmt);
>>
>> if (task == DM_DEVICE_CREATE &&
>> - !dm_task_set_cookie(dmt, &cookie,
>> + !dm_task_set_cookie(dmt, cookie,
>> DM_UDEV_DISABLE_LIBRARY_FALLBACK)) {
>> - dm_udev_complete(cookie);
>> + dm_udev_complete(*cookie);
>> goto freeout;
>> }
>> r = dm_task_run (dmt);
>>
>> if (task == DM_DEVICE_CREATE) {
>> if (!r)
>> - dm_udev_complete(cookie);
>> + dm_udev_complete(*cookie);
>> else
>> - dm_udev_wait(cookie);
>> + dm_udev_wait(*cookie);
>> }
>> freeout:
>> if (prefixed_uuid)
>> @@ -345,11 +344,13 @@ dm_addmap (int task, const char *target, struct multipath *mpp,
>> extern int
>> dm_addmap_create (struct multipath *mpp, char * params) {
>> int ro;
>> + uint32_t cookie = 0;
>>
>> for (ro = 0; ro <= 1; ro++) {
>> int err;
>>
>> - if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH, mpp, params, ro))
>> + if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH,
>> + mpp, params, ro, &cookie))
>> return 1;
>> /*
>> * DM_DEVICE_CREATE is actually DM_DEV_CREATE + DM_TABLE_LOAD.
>> @@ -374,11 +375,15 @@ dm_addmap_create (struct multipath *mpp, char * params) {
>>
>> extern int
>> dm_addmap_reload (struct multipath *mpp, char *params) {
>> - if (dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, ADDMAP_RW))
>> + uint32_t cookie = 0;
>> +
>> + if (dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params,
>> + ADDMAP_RW, &cookie))
>> return 1;
>> if (errno != EROFS)
>> return 0;
>> - return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, ADDMAP_RO);
>> + return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params,
>> + ADDMAP_RO, &cookie);
>> }
>>
>> extern int
>> --
>> 2.6.6
Looking closer, this entire section looks fishy.
From the lvm source code I couldn't figure out _how_ we could get
into a situation where dm_task_run() would return 0 (ie no error
occurred), but errno would be set to EROFS.
_If_ we could rely on dm_task_run() to return an error here this
whole issue wouldn't occur, as we haven't actually waited on the
cookie, and the second dm_addmap() call would be legit, even with
the same cookie.
Checking with git how the above came about.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
next prev parent reply other threads:[~2016-05-03 9:31 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-27 11:10 [PATCH 00/57] SLES resync Hannes Reinecke
2016-04-27 11:10 ` [PATCH 01/57] kpartx: Fixup persistent name generation Hannes Reinecke
2016-04-27 11:10 ` [PATCH 02/57] kpartx: handle more than 256 loop devices Hannes Reinecke
2016-04-27 11:10 ` [PATCH 03/57] kpartx: parse emulated DASD devices Hannes Reinecke
2016-04-27 11:10 ` [PATCH 04/57] kpartx: Install rules file with correct prefix Hannes Reinecke
2016-04-27 11:10 ` [PATCH 05/57] Add HP MSA 2040 to the hardware table Hannes Reinecke
2016-04-28 22:06 ` Sebastian Herbszt
2016-04-29 5:55 ` Hannes Reinecke
2016-05-01 21:30 ` Sebastian Herbszt
2016-06-09 14:20 ` Xose Vazquez Perez
2016-06-10 6:17 ` Hannes Reinecke
2016-06-10 14:30 ` Xose Vazquez Perez
2016-06-11 10:06 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 06/57] Use ALUA for HP 3PAR Hannes Reinecke
2016-04-28 22:25 ` Sebastian Herbszt
2016-04-29 5:58 ` Hannes Reinecke
2016-05-01 21:46 ` Sebastian Herbszt
2016-04-27 11:10 ` [PATCH 07/57] Add LIO-ORG/SUSE RBD backend hardware defaults Hannes Reinecke
2016-04-28 22:32 ` Sebastian Herbszt
2016-04-27 11:10 ` [PATCH 08/57] Allow for empty SCSI revision Hannes Reinecke
2016-04-27 11:10 ` [PATCH 09/57] libmultipath: Do not use 'sscanf' for parsing integers Hannes Reinecke
2016-04-27 11:10 ` [PATCH 10/57] libmultipath: finally fix dev_loss_tmo setting Hannes Reinecke
2016-04-27 11:10 ` [PATCH 11/57] multipathd: fixup queueing mode in 'show maps status' Hannes Reinecke
2016-04-27 11:10 ` [PATCH 12/57] multipathd: fixup a crash when invoking CLI commands Hannes Reinecke
2016-04-27 11:10 ` [PATCH 13/57] multipathd: print error message for invalid arguments Hannes Reinecke
2016-04-27 11:10 ` [PATCH 14/57] libmultipath: correctly initialize pp->sg_id Hannes Reinecke
2016-04-27 11:10 ` [PATCH 15/57] libmultipath: correctly display checker status Hannes Reinecke
2016-04-27 11:10 ` [PATCH 16/57] libmultipath: call get_uid() for all paths Hannes Reinecke
2016-04-27 11:10 ` [PATCH 17/57] libmultipath: additional logging messages when formatting callout Hannes Reinecke
2016-04-27 11:10 ` [PATCH 18/57] libmpathpersist: Fixup whitespaces in Makefile Hannes Reinecke
2016-04-27 11:10 ` [PATCH 19/57] multipathd: Do not print misleading message 'not found in pathvec' Hannes Reinecke
2016-05-02 15:40 ` Benjamin Marzinski
2016-05-03 5:47 ` Hannes Reinecke
2016-05-03 7:27 ` Christophe Varoqui
2016-04-27 11:10 ` [PATCH 20/57] multipathd: Do not update the paths vec when removing paths Hannes Reinecke
2016-04-29 22:39 ` Benjamin Marzinski
2016-05-02 5:48 ` Hannes Reinecke
2016-05-02 15:12 ` Benjamin Marzinski
2016-05-02 17:46 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 21/57] libmultipath: avoid double semicolon in lock.h Hannes Reinecke
2016-04-27 11:10 ` [PATCH 22/57] multipath: use option '-i' when called from udev Hannes Reinecke
2016-05-02 15:31 ` Benjamin Marzinski
2016-05-03 5:44 ` Hannes Reinecke
2016-05-03 6:37 ` Christophe Varoqui
2016-05-03 14:14 ` Benjamin Marzinski
2016-05-03 14:39 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 23/57] multipath: remove warning 'failed to get wwid' Hannes Reinecke
2016-05-02 15:43 ` Benjamin Marzinski
2016-05-03 5:48 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 24/57] Add dependency on systemd-udevd.service Hannes Reinecke
2016-04-27 11:10 ` [PATCH 25/57] Load all device handler modules on startup Hannes Reinecke
2016-04-27 11:10 ` [PATCH 26/57] 11-dm-mpath.rules: Only import ID_FS_XXX variables if not set Hannes Reinecke
2016-04-27 11:10 ` [PATCH 27/57] Ensure multipathd is started before systemd-udev-trigger.service Hannes Reinecke
2016-04-27 11:10 ` [PATCH 28/57] libmultipath: use a shared lock to co-operate with udev Hannes Reinecke
2016-05-02 16:26 ` Benjamin Marzinski
2016-05-03 5:57 ` Hannes Reinecke
2016-05-03 14:27 ` Benjamin Marzinski
2016-05-03 14:38 ` Alasdair G Kergon
2016-05-03 14:47 ` Benjamin Marzinski
2016-05-03 15:31 ` Germano Percossi
2016-05-03 20:23 ` Benjamin Marzinski
2016-05-04 11:25 ` Germano Percossi
2016-04-27 11:10 ` [PATCH 29/57] Only filter for udev property if uid_attribute is present Hannes Reinecke
2016-04-27 11:10 ` [PATCH 30/57] multipathd: skip uninitialized devices during reconfiguration Hannes Reinecke
2016-05-02 19:14 ` Benjamin Marzinski
2016-05-03 6:04 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 31/57] multipathd: improve uxlsnr Hannes Reinecke
2016-04-27 11:10 ` [PATCH 32/57] libmultipath: remove 'needsync' argument from dm_simplecmd_noflush Hannes Reinecke
2016-04-27 11:10 ` [PATCH 33/57] libmultipath: remove 'use_uuid' argument from dm_addmap() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 34/57] Always set DM_UDEV_DISABLE_LIBRARY_FALLBACK Hannes Reinecke
2016-04-27 11:10 ` [PATCH 35/57] libmultipath: pass in cookie as argument for dm_simplecmd() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 36/57] libmultipath: pass in 'cookie' as argument for dm_addmap() Hannes Reinecke
2016-05-02 22:23 ` Benjamin Marzinski
2016-05-03 6:24 ` Hannes Reinecke
2016-05-03 9:31 ` Hannes Reinecke [this message]
2016-05-03 14:39 ` Benjamin Marzinski
2016-05-03 14:43 ` Hannes Reinecke
2016-05-03 14:57 ` Benjamin Marzinski
2016-04-27 11:10 ` [PATCH 37/57] Remove 'udev_sync' argument from dm_simplecmd() Hannes Reinecke
2016-05-02 23:33 ` Benjamin Marzinski
2016-04-27 11:10 ` [PATCH 38/57] libmultipath: Fixup 'DM_DEVICE_RELOAD' handling Hannes Reinecke
2016-04-27 11:10 ` [PATCH 39/57] devmapper: do not flush I/O for DM_DEVICE_CREATE Hannes Reinecke
2016-04-27 11:10 ` [PATCH 40/57] libmultipath: fixup dm_rename to complete cookie on failure Hannes Reinecke
2016-05-03 1:16 ` Benjamin Marzinski
2016-04-27 11:10 ` [PATCH 41/57] multipathd: accept zero-size paths in ev_add_path() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 42/57] Use multipath wwid if path wwid is empty Hannes Reinecke
2016-04-27 11:10 ` [PATCH 43/57] multipathd: set uxsock_timeout after reconfiguration Hannes Reinecke
2016-04-27 11:10 ` [PATCH 44/57] multipathd: Do not switch paths on empty multipath tables Hannes Reinecke
2016-04-27 11:10 ` [PATCH 45/57] libmultipath: remove 'get_info' argument for adopt_paths() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 46/57] libmultipath: ensure 'dev_t' is set when store paths Hannes Reinecke
2016-04-27 11:10 ` [PATCH 47/57] libmultipath: sanity check on store_path() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 48/57] dmparser: Use find_path_by_dev() Hannes Reinecke
2016-04-27 11:10 ` [PATCH 49/57] multipathd: do not flush maps on startup Hannes Reinecke
2016-05-03 2:30 ` Benjamin Marzinski
2016-05-03 6:35 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 50/57] multipathd: strict loop timings Hannes Reinecke
2016-04-27 11:10 ` [PATCH 51/57] multipathd: Provide standard error description on cli failure Hannes Reinecke
2016-04-27 11:10 ` [PATCH 52/57] libmultipath: make 'dm_addmap' static Hannes Reinecke
2016-04-27 11:10 ` [PATCH 53/57] multipathd: implement 'show map $map format $fmt' Hannes Reinecke
2016-05-03 16:21 ` Benjamin Marzinski
2016-04-27 11:10 ` [PATCH 54/57] multipathd: Increase uxclnt timeout Hannes Reinecke
2016-04-27 11:10 ` [PATCH 55/57] multipathd: asynchronous configuration Hannes Reinecke
2016-05-03 18:23 ` Benjamin Marzinski
2016-05-03 18:25 ` Benjamin Marzinski
2016-05-04 6:47 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 56/57] multipathd: push down lock in checkerloop() Hannes Reinecke
2016-05-03 22:17 ` Benjamin Marzinski
2016-05-03 23:24 ` Benjamin Marzinski
2016-05-04 6:40 ` Hannes Reinecke
2016-05-04 6:39 ` Hannes Reinecke
2016-04-27 11:10 ` [PATCH 57/57] Allow specific CLI commands to run unlocked Hannes Reinecke
2016-05-04 3:02 ` Benjamin Marzinski
2016-05-03 7:23 ` [PATCH 00/57] SLES resync Christophe Varoqui
2016-05-04 3:06 ` Benjamin Marzinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57286FE7.7000402@suse.de \
--to=hare@suse.de \
--cc=bmarzins@redhat.com \
--cc=christophe.varoqui@gmail.com \
--cc=dm-devel@redhat.com \
--cc=snitzer@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox