Am 12.12.2013 um 07:17 hat Peter Lieven geschrieben: > Am 11.12.2013 22:08, schrieb Kevin Wolf: > > This function separates filling the BlockLimits from bdrv_open(), which > > allows it to call it from other operations which may change the limits > > (e.g. modifications to the backing file chain or bdrv_reopen) > > > > Signed-off-by: Kevin Wolf <kw...@redhat.com>
> > +static int iscsi_refresh_limits(BlockDriverState *bs) > > +{ > > + IscsiLun *iscsilun = bs->opaque; > > + struct scsi_task *task = NULL; > > + int ret; > > + > > + memset(&bs->bl, 0, sizeof(bs->bl)); > > + > you do that memset in bdrv_refresh_limits already. Right, I'll drop it here. > > if (iscsilun->lbp.lbpu || iscsilun->lbp.lbpws) { > > struct scsi_inquiry_block_limits *inq_bl; > > task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, > > @@ -1462,48 +1512,14 @@ static int iscsi_open(BlockDriverState *bs, QDict > > *options, int flags, > > iscsi_do_inquiry does a sync call to request the pages from the target. > you can only do that here if you can guarantee that iscsi_refresh_limits will > be called with no pending requests in-flight otherwise this will end in a > mess. > > otherwise i would propose to leave the inquiry call ins iscsi_open and just > fill > the bs->bl struc tin iscsi_refresh_limits. the problem is if we make this > async > we have to handle all possible I/O callbacks whiile in iscsi_refresh_limits. > i do not see how an iscsi target can change its limits while a target is > mounted. Yes, I'll just split the block in two, leaving the actual request in iscsi_open(). Thanks for your review. Kevin