--- IO-AIO/AIO.xs 2012/07/27 17:54:40 1.218 +++ IO-AIO/AIO.xs 2012/07/27 18:43:25 1.219 @@ -196,19 +196,23 @@ if (req->int3 >= 0) break; /* when not autosizing we are done */ - if (!fiemap->fm_mapped_extents) - break; /* if file has no segments, we are done */ - - if (fiemap->fm_extents [fiemap->fm_mapped_extents - 1].fe_flags & FIEMAP_EXTENT_LAST) - break; /* autosizing successful, we are done */ - + if (fiemap->fm_mapped_extents < count) + /* either autosizing succeeded, + * or the file had no extents + * or we luckily had enough space */ + break; + + /* some kernels overwrite fm_length, so just reset everything */ + fiemap->fm_start = req->offs; + fiemap->fm_length = req->size; fiemap->fm_flags = req->int2; fiemap->fm_extent_count = 0; if (ioctl (req->int1, FS_IOC_FIEMAP, fiemap)) return; - count = fiemap->fm_mapped_extents; + /* to work around a kernel bug, we allocate one more */ + count = fiemap->fm_mapped_extents + 1; free (fiemap); }