On Fri, 11 Sep 2020 07:30:37 +0200 Markus Armbruster <arm...@redhat.com> wrote:
> Markus Armbruster <arm...@redhat.com> writes: > > > Greg Kurz <gr...@kaod.org> writes: > > > >> On Wed, 9 Sep 2020 21:59:23 +0300 > >> Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> wrote: > >> > >>> It's simple to avoid error propagation in blk_log_writes_open(), we > >>> just need to refactor blk_log_writes_find_cur_log_sector() a bit. > >>> > >>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > >>> --- > >>> block/blklogwrites.c | 23 +++++++++++------------ > >>> 1 file changed, 11 insertions(+), 12 deletions(-) > >>> > >>> diff --git a/block/blklogwrites.c b/block/blklogwrites.c > >>> index 7ef046cee9..c7da507b2d 100644 > >>> --- a/block/blklogwrites.c > >>> +++ b/block/blklogwrites.c > >>> @@ -96,10 +96,10 @@ static inline bool > >>> blk_log_writes_sector_size_valid(uint32_t sector_size) > >>> sector_size < (1ull << 24); > >>> } > >>> > >>> -static uint64_t blk_log_writes_find_cur_log_sector(BdrvChild *log, > >>> - uint32_t sector_size, > >>> - uint64_t nr_entries, > >>> - Error **errp) > >>> +static int64_t blk_log_writes_find_cur_log_sector(BdrvChild *log, > >>> + uint32_t sector_size, > >>> + uint64_t nr_entries, > >>> + Error **errp) > >>> { > >>> uint64_t cur_sector = 1; > >>> uint64_t cur_idx = 0; > >>> @@ -112,13 +112,13 @@ static uint64_t > >>> blk_log_writes_find_cur_log_sector(BdrvChild *log, > >>> if (read_ret < 0) { > >>> error_setg_errno(errp, -read_ret, > >>> "Failed to read log entry %"PRIu64, > >>> cur_idx); > >>> - return (uint64_t)-1ull; > >>> + return read_ret; > >> > >> This changes the error status of blk_log_writes_open() from -EINVAL to > >> whatever is returned by bdrv_pread(). I guess this is an improvement > >> worth to be mentioned in the changelog. > >> > >>> } > >>> > >>> if (cur_entry.flags & ~cpu_to_le64(LOG_FLAG_MASK)) { > >>> error_setg(errp, "Invalid flags 0x%"PRIx64" in log entry > >>> %"PRIu64, > >>> le64_to_cpu(cur_entry.flags), cur_idx); > >>> - return (uint64_t)-1ull; > >>> + return -EINVAL; > >>> } > >>> > >>> /* Account for the sector of the entry itself */ > >>> @@ -143,7 +143,6 @@ static int blk_log_writes_open(BlockDriverState *bs, > >>> QDict *options, int flags, > >>> { > >>> BDRVBlkLogWritesState *s = bs->opaque; > >>> QemuOpts *opts; > >>> - Error *local_err = NULL; > >>> int ret; > >>> uint64_t log_sector_size; > >>> bool log_append; > >>> @@ -215,15 +214,15 @@ static int blk_log_writes_open(BlockDriverState > >>> *bs, QDict *options, int flags, > >>> s->nr_entries = 0; > >>> > >>> if (blk_log_writes_sector_size_valid(log_sector_size)) { > >>> - s->cur_log_sector = > >>> + int64_t cur_log_sector = > >>> blk_log_writes_find_cur_log_sector(s->log_file, > >>> log_sector_size, > >>> - le64_to_cpu(log_sb.nr_entries), > >>> &local_err); > >>> - if (local_err) { > >>> - ret = -EINVAL; > >>> - error_propagate(errp, local_err); > >>> + le64_to_cpu(log_sb.nr_entries), > >>> errp); > >>> + if (cur_log_sector < 0) { > >>> + ret = cur_log_sector; > >> > >> This is converting int64_t to int, which is usually not recommended. > >> In practice this is probably okay because cur_log_sector is supposed > >> to be a negative errno (ie. an int) in this case. > > > > It isn't: blk_log_writes_find_cur_log_sector() returns (uint64_t)-1ull > > on error. > > > > Aside: returning uint64_t is awkward. We commonly use a signed integer > > for non-negative offset or negative error. > > > >> Maybe make this clear with a an assert(cur_log_sector >= INT_MIN) ? > > > > Unless we change blk_log_writes_find_cur_log_sector() to return a > > negative errno code, > > Which the patch does. I shouldn't review patches before breakfast. > :) > > negative errno code, we need to ret = -EINVAL here. Let's keep this > > series simple. > > No, the patch is okay as is. > > Dumbing it down to keep it simple would also be okay. > What about Ari's proposal to add ERRP_GUARD() and check errors with "if (*errp)" like we do for void functions ? > Regarding the proposed assertion: do we protect similar conversions from > over-wide negative errno int elsewhere? > We do protect int64_t->int conversions in a few places, eg. qcow2_write_snapshots() or qemu_spice_create_host_primary(), but I couldn't find one about a negarive errno. > >>> goto fail_log; > >>> } > >>> > >>> + s->cur_log_sector = cur_log_sector; > >>> s->nr_entries = le64_to_cpu(log_sb.nr_entries); > >>> } > >>> } else { >