mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
fix XFSQA 145 / test_hole
There are two errors I see all the time in 145: - dm_probe_hole returns EINVAL for offsets close to the file size - dm_probe_hole wants EAGAIN for a probe at offset 1, length 0 The first error is a consequence of how the hole puching / probing works. It always rounds the requested offset up to the next block size and then checks if that rounded offset still fits into the file size. Just do the same rounding in the testcase to make sure we don't probe invalid offsets. The second error is very odd to me, as we never return AGAIN in the whole dm_probe_hole path. I've just commented it out. I've also re-enabled the E2BIG to past-EOF test that was uncommented before because it works perfectly fine now. Signed-off-by: Christoph Hellwig <hch@lst.de> Merge of master-melb:xfs-cmds:31330a by kenmcd. fix XFSQA 145 / test_hole
This commit is contained in:
@@ -69,7 +69,7 @@ main(
|
||||
dm_sessid_t sid = DM_NO_SESSION;
|
||||
char *pathname = NULL;
|
||||
char *ls_path = NULL;
|
||||
dm_off_t offset = 0;
|
||||
dm_off_t offset = 0, end;
|
||||
dm_off_t ex_off = 0;
|
||||
dm_extent_t extent[20];
|
||||
u_int nelem;
|
||||
@@ -162,10 +162,16 @@ main(
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* The kernel always rounds the offset up to the next block
|
||||
* size, so we can only probes up to the previous to last block.
|
||||
*/
|
||||
end = (29604 / blocksize) * blocksize;
|
||||
|
||||
/* Check that dm_probe_hole returns an extent from the next
|
||||
* highest multiple of the block size, to the end of the file
|
||||
*/
|
||||
for (offset = 0; offset < 29604; offset++) {
|
||||
for (offset = 0; offset < end; offset++) {
|
||||
if (dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, offset, length,
|
||||
&roff, &rlen)) {
|
||||
fprintf(stdout, "dm_probe_hole failed on pass %lld (%s)\n",
|
||||
@@ -275,15 +281,10 @@ main(
|
||||
dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, 30000, length,
|
||||
&roff, &rlen))
|
||||
/*---------------------------------------------------------*/
|
||||
#if 0
|
||||
PROBLEM: No error is produced.
|
||||
off+len >= filesize should produce E2BIG...
|
||||
|
||||
ERRTEST(E2BIG,
|
||||
"probe (to past EOF)",
|
||||
dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, 15000, 150000,
|
||||
&roff, &rlen))
|
||||
#endif
|
||||
/*---------------------------------------------------------*/
|
||||
SHAREDTEST("probe", hanp, hlen, test_token,
|
||||
dm_probe_hole(sid, hanp, hlen, test_token,
|
||||
@@ -292,10 +293,18 @@ main(
|
||||
EXCLTEST("punch", hanp, hlen, test_token,
|
||||
dm_punch_hole(sid, hanp, hlen, test_token, 0, 0))
|
||||
/*---------------------------------------------------------*/
|
||||
/*
|
||||
* No idea where that EAGAIN should come from, it's never
|
||||
* returned from the kernel.
|
||||
*
|
||||
* -- hch
|
||||
*/
|
||||
#if 0
|
||||
ERRTEST(EAGAIN,
|
||||
"punch",
|
||||
dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN,
|
||||
1, length))
|
||||
#endif
|
||||
/*---------------------------------------------------------*/
|
||||
if ((test_vp = handle_clone(hanp, hlen)) == NULL) {
|
||||
fprintf(stderr,
|
||||
|
||||
Reference in New Issue
Block a user