[Libguestfs] [PATCH v2] file: Normalize errno value for ENODEV
Nir Soffer
nsoffer at redhat.com
Mon Jul 30 18:00:35 UTC 2018
On Mon, Jul 30, 2018 at 8:11 PM Nir Soffer <nirsof at gmail.com> wrote:
> Fix issues Eric found in the original patch:
> https://www.redhat.com/archives/libguestfs/2018-July/msg00072.html
>
> - When handling ENODEV, the caller is expecting EOPNOTSUPP to trigger
> fallback.
> - ENODEV should be ignored in file_trim.
>
> Tested only on Fedora 28 and RHEL 7.5.
> ---
>
I forgot to mention that v2 only fixes a typo on v1, that was here:
https://www.redhat.com/archives/libguestfs/2018-July/msg00077.html
> plugins/file/file.c | 33 ++++++++++++++++++++++++---------
> 1 file changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/plugins/file/file.c b/plugins/file/file.c
> index a7c07fb..a8a6253 100644
> --- a/plugins/file/file.c
> +++ b/plugins/file/file.c
> @@ -50,6 +50,21 @@
>
> static char *filename = NULL;
>
> +#if defined(FALLOC_FL_PUNCH_HOLE) || defined(FALLOC_FL_ZERO_RANGE)
> +static int
> +do_fallocate(int fd, int mode, off_t offset, off_t len)
> +{
> + int r = -1;
> + r = fallocate (fd, mode, offset, len);
> + /* kernel 3.10 fails with ENODEV for block device. Kernel >= 4.9 fails
> + with EOPNOTSUPP in this case. Normalize errno to simplify callers. */
> + if (r == -1 && errno == ENODEV) {
> + errno = EOPNOTSUPP;
> + }
> + return r;
> +}
> +#endif
> +
> static void
> file_unload (void)
> {
> @@ -241,9 +256,9 @@ file_zero (void *handle, uint32_t count, uint64_t
> offset, int may_trim)
>
> #ifdef FALLOC_FL_PUNCH_HOLE
> if (may_trim) {
> - r = fallocate (h->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> - offset, count);
> - if (r == -1 && errno != EOPNOTSUPP && errno != ENODEV) {
> + r = do_fallocate (h->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> + offset, count);
> + if (r == -1 && errno != EOPNOTSUPP) {
> nbdkit_error ("zero: %m");
> }
> /* PUNCH_HOLE is older; if it is not supported, it is likely that
> @@ -253,8 +268,8 @@ file_zero (void *handle, uint32_t count, uint64_t
> offset, int may_trim)
> #endif
>
> #ifdef FALLOC_FL_ZERO_RANGE
> - r = fallocate (h->fd, FALLOC_FL_ZERO_RANGE, offset, count);
> - if (r == -1 && errno != EOPNOTSUPP && errno != ENODEV) {
> + r = do_fallocate (h->fd, FALLOC_FL_ZERO_RANGE, offset, count);
> + if (r == -1 && errno != EOPNOTSUPP) {
> nbdkit_error ("zero: %m");
> }
> #else
> @@ -288,11 +303,11 @@ file_trim (void *handle, uint32_t count, uint64_t
> offset)
> struct handle *h = handle;
>
> /* Trim is advisory; we don't care if it fails for anything other
> - * than EIO, EPERM, or ENODEV (kernel 3.10) */
> - r = fallocate (h->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> - offset, count);
> + * than EIO or EPERM. */
> + r = do_fallocate (h->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> + offset, count);
> if (r < 0) {
> - if (errno != EPERM && errno != EIO && errno != ENODEV) {
> + if (errno != EPERM && errno != EIO) {
> nbdkit_debug ("ignoring failed fallocate during trim: %m");
> r = 0;
> }
> --
> 2.17.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20180730/ac89682b/attachment.htm>
More information about the Libguestfs
mailing list