… | |
… | |
194 | return; |
194 | return; |
195 | |
195 | |
196 | if (req->int3 >= 0) |
196 | if (req->int3 >= 0) |
197 | break; /* when not autosizing we are done */ |
197 | break; /* when not autosizing we are done */ |
198 | |
198 | |
199 | if (!fiemap->fm_mapped_extents) |
199 | if (fiemap->fm_mapped_extents < count) |
200 | break; /* if file has no segments, we are done */ |
200 | /* either autosizing succeeded, |
|
|
201 | * or the file had no extents |
|
|
202 | * or we luckily had enough space */ |
|
|
203 | break; |
201 | |
204 | |
202 | if (fiemap->fm_extents [fiemap->fm_mapped_extents - 1].fe_flags & FIEMAP_EXTENT_LAST) |
205 | /* some kernels overwrite fm_length, so just reset everything */ |
203 | break; /* autosizing successful, we are done */ |
206 | fiemap->fm_start = req->offs; |
204 | |
207 | fiemap->fm_length = req->size; |
205 | fiemap->fm_flags = req->int2; |
208 | fiemap->fm_flags = req->int2; |
206 | fiemap->fm_extent_count = 0; |
209 | fiemap->fm_extent_count = 0; |
207 | |
210 | |
208 | if (ioctl (req->int1, FS_IOC_FIEMAP, fiemap)) |
211 | if (ioctl (req->int1, FS_IOC_FIEMAP, fiemap)) |
209 | return; |
212 | return; |
210 | |
213 | |
|
|
214 | /* to work around a kernel bug, we allocate one more */ |
211 | count = fiemap->fm_mapped_extents; |
215 | count = fiemap->fm_mapped_extents + 1; |
212 | |
216 | |
213 | free (fiemap); |
217 | free (fiemap); |
214 | } |
218 | } |
215 | |
219 | |
216 | req->result = 0; |
220 | req->result = 0; |