[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 10/15] libxl: make libxl_cd_insert "eject" + "insert"
On Tue, Sep 09, 2014 at 12:30:33PM +0100, Ian Campbell wrote: > On Thu, 2014-09-04 at 23:43 +0100, Wei Liu wrote: > > A "cdrom insert" is always processed as "eject" + "insert", with JSON > > config updated in between. So that we can know the correct state of > > CDROM later when we try to retrieve domain configuration: if xenstore is > > "empty", then CDROM is "empty"; otherwise use the information presented > > in JSON. > > > > Note that libxl_cd_insert doesn't care about the incarnation of "empty" > > state so I don't state explictly what is in xenstore. > > > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> > > --- > > change in v3: > > clarify "empty" in commit log > > I think you should drop the ""s from around empty, since it keeps making > me thing that it isn't really empty in some sense or otherwise special > that I don't understand. > OK. > > --- > > tools/libxl/libxl.c | 67 > > +++++++++++++++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 65 insertions(+), 2 deletions(-) > > > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > > index fa7d5d5..1fdb2d8 100644 > > --- a/tools/libxl/libxl.c > > +++ b/tools/libxl/libxl.c > > @@ -2662,8 +2662,9 @@ int libxl_device_disk_getinfo(libxl_ctx *ctx, > > uint32_t domid, > > return 0; > > } > > > > -int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk > > *disk, > > - const libxl_asyncop_how *ao_how) > > +static int libxl__cdrom_insert(libxl_ctx *ctx, uint32_t domid, > > + libxl_device_disk *disk, > > + const libxl_asyncop_how *ao_how) > > { > > AO_CREATE(ctx, domid, ao_how); > > int num = 0, i; > > @@ -2774,6 +2775,68 @@ out: > > return AO_INPROGRESS; > > } > > > > +/* > > + * A "cdrom insert" is always processed as "eject" + "insert", with > > + * updating JSON in between. So that we can know the current state of > > + * CDROM later when we try to retrieve domain configuration: if > > + * xenstore is "empty", then CDROM is "empty"; otherwise use the image > > + * in JSON. > > + * > > + * Note that we don't actually care about the incarnation of "empty" > > + * state so we don't state explicitly what the content in xenstore > > + * should be. > > + * > > + * In order to maintain lock hierarchy, CTX lock is taken when > > + * entering this function. > > If this is because the function takes the userdata lock then you should > say so. > OK. > > + lock = libxl__lock_domain_userdata(gc, domid); > > + if (!lock) { > > + rc = ERROR_LOCK_FAIL; > > + goto out; > > + } > > + rc = libxl__get_domain_configuration(gc, domid, &d_config); > > + if (rc) goto out; > > + DEVICE_ADD(disk, disks, domid, disk, COMPARE_DISK, &d_config); > > + rc = libxl__set_domain_configuration(gc, domid, &d_config); > > + if (rc) goto out; > > + libxl__unlock_domain_userdata(lock); > > + > > + rc = libxl__cdrom_insert(ctx, domid, disk, ao_how); > > + > > +out: > > + libxl_device_disk_dispose(&empty); > > + libxl_domain_config_dispose(&d_config); > > This code doesn't seem to adhere to the protocol laid down in the > previous patch and I suspect it therefore isn't safe against parallel > eject/insert calls. > > INSERTION A INSERTION B > > takes lock > updates json > releases lock > > takes lock > updates json > releases lock > > adds to XS > > adds to XS > > Now the json == B and the xenstore == A. > > I think you need to push the json update down into libxl__cdrom_insert > and do the say dance you do elsewhere, with an XS transaction + > existence check inside the userdata locked region. > Yes you're right. I will fix this. Wei. > Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |