Message ID | 20200420092951.24578-2-mlevitsk@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | LUKS: Fix error message when underlying fs don't support large enough files | expand |
On Mon, 2020-04-20 at 12:29 +0300, Maxim Levitsky wrote: > Currently if you attampt to create too large file with luks you > get the following error message: > > Formatting 'test.luks', fmt=luks size=17592186044416 key-secret=sec0 > qemu-img: test.luks: Could not resize file: File too large > > While for raw format the error message is > qemu-img: test.img: The image size is too large for file format 'raw' > > > The reason for this is that qemu-img checks for errono of the failure, > and presents the later error when it is -EFBIG > > However crypto generic code 'swallows' the errno and replaces it > with -EIO. > > As an attempt to make it better, we can make luks driver, > detect -EFBIG and in this case present a better error message, > which is what this patch does > > The new error message is: > > qemu-img: error creating test.luks: The requested file size is too large > > Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1534898 > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > --- > block/crypto.c | 25 +++++++++++++++++++++---- > 1 file changed, 21 insertions(+), 4 deletions(-) > > diff --git a/block/crypto.c b/block/crypto.c > index d577f89659..f9f5dc11a7 100644 > --- a/block/crypto.c > +++ b/block/crypto.c > @@ -104,18 +104,35 @@ static ssize_t block_crypto_init_func(QCryptoBlock *block, > Error **errp) > { > struct BlockCryptoCreateData *data = opaque; > + Error *local_err = NULL; > + int ret; > > if (data->size > INT64_MAX || headerlen > INT64_MAX - data->size) { > - error_setg(errp, "The requested file size is too large"); > - return -EFBIG; > + ret = -EFBIG; > + goto error; > } > > /* User provided size should reflect amount of space made > * available to the guest, so we must take account of that > * which will be used by the crypto header > */ > - return blk_truncate(data->blk, data->size + headerlen, false, > - data->prealloc, errp); > + ret = blk_truncate(data->blk, data->size + headerlen, false, > + data->prealloc, &local_err); > + > + if (ret >= 0) { > + return ret; > + } > + > +error: > + if (ret == -EFBIG) { > + /* Replace the error message with a better one */ > + error_free(local_err); > + error_setg(errp, "The requested file size is too large"); > + } else { > + error_propagate(errp, local_err); > + } > + > + return ret; > } > > Could someone pick that patch now that the freeze is over? Best regards, Maxim Levitsky
diff --git a/block/crypto.c b/block/crypto.c index d577f89659..f9f5dc11a7 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -104,18 +104,35 @@ static ssize_t block_crypto_init_func(QCryptoBlock *block, Error **errp) { struct BlockCryptoCreateData *data = opaque; + Error *local_err = NULL; + int ret; if (data->size > INT64_MAX || headerlen > INT64_MAX - data->size) { - error_setg(errp, "The requested file size is too large"); - return -EFBIG; + ret = -EFBIG; + goto error; } /* User provided size should reflect amount of space made * available to the guest, so we must take account of that * which will be used by the crypto header */ - return blk_truncate(data->blk, data->size + headerlen, false, - data->prealloc, errp); + ret = blk_truncate(data->blk, data->size + headerlen, false, + data->prealloc, &local_err); + + if (ret >= 0) { + return ret; + } + +error: + if (ret == -EFBIG) { + /* Replace the error message with a better one */ + error_free(local_err); + error_setg(errp, "The requested file size is too large"); + } else { + error_propagate(errp, local_err); + } + + return ret; }