• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   Copyright (c) International Business Machines  Corp., 2004
3  *
4  *   This program is free software;  you can redistribute it and/or modify
5  *   it under the terms of the GNU General Public License as published by
6  *   the Free Software Foundation; either version 2 of the License, or
7  *   (at your option) any later version.
8  *
9  *   This program is distributed in the hope that it will be useful,
10  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12  *   the GNU General Public License for more details.
13  *
14  *   You should have received a copy of the GNU General Public License
15  *   along with this program;  if not, write to the Free Software
16  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /*
20  * TEST CASE	: hole.c
21  *
22  * VARIATIONS	: 77
23  *
24  * API'S TESTED	: dm_get_allocinfo
25  * 		  dm_probe_hole
26  * 		  dm_punch_hole
27  */
28 #include <string.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <errno.h>
32 #include <unistd.h>
33 #include <sys/stat.h>
34 #include <sys/mman.h>
35 #include <fcntl.h>
36 #include "dm_test.h"
37 
38 #define TMP_FILELEN 500000
39 #define NUM_EXTENTS 8
40 
41 char command[4096];
42 dm_sessid_t sid;
43 dm_extent_t Extents[NUM_EXTENTS];
44 dm_extent_t bigExtents[20];
45 
LogExtents(dm_extent_t * pext,u_int nelem)46 void LogExtents(dm_extent_t * pext, u_int nelem)
47 {
48 
49 	int i;
50 
51 	DMLOG_PRINT(DMLVL_DEBUG, "Extents:\n");
52 	for (i = 0; i < nelem; i++, pext++) {
53 		DMLOG_PRINT(DMLVL_DEBUG,
54 			    "  extent %d: type %d, offset %lld, length %lld\n",
55 			    i + 1, pext->ex_type, pext->ex_offset,
56 			    pext->ex_length);
57 	}
58 
59 }
60 
main(int argc,char ** argv)61 int main(int argc, char **argv)
62 {
63 
64 	char *szFuncName;
65 	char *varstr;
66 	int i;
67 	int rc;
68 	char *szSessionInfo = "dm_test session info";
69 
70 	DMOPT_PARSE(argc, argv);
71 	DMLOG_START();
72 
73 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
74 	if ((rc = dm_init_service(&varstr)) != 0) {
75 		DMLOG_PRINT(DMLVL_ERR,
76 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
77 			    rc, errno);
78 		DM_EXIT();
79 	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
80 		   != 0) {
81 		DMLOG_PRINT(DMLVL_ERR,
82 			    "dm_create_session failed! (rc = %d, errno = %d)\n",
83 			    rc, errno);
84 		DM_EXIT();
85 	} else {
86 		int fd;
87 
88 		fd = open(DUMMY_TMP, O_RDWR | O_CREAT | O_TRUNC,
89 			  DUMMY_FILE_RW_MODE);
90 		if (fd != -1) {
91 			for (i = 0; i < (TMP_FILELEN / DUMMY_STRLEN); i++) {
92 				if (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
93 				    DUMMY_STRLEN) {
94 					rc = -1;
95 					break;
96 				}
97 			}
98 		} else {
99 			rc = -1;
100 		}
101 		if (rc == 0) {
102 			rc = close(fd);
103 		}
104 		if (rc == -1) {
105 			DMLOG_PRINT(DMLVL_ERR,
106 				    "creating dummy file failed! (rc = %d, errno = %d)\n",
107 				    rc, errno);
108 			dm_destroy_session(sid);
109 			DM_EXIT();
110 		}
111 	}
112 
113 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI file hole tests\n");
114 
115 	szFuncName = "dm_get_allocinfo";
116 
117 	/*
118 	 * TEST    : dm_get_allocinfo - invalid sid
119 	 * EXPECTED: rc = -1, errno = EINVAL
120 	 */
121 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 1)) {
122 		int fd;
123 		void *hanp;
124 		size_t hlen;
125 		dm_off_t off = 0;
126 		u_int nelem;
127 
128 		/* Variation set up */
129 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
130 		if ((rc = system(command)) == -1) {
131 			/* No clean up */
132 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
133 			remove(DUMMY_FILE);
134 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
135 			close(fd);
136 			remove(DUMMY_FILE);
137 		}
138 		if (fd == -1 || rc == -1) {
139 			DMLOG_PRINT(DMLVL_DEBUG,
140 				    "Unable to set up variation! (errno = %d)\n",
141 				    errno);
142 			DMVAR_SKIP();
143 		} else {
144 			/* Variation */
145 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
146 				    szFuncName);
147 			rc = dm_get_allocinfo(INVALID_ADDR, hanp, hlen,
148 					      DM_NO_TOKEN, &off, NUM_EXTENTS,
149 					      Extents, &nelem);
150 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
151 
152 			/* Variation clean up */
153 			rc = close(fd);
154 			rc |= remove(DUMMY_FILE);
155 			if (rc == -1) {
156 				DMLOG_PRINT(DMLVL_DEBUG,
157 					    "Unable to clean up variation! (errno = %d)\n",
158 					    errno);
159 			}
160 			dm_handle_free(hanp, hlen);
161 		}
162 	}
163 
164 	/*
165 	 * TEST    : dm_get_allocinfo - invalid hanp
166 	 * EXPECTED: rc = -1, errno = EFAULT
167 	 */
168 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 2)) {
169 		int fd;
170 		void *hanp;
171 		size_t hlen;
172 		dm_off_t off = 0;
173 		u_int nelem;
174 
175 		/* Variation set up */
176 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
177 		if ((rc = system(command)) == -1) {
178 			/* No clean up */
179 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
180 			remove(DUMMY_FILE);
181 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
182 			close(fd);
183 			remove(DUMMY_FILE);
184 		}
185 		if (fd == -1 || rc == -1) {
186 			DMLOG_PRINT(DMLVL_DEBUG,
187 				    "Unable to set up variation! (errno = %d)\n",
188 				    errno);
189 			DMVAR_SKIP();
190 		} else {
191 			/* Variation */
192 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
193 				    szFuncName);
194 			rc = dm_get_allocinfo(sid, (void *)INVALID_ADDR, hlen,
195 					      DM_NO_TOKEN, &off, NUM_EXTENTS,
196 					      Extents, &nelem);
197 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
198 
199 			/* Variation clean up */
200 			rc = close(fd);
201 			rc |= remove(DUMMY_FILE);
202 			if (rc == -1) {
203 				DMLOG_PRINT(DMLVL_DEBUG,
204 					    "Unable to clean up variation! (errno = %d)\n",
205 					    errno);
206 			}
207 			dm_handle_free(hanp, hlen);
208 		}
209 	}
210 
211 	/*
212 	 * TEST    : dm_get_allocinfo - directory handle
213 	 * EXPECTED: rc = -1, errno = EINVAL
214 	 *
215 	 * This variation uncovered XFS BUG #7 (EOPNOTSUPP errno returned
216 	 * instead of EINVAL)
217 	 */
218 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 3)) {
219 		void *hanp;
220 		size_t hlen;
221 		dm_off_t off = 0;
222 		u_int nelem;
223 
224 		/* Variation set up */
225 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
226 			/* No clean up */
227 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
228 			   == -1) {
229 			rmdir(DUMMY_SUBDIR);
230 		}
231 		if (rc == -1) {
232 			DMLOG_PRINT(DMLVL_DEBUG,
233 				    "Unable to set up variation! (errno = %d)\n",
234 				    errno);
235 			DMVAR_SKIP();
236 		} else {
237 			/* Variation */
238 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
239 				    szFuncName);
240 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
241 					      &off, NUM_EXTENTS, Extents,
242 					      &nelem);
243 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
244 
245 			/* Variation clean up */
246 			rc = rmdir(DUMMY_SUBDIR);
247 			if (rc == -1) {
248 				DMLOG_PRINT(DMLVL_DEBUG,
249 					    "Unable to clean up variation! (errno = %d)\n",
250 					    errno);
251 			}
252 			dm_handle_free(hanp, hlen);
253 		}
254 	}
255 
256 	/*
257 	 * TEST    : dm_get_allocinfo - invalid hlen
258 	 * EXPECTED: rc = -1, errno = EBADF
259 	 */
260 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 4)) {
261 		int fd;
262 		void *hanp;
263 		size_t hlen;
264 		dm_off_t off = 0;
265 		u_int nelem;
266 
267 		/* Variation set up */
268 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
269 		if ((rc = system(command)) == -1) {
270 			/* No clean up */
271 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
272 			remove(DUMMY_FILE);
273 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
274 			close(fd);
275 			remove(DUMMY_FILE);
276 		}
277 		if (fd == -1 || rc == -1) {
278 			DMLOG_PRINT(DMLVL_DEBUG,
279 				    "Unable to set up variation! (errno = %d)\n",
280 				    errno);
281 			DMVAR_SKIP();
282 		} else {
283 			/* Variation */
284 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
285 				    szFuncName);
286 			rc = dm_get_allocinfo(sid, hanp, INVALID_ADDR,
287 					      DM_NO_TOKEN, &off, NUM_EXTENTS,
288 					      Extents, &nelem);
289 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
290 
291 			/* Variation clean up */
292 			rc = close(fd);
293 			rc |= remove(DUMMY_FILE);
294 			if (rc == -1) {
295 				DMLOG_PRINT(DMLVL_DEBUG,
296 					    "Unable to clean up variation! (errno = %d)\n",
297 					    errno);
298 			}
299 			dm_handle_free(hanp, hlen);
300 		}
301 	}
302 
303 	/*
304 	 * TEST    : dm_get_allocinfo - invalid token
305 	 * EXPECTED: rc = -1, errno = EINVAL
306 	 */
307 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 5)) {
308 		int fd;
309 		void *hanp;
310 		size_t hlen;
311 		dm_off_t off = 0;
312 		u_int nelem;
313 
314 		/* Variation set up */
315 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
316 		if ((rc = system(command)) == -1) {
317 			/* No clean up */
318 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
319 			remove(DUMMY_FILE);
320 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
321 			close(fd);
322 			remove(DUMMY_FILE);
323 		}
324 		if (fd == -1 || rc == -1) {
325 			DMLOG_PRINT(DMLVL_DEBUG,
326 				    "Unable to set up variation! (errno = %d)\n",
327 				    errno);
328 			DMVAR_SKIP();
329 		} else {
330 			/* Variation */
331 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
332 				    szFuncName);
333 			rc = dm_get_allocinfo(sid, hanp, hlen, INVALID_ADDR,
334 					      &off, NUM_EXTENTS, Extents,
335 					      &nelem);
336 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
337 
338 			/* Variation clean up */
339 			rc = close(fd);
340 			rc |= remove(DUMMY_FILE);
341 			if (rc == -1) {
342 				DMLOG_PRINT(DMLVL_DEBUG,
343 					    "Unable to clean up variation! (errno = %d)\n",
344 					    errno);
345 			}
346 			dm_handle_free(hanp, hlen);
347 		}
348 	}
349 
350 	/*
351 	 * TEST    : dm_get_allocinfo - invalid offp
352 	 * EXPECTED: rc = -1, errno = EFAULT
353 	 */
354 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 6)) {
355 		int fd;
356 		void *hanp;
357 		size_t hlen;
358 		u_int nelem;
359 
360 		/* Variation set up */
361 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
362 		if ((rc = system(command)) == -1) {
363 			/* No clean up */
364 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
365 			remove(DUMMY_FILE);
366 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
367 			close(fd);
368 			remove(DUMMY_FILE);
369 		}
370 		if (fd == -1 || rc == -1) {
371 			DMLOG_PRINT(DMLVL_DEBUG,
372 				    "Unable to set up variation! (errno = %d)\n",
373 				    errno);
374 			DMVAR_SKIP();
375 		} else {
376 			/* Variation */
377 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid offp)\n",
378 				    szFuncName);
379 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
380 					      (dm_off_t *) INVALID_ADDR,
381 					      NUM_EXTENTS, Extents, &nelem);
382 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
383 
384 			/* Variation clean up */
385 			rc = close(fd);
386 			rc |= remove(DUMMY_FILE);
387 			if (rc == -1) {
388 				DMLOG_PRINT(DMLVL_DEBUG,
389 					    "Unable to clean up variation! (errno = %d)\n",
390 					    errno);
391 			}
392 			dm_handle_free(hanp, hlen);
393 		}
394 	}
395 
396 	/*
397 	 * TEST    : dm_get_allocinfo - unaligned offp
398 	 * EXPECTED: rc = -1, errno = EINVAL
399 	 */
400 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 7)) {
401 		int fd;
402 		void *hanp;
403 		size_t hlen;
404 		dm_off_t off = UNALIGNED_BLK_OFF;
405 		u_int nelem;
406 
407 		/* Variation set up */
408 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
409 		if ((rc = system(command)) == -1) {
410 			/* No clean up */
411 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
412 			remove(DUMMY_FILE);
413 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
414 			close(fd);
415 			remove(DUMMY_FILE);
416 		}
417 		if (fd == -1 || rc == -1) {
418 			DMLOG_PRINT(DMLVL_DEBUG,
419 				    "Unable to set up variation! (errno = %d)\n",
420 				    errno);
421 			DMVAR_SKIP();
422 		} else {
423 			/* Variation */
424 			DMLOG_PRINT(DMLVL_DEBUG, "%s(unaligned offp)\n",
425 				    szFuncName);
426 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
427 					      &off, NUM_EXTENTS, Extents,
428 					      &nelem);
429 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
430 
431 			/* Variation clean up */
432 			rc = close(fd);
433 			rc |= remove(DUMMY_FILE);
434 			if (rc == -1) {
435 				DMLOG_PRINT(DMLVL_DEBUG,
436 					    "Unable to clean up variation! (errno = %d)\n",
437 					    errno);
438 			}
439 			dm_handle_free(hanp, hlen);
440 		}
441 	}
442 
443 	/*
444 	 * TEST    : dm_get_allocinfo - off past EOF
445 	 * EXPECTED: rc = -1, errno = EINVAL
446 	 */
447 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 8)) {
448 		int fd;
449 		void *hanp;
450 		size_t hlen;
451 		dm_off_t off = TMP_FILELEN + 1;
452 		u_int nelem;
453 
454 		/* Variation set up */
455 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
456 		if ((rc = system(command)) == -1) {
457 			/* No clean up */
458 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
459 			remove(DUMMY_FILE);
460 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
461 			close(fd);
462 			remove(DUMMY_FILE);
463 		}
464 		if (fd == -1 || rc == -1) {
465 			DMLOG_PRINT(DMLVL_DEBUG,
466 				    "Unable to set up variation! (errno = %d)\n",
467 				    errno);
468 			DMVAR_SKIP();
469 		} else {
470 			/* Variation */
471 			DMLOG_PRINT(DMLVL_DEBUG, "%s(off past EOF)\n",
472 				    szFuncName);
473 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
474 					      &off, NUM_EXTENTS, Extents,
475 					      &nelem);
476 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
477 
478 			/* Variation clean up */
479 			rc = close(fd);
480 			rc |= remove(DUMMY_FILE);
481 			if (rc == -1) {
482 				DMLOG_PRINT(DMLVL_DEBUG,
483 					    "Unable to clean up variation! (errno = %d)\n",
484 					    errno);
485 			}
486 			dm_handle_free(hanp, hlen);
487 		}
488 	}
489 
490 	/*
491 	 * TEST    : dm_get_allocinfo - zero nelem
492 	 * EXPECTED: rc = -1, errno = EINVAL
493 	 */
494 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 9)) {
495 		int fd;
496 		void *hanp;
497 		size_t hlen;
498 		dm_off_t off = 0;
499 		u_int nelem;
500 
501 		/* Variation set up */
502 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
503 		if ((rc = system(command)) == -1) {
504 			/* No clean up */
505 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
506 			remove(DUMMY_FILE);
507 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
508 			close(fd);
509 			remove(DUMMY_FILE);
510 		}
511 		if (fd == -1 || rc == -1) {
512 			DMLOG_PRINT(DMLVL_DEBUG,
513 				    "Unable to set up variation! (errno = %d)\n",
514 				    errno);
515 			DMVAR_SKIP();
516 		} else {
517 			/* Variation */
518 			DMLOG_PRINT(DMLVL_DEBUG, "%s(nelem zero)\n",
519 				    szFuncName);
520 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
521 					      &off, 0, Extents, &nelem);
522 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
523 
524 			/* Variation clean up */
525 			rc = close(fd);
526 			rc |= remove(DUMMY_FILE);
527 			if (rc == -1) {
528 				DMLOG_PRINT(DMLVL_DEBUG,
529 					    "Unable to clean up variation! (errno = %d)\n",
530 					    errno);
531 			}
532 			dm_handle_free(hanp, hlen);
533 		}
534 	}
535 
536 	/*
537 	 * TEST    : dm_get_allocinfo - invalid extentp
538 	 * EXPECTED: rc = -1, errno = EFAULT
539 	 */
540 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 10)) {
541 		int fd;
542 		void *hanp;
543 		size_t hlen;
544 		dm_off_t off = 0;
545 		u_int nelem;
546 
547 		/* Variation set up */
548 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
549 		if ((rc = system(command)) == -1) {
550 			/* No clean up */
551 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
552 			remove(DUMMY_FILE);
553 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
554 			close(fd);
555 			remove(DUMMY_FILE);
556 		}
557 		if (fd == -1 || rc == -1) {
558 			DMLOG_PRINT(DMLVL_DEBUG,
559 				    "Unable to set up variation! (errno = %d)\n",
560 				    errno);
561 			DMVAR_SKIP();
562 		} else {
563 			/* Variation */
564 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid extentp)\n",
565 				    szFuncName);
566 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
567 					      &off, NUM_EXTENTS,
568 					      (dm_extent_t *) INVALID_ADDR,
569 					      &nelem);
570 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
571 
572 			/* Variation clean up */
573 			rc = close(fd);
574 			rc |= remove(DUMMY_FILE);
575 			if (rc == -1) {
576 				DMLOG_PRINT(DMLVL_DEBUG,
577 					    "Unable to clean up variation! (errno = %d)\n",
578 					    errno);
579 			}
580 			dm_handle_free(hanp, hlen);
581 		}
582 	}
583 
584 	/*
585 	 * TEST    : dm_get_allocinfo - invalid nelemp
586 	 * EXPECTED: rc = -1, errno = EFAULT
587 	 */
588 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 11)) {
589 		int fd;
590 		void *hanp;
591 		size_t hlen;
592 		dm_off_t off = 0;
593 
594 		/* Variation set up */
595 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
596 		if ((rc = system(command)) == -1) {
597 			/* No clean up */
598 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
599 			remove(DUMMY_FILE);
600 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
601 			close(fd);
602 			remove(DUMMY_FILE);
603 		}
604 		if (fd == -1 || rc == -1) {
605 			DMLOG_PRINT(DMLVL_DEBUG,
606 				    "Unable to set up variation! (errno = %d)\n",
607 				    errno);
608 			DMVAR_SKIP();
609 		} else {
610 			/* Variation */
611 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid nelemp)\n",
612 				    szFuncName);
613 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
614 					      &off, NUM_EXTENTS, Extents,
615 					      (u_int *) INVALID_ADDR);
616 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
617 
618 			/* Variation clean up */
619 			rc = close(fd);
620 			rc |= remove(DUMMY_FILE);
621 			if (rc == -1) {
622 				DMLOG_PRINT(DMLVL_DEBUG,
623 					    "Unable to clean up variation! (errno = %d)\n",
624 					    errno);
625 			}
626 			dm_handle_free(hanp, hlen);
627 		}
628 	}
629 
630 	/*
631 	 * TEST    : dm_get_allocinfo - zero-length file
632 	 * EXPECTED: rc = 0, nelem = 0
633 	 */
634 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 12)) {
635 		int fd;
636 		void *hanp;
637 		size_t hlen;
638 		dm_off_t off = 0;
639 		u_int nelem;
640 
641 		/* Variation set up */
642 		if ((fd =
643 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
644 			  DUMMY_FILE_RW_MODE)) == -1) {
645 			/* No clean up */
646 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
647 			close(fd);
648 			remove(DUMMY_FILE);
649 		}
650 		if (fd == -1 || rc == -1) {
651 			DMLOG_PRINT(DMLVL_DEBUG,
652 				    "Unable to set up variation! (errno = %d)\n",
653 				    errno);
654 			DMVAR_SKIP();
655 		} else {
656 			/* Variation */
657 			DMLOG_PRINT(DMLVL_DEBUG, "%s(zero-length file)\n",
658 				    szFuncName);
659 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
660 					      &off, NUM_EXTENTS, Extents,
661 					      &nelem);
662 			DMLOG_PRINT(DMLVL_DEBUG,
663 				    "dm_get_allocinfo returned %d\n", rc);
664 			if (rc == 0) {
665 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
666 				if (nelem == 0) {
667 					DMLOG_PRINT(DMLVL_DEBUG,
668 						    "  nelem = %d\n", nelem);
669 					DMVAR_PASS();
670 				} else {
671 					DMLOG_PRINT(DMLVL_ERR,
672 						    "%s nelem NOT correct! (%d vs %d)\n",
673 						    szFuncName, nelem, 1);
674 					DMVAR_FAIL();
675 				}
676 			} else {
677 				DMLOG_PRINT(DMLVL_ERR,
678 					    "%s failed with unexpected rc = %d (errno = %d)\n",
679 					    szFuncName, rc, errno);
680 				DMVAR_FAIL();
681 			}
682 
683 			/* Variation clean up */
684 			rc = close(fd);
685 			rc |= remove(DUMMY_FILE);
686 			if (rc == -1) {
687 				DMLOG_PRINT(DMLVL_DEBUG,
688 					    "Unable to clean up variation! (errno = %d)\n",
689 					    errno);
690 			}
691 			dm_handle_free(hanp, hlen);
692 		}
693 	}
694 
695 	/*
696 	 * TEST    : dm_get_allocinfo - file all resident
697 	 * EXPECTED: rc = 0, nelem = 1
698 	 */
699 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 13)) {
700 		int fd;
701 		void *hanp;
702 		size_t hlen;
703 		dm_off_t off = 0;
704 		u_int nelem;
705 
706 		/* Variation set up */
707 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
708 		if ((rc = system(command)) == -1) {
709 			/* No clean up */
710 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
711 			remove(DUMMY_FILE);
712 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
713 			close(fd);
714 			remove(DUMMY_FILE);
715 		}
716 		if (fd == -1 || rc == -1) {
717 			DMLOG_PRINT(DMLVL_DEBUG,
718 				    "Unable to set up variation! (errno = %d)\n",
719 				    errno);
720 			DMVAR_SKIP();
721 		} else {
722 			/* Variation */
723 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file all resident)\n",
724 				    szFuncName);
725 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
726 					      &off, NUM_EXTENTS, Extents,
727 					      &nelem);
728 			DMLOG_PRINT(DMLVL_DEBUG,
729 				    "dm_get_allocinfo returned %d\n", rc);
730 			if (rc == 0) {
731 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
732 				if (nelem == 1) {
733 					DMLOG_PRINT(DMLVL_DEBUG,
734 						    "  nelem = %d\n", nelem);
735 					LogExtents(Extents, nelem);
736 					if ((Extents[0].ex_length ==
737 					     TMP_FILELEN)
738 					    && (Extents[0].ex_offset == 0)
739 					    && (Extents[0].ex_type ==
740 						DM_EXTENT_RES)) {
741 						DMLOG_PRINT(DMLVL_DEBUG,
742 							    "%s extent information correct\n",
743 							    szFuncName);
744 						DMVAR_PASS();
745 					} else {
746 						DMLOG_PRINT(DMLVL_ERR,
747 							    "%s extent information NOT correct!\n",
748 							    szFuncName);
749 						DMVAR_FAIL();
750 					}
751 				} else {
752 					DMLOG_PRINT(DMLVL_ERR,
753 						    "%s nelem NOT correct! (%d vs %d)\n",
754 						    szFuncName, nelem, 1);
755 					DMVAR_FAIL();
756 				}
757 			} else {
758 				DMLOG_PRINT(DMLVL_ERR,
759 					    "%s failed with unexpected rc = %d (errno = %d)\n",
760 					    szFuncName, rc, errno);
761 				DMVAR_FAIL();
762 			}
763 
764 			/* Variation clean up */
765 			rc = close(fd);
766 			rc |= remove(DUMMY_FILE);
767 			if (rc == -1) {
768 				DMLOG_PRINT(DMLVL_DEBUG,
769 					    "Unable to clean up variation! (errno = %d)\n",
770 					    errno);
771 			}
772 			dm_handle_free(hanp, hlen);
773 		}
774 	}
775 
776 	/*
777 	 * TEST    : dm_get_allocinfo - file all hole
778 	 * EXPECTED: rc = 0, nelem = 1
779 	 */
780 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 14)) {
781 		int fd;
782 		void *hanp;
783 		size_t hlen;
784 		dm_off_t off = 0;
785 		u_int nelem;
786 
787 		/* Variation set up */
788 		if ((fd =
789 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
790 			  DUMMY_FILE_RW_MODE)) == -1) {
791 			/* No clean up */
792 		} else
793 		    if (((off =
794 			  lseek(fd, TMP_FILELEN - DUMMY_STRLEN,
795 				SEEK_SET)) != TMP_FILELEN - DUMMY_STRLEN)
796 			||
797 			((rc =
798 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
799 			   DUMMY_STRLEN) ? -1 : 0) == -1)
800 			||
801 			((rc =
802 			  ftruncate(fd,
803 				    ((TMP_FILELEN / 2) & (~(BLK_SIZE - 1))))) ==
804 			 -1)
805 			|| ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1)) {
806 			close(fd);
807 			remove(DUMMY_FILE);
808 		}
809 		if (fd == -1 || off != (TMP_FILELEN - DUMMY_STRLEN) || rc == -1) {
810 			DMLOG_PRINT(DMLVL_DEBUG,
811 				    "Unable to set up variation! (errno = %d)\n",
812 				    errno);
813 			DMVAR_SKIP();
814 		} else {
815 			/* Variation */
816 			off = 0;
817 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file all hole)\n",
818 				    szFuncName);
819 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
820 					      &off, NUM_EXTENTS, Extents,
821 					      &nelem);
822 			DMLOG_PRINT(DMLVL_DEBUG,
823 				    "dm_get_allocinfo returned %d\n", rc);
824 			if (rc == 0) {
825 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
826 				if (nelem == 1) {
827 					DMLOG_PRINT(DMLVL_DEBUG,
828 						    "  nelem = %d\n", nelem);
829 					LogExtents(Extents, nelem);
830 					if ((Extents[0].ex_length ==
831 					     ((TMP_FILELEN /
832 					       2) & (~(BLK_SIZE - 1))))
833 					    && (Extents[0].ex_offset == 0)
834 					    && (Extents[0].ex_type ==
835 						DM_EXTENT_HOLE)) {
836 						DMLOG_PRINT(DMLVL_DEBUG,
837 							    "%s extent information correct\n",
838 							    szFuncName);
839 						DMVAR_PASS();
840 					} else {
841 						DMLOG_PRINT(DMLVL_ERR,
842 							    "%s extent information NOT correct!\n",
843 							    szFuncName);
844 						DMVAR_FAIL();
845 					}
846 				} else {
847 					DMLOG_PRINT(DMLVL_ERR,
848 						    "%s nelem NOT correct! (%d vs %d)\n",
849 						    szFuncName, nelem, 1);
850 					DMVAR_FAIL();
851 				}
852 			} else {
853 				DMLOG_PRINT(DMLVL_ERR,
854 					    "%s failed with unexpected rc = %d (errno = %d)\n",
855 					    szFuncName, rc, errno);
856 				DMVAR_FAIL();
857 			}
858 
859 			/* Variation clean up */
860 			rc = close(fd);
861 			rc |= remove(DUMMY_FILE);
862 			if (rc == -1) {
863 				DMLOG_PRINT(DMLVL_DEBUG,
864 					    "Unable to clean up variation! (errno = %d)\n",
865 					    errno);
866 			}
867 			dm_handle_free(hanp, hlen);
868 		}
869 	}
870 
871 	/*
872 	 * TEST    : dm_get_allocinfo - hole, then resident
873 	 * EXPECTED: rc = 0, nelem = 2
874 	 */
875 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 15)) {
876 		int fd;
877 		void *hanp;
878 		size_t hlen;
879 		dm_off_t off = 0;
880 		u_int nelem;
881 
882 		/* Variation set up */
883 		if ((fd =
884 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
885 			  DUMMY_FILE_RW_MODE)) == -1) {
886 			/* No clean up */
887 		} else
888 		    if (((off =
889 			  lseek(fd, TMP_FILELEN - DUMMY_STRLEN,
890 				SEEK_SET)) != TMP_FILELEN - DUMMY_STRLEN)
891 			||
892 			((rc =
893 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
894 			   DUMMY_STRLEN) ? -1 : 0) == -1)
895 			|| ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1)) {
896 			close(fd);
897 			remove(DUMMY_FILE);
898 		}
899 		if (fd == -1 || off != (TMP_FILELEN - DUMMY_STRLEN) || rc == -1) {
900 			DMLOG_PRINT(DMLVL_DEBUG,
901 				    "Unable to set up variation! (errno = %d)\n",
902 				    errno);
903 			DMVAR_SKIP();
904 		} else {
905 			/* Variation */
906 			off = 0;
907 			DMLOG_PRINT(DMLVL_DEBUG, "%s(hole, resident)\n",
908 				    szFuncName);
909 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
910 					      &off, NUM_EXTENTS, Extents,
911 					      &nelem);
912 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
913 				    rc);
914 			if (rc == 0) {
915 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
916 				if (nelem == 2) {
917 					int i;
918 
919 					DMLOG_PRINT(DMLVL_DEBUG,
920 						    "  nelem = %d\n", nelem);
921 					LogExtents(Extents, nelem);
922 					if ((i = 1)
923 					    && (Extents[0].ex_length +
924 						Extents[1].ex_length ==
925 						TMP_FILELEN) && (i = 2)
926 					    && (Extents[0].ex_offset == 0)
927 					    && (i = 3)
928 					    && (Extents[0].ex_length ==
929 						Extents[1].ex_offset) && (i = 4)
930 					    && (Extents[0].ex_type ==
931 						DM_EXTENT_HOLE) && (i = 5)
932 					    && (Extents[1].ex_type ==
933 						DM_EXTENT_RES)
934 					    ) {
935 						DMLOG_PRINT(DMLVL_DEBUG,
936 							    "%s extent information correct\n",
937 							    szFuncName);
938 						DMVAR_PASS();
939 					} else {
940 						DMLOG_PRINT(DMLVL_ERR,
941 							    "%s extent information NOT correct! (test %d failed)\n",
942 							    szFuncName, i);
943 						DMVAR_FAIL();
944 					}
945 				} else {
946 					DMLOG_PRINT(DMLVL_ERR,
947 						    "%s nelem NOT correct! (%d vs %d)\n",
948 						    szFuncName, nelem, 2);
949 					DMVAR_FAIL();
950 				}
951 			} else {
952 				DMLOG_PRINT(DMLVL_ERR,
953 					    "%s failed with unexpected rc = %d (errno = %d)\n",
954 					    szFuncName, rc, errno);
955 				DMVAR_FAIL();
956 			}
957 
958 			/* Variation clean up */
959 			rc = close(fd);
960 			rc |= remove(DUMMY_FILE);
961 			if (rc == -1) {
962 				DMLOG_PRINT(DMLVL_DEBUG,
963 					    "Unable to clean up variation! (errno = %d)\n",
964 					    errno);
965 			}
966 			dm_handle_free(hanp, hlen);
967 		}
968 	}
969 
970 	/*
971 	 * TEST    : dm_get_allocinfo - resident, then hole
972 	 * EXPECTED: rc = 0, nelem = 2
973 	 */
974 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 16)) {
975 		int fd;
976 		void *hanp;
977 		size_t hlen;
978 		dm_off_t off = 0;
979 		u_int nelem;
980 
981 		/* Variation set up */
982 		if ((fd =
983 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
984 			  DUMMY_FILE_RW_MODE)) == -1) {
985 			/* No clean up */
986 		} else
987 		    if (((rc =
988 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
989 			   DUMMY_STRLEN) ? -1 : 0) == -1)
990 			||
991 			((off =
992 			  lseek(fd, TMP_FILELEN - DUMMY_STRLEN,
993 				SEEK_SET)) != TMP_FILELEN - DUMMY_STRLEN)
994 			||
995 			((rc =
996 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
997 			   DUMMY_STRLEN) ? -1 : 0) == -1)
998 			||
999 			((rc =
1000 			  ftruncate(fd,
1001 				    ((TMP_FILELEN / 2) & (~(BLK_SIZE - 1))))) ==
1002 			 -1)
1003 			|| ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1)) {
1004 			close(fd);
1005 			remove(DUMMY_FILE);
1006 		}
1007 		if (fd == -1 || off != (TMP_FILELEN - DUMMY_STRLEN) || rc == -1) {
1008 			DMLOG_PRINT(DMLVL_DEBUG,
1009 				    "Unable to set up variation! (errno = %d)\n",
1010 				    errno);
1011 			DMVAR_SKIP();
1012 		} else {
1013 			/* Variation */
1014 			off = 0;
1015 			DMLOG_PRINT(DMLVL_DEBUG, "%s(resident, hole)\n",
1016 				    szFuncName);
1017 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
1018 					      &off, NUM_EXTENTS, Extents,
1019 					      &nelem);
1020 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
1021 				    rc);
1022 			if (rc == 0) {
1023 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
1024 				if (nelem == 2) {
1025 					int i;
1026 
1027 					DMLOG_PRINT(DMLVL_DEBUG,
1028 						    "  nelem = %d\n", nelem);
1029 					LogExtents(Extents, nelem);
1030 					if ((i = 1)
1031 					    && (Extents[0].ex_length +
1032 						Extents[1].ex_length ==
1033 						((TMP_FILELEN /
1034 						  2) & (~(BLK_SIZE - 1))))
1035 					    && (i = 2)
1036 					    && (Extents[0].ex_offset == 0)
1037 					    && (i = 3)
1038 					    && (Extents[0].ex_length ==
1039 						Extents[1].ex_offset) && (i = 4)
1040 					    && (Extents[0].ex_type ==
1041 						DM_EXTENT_RES) && (i = 5)
1042 					    && (Extents[1].ex_type ==
1043 						DM_EXTENT_HOLE)
1044 					    ) {
1045 						DMLOG_PRINT(DMLVL_DEBUG,
1046 							    "%s extent information correct\n",
1047 							    szFuncName);
1048 						DMVAR_PASS();
1049 					} else {
1050 						DMLOG_PRINT(DMLVL_ERR,
1051 							    "%s extent information NOT correct! (test %d failed)\n",
1052 							    szFuncName, i);
1053 						DMVAR_FAIL();
1054 					}
1055 				} else {
1056 					DMLOG_PRINT(DMLVL_ERR,
1057 						    "%s nelem NOT correct! (%d vs %d)\n",
1058 						    szFuncName, nelem, 2);
1059 					DMVAR_FAIL();
1060 				}
1061 			} else {
1062 				DMLOG_PRINT(DMLVL_ERR,
1063 					    "%s failed with unexpected rc = %d (errno = %d)\n",
1064 					    szFuncName, rc, errno);
1065 				DMVAR_FAIL();
1066 			}
1067 
1068 			/* Variation clean up */
1069 			rc = close(fd);
1070 			rc |= remove(DUMMY_FILE);
1071 			if (rc == -1) {
1072 				DMLOG_PRINT(DMLVL_DEBUG,
1073 					    "Unable to clean up variation! (errno = %d)\n",
1074 					    errno);
1075 			}
1076 			dm_handle_free(hanp, hlen);
1077 		}
1078 	}
1079 
1080 	/*
1081 	 * TEST    : dm_get_allocinfo - resident, then hole, then resident
1082 	 * EXPECTED: rc = 0, nelem = 3
1083 	 */
1084 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 17)) {
1085 		int fd;
1086 		void *hanp;
1087 		size_t hlen;
1088 		dm_off_t off = 0;
1089 		u_int nelem;
1090 
1091 		/* Variation set up */
1092 		if ((fd =
1093 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
1094 			  DUMMY_FILE_RW_MODE)) == -1) {
1095 			/* No clean up */
1096 		} else
1097 		    if (((rc =
1098 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
1099 			   DUMMY_STRLEN) ? -1 : 0) == -1)
1100 			||
1101 			((off =
1102 			  lseek(fd, TMP_FILELEN - DUMMY_STRLEN,
1103 				SEEK_SET)) != TMP_FILELEN - DUMMY_STRLEN)
1104 			||
1105 			((rc =
1106 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
1107 			   DUMMY_STRLEN) ? -1 : 0) == -1)
1108 			|| ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1)) {
1109 			close(fd);
1110 			remove(DUMMY_FILE);
1111 		}
1112 		if (fd == -1 || off != (TMP_FILELEN - DUMMY_STRLEN) || rc == -1) {
1113 			DMLOG_PRINT(DMLVL_DEBUG,
1114 				    "Unable to set up variation! (errno = %d)\n",
1115 				    errno);
1116 			DMVAR_SKIP();
1117 		} else {
1118 			/* Variation */
1119 			off = 0;
1120 			DMLOG_PRINT(DMLVL_DEBUG,
1121 				    "%s(resident, hole, resident)\n",
1122 				    szFuncName);
1123 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
1124 					      &off, NUM_EXTENTS, Extents,
1125 					      &nelem);
1126 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
1127 				    rc);
1128 			if (rc == 0) {
1129 				int i;
1130 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
1131 
1132 				if (nelem == 3) {
1133 					DMLOG_PRINT(DMLVL_DEBUG,
1134 						    "  nelem = %d\n", nelem);
1135 					LogExtents(Extents, nelem);
1136 					if ((i = 1)
1137 					    && (Extents[0].ex_length +
1138 						Extents[1].ex_length +
1139 						Extents[2].ex_length ==
1140 						TMP_FILELEN) && (i = 2)
1141 					    && (Extents[0].ex_offset == 0)
1142 					    && (i = 3)
1143 					    && (Extents[0].ex_length ==
1144 						Extents[1].ex_offset) && (i = 4)
1145 					    && (Extents[1].ex_length +
1146 						Extents[1].ex_offset ==
1147 						Extents[2].ex_offset) && (i = 5)
1148 					    && (Extents[0].ex_type ==
1149 						DM_EXTENT_RES) && (i = 6)
1150 					    && (Extents[1].ex_type ==
1151 						DM_EXTENT_HOLE) && (i = 7)
1152 					    && (Extents[2].ex_type ==
1153 						DM_EXTENT_RES)
1154 					    ) {
1155 						DMLOG_PRINT(DMLVL_DEBUG,
1156 							    "%s extent information correct\n",
1157 							    szFuncName);
1158 						DMVAR_PASS();
1159 					} else {
1160 						DMLOG_PRINT(DMLVL_ERR,
1161 							    "%s extent information NOT correct! (test %d failed)\n",
1162 							    szFuncName, i);
1163 						DMVAR_FAIL();
1164 					}
1165 				} else {
1166 					DMLOG_PRINT(DMLVL_ERR,
1167 						    "%s nelem NOT correct! (%d vs %d)\n",
1168 						    szFuncName, nelem, 3);
1169 					DMVAR_FAIL();
1170 				}
1171 			} else {
1172 				DMLOG_PRINT(DMLVL_ERR,
1173 					    "%s failed with unexpected rc = %d (errno = %d)\n",
1174 					    szFuncName, rc, errno);
1175 				DMVAR_FAIL();
1176 			}
1177 
1178 			/* Variation clean up */
1179 			rc = close(fd);
1180 			rc |= remove(DUMMY_FILE);
1181 			if (rc == -1) {
1182 				DMLOG_PRINT(DMLVL_DEBUG,
1183 					    "Unable to clean up variation! (errno = %d)\n",
1184 					    errno);
1185 			}
1186 			dm_handle_free(hanp, hlen);
1187 		}
1188 	}
1189 
1190 	/*
1191 	 * TEST    : dm_get_allocinfo - resident, then hole, then resident, then hole, etc.
1192 	 * EXPECTED: rc = 1, nelem = 8
1193 	 */
1194 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 18)) {
1195 		int fd;
1196 		void *hanp;
1197 		size_t hlen;
1198 		dm_off_t off = 0;
1199 		u_int nelem;
1200 		int i;
1201 
1202 		/* Variation set up */
1203 		fd = open(DUMMY_FILE, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE);
1204 		for (i = 0, rc = 0; rc == 0 && i < TMP_FILELEN;
1205 		     i += TMP_FILELEN / (NUM_EXTENTS + 2)) {
1206 			if ((rc =
1207 			     (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
1208 			      DUMMY_STRLEN) ? -1 : 0) != -1) {
1209 				if ((off = lseek(fd, i, SEEK_SET)) != off) {
1210 					rc = -1;
1211 				}
1212 			}
1213 		}
1214 		if ((rc == -1) ||
1215 		    ((off =
1216 		      lseek(fd, TMP_FILELEN - DUMMY_STRLEN, SEEK_SET)) != off)
1217 		    ||
1218 		    ((rc =
1219 		      (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
1220 		       DUMMY_STRLEN) ? -1 : 0) == -1)
1221 		    || ((rc = dm_fd_to_handle(fd, &hanp, &hlen)))) {
1222 			close(fd);
1223 			remove(DUMMY_FILE);
1224 		}
1225 		if (fd == -1 || off != TMP_FILELEN - DUMMY_STRLEN || rc == -1) {
1226 			DMLOG_PRINT(DMLVL_DEBUG,
1227 				    "Unable to set up variation! (errno = %d)\n",
1228 				    errno);
1229 			DMVAR_SKIP();
1230 		} else {
1231 			/* Variation */
1232 			off = 0;
1233 			DMLOG_PRINT(DMLVL_DEBUG,
1234 				    "%s(resident, hole, resident, hole, etc.)\n",
1235 				    szFuncName);
1236 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
1237 					      &off, NUM_EXTENTS, Extents,
1238 					      &nelem);
1239 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
1240 				    rc);
1241 			if (rc == 1) {
1242 				int i;
1243 				DMLOG_PRINT(DMLVL_DEBUG, "  off = %lld\n", off);
1244 
1245 				if (nelem == NUM_EXTENTS) {
1246 					DMLOG_PRINT(DMLVL_DEBUG,
1247 						    "  nelem = %d\n", nelem);
1248 					LogExtents(Extents, nelem);
1249 					if ((i = 1)
1250 					    && (Extents[0].ex_offset == 0)
1251 					    && (i = 2)
1252 					    && (Extents[0].ex_length ==
1253 						Extents[1].ex_offset) && (i = 3)
1254 					    && (Extents[1].ex_length +
1255 						Extents[1].ex_offset ==
1256 						Extents[2].ex_offset) && (i = 4)
1257 					    && (Extents[2].ex_length +
1258 						Extents[2].ex_offset ==
1259 						Extents[3].ex_offset) && (i = 5)
1260 					    && (Extents[3].ex_length +
1261 						Extents[3].ex_offset ==
1262 						Extents[4].ex_offset) && (i = 6)
1263 					    && (Extents[4].ex_length +
1264 						Extents[4].ex_offset ==
1265 						Extents[5].ex_offset) && (i = 7)
1266 					    && (Extents[5].ex_length +
1267 						Extents[5].ex_offset ==
1268 						Extents[6].ex_offset) && (i = 8)
1269 					    && (Extents[6].ex_length +
1270 						Extents[6].ex_offset ==
1271 						Extents[7].ex_offset) && (i = 9)
1272 					    && (Extents[7].ex_length +
1273 						Extents[7].ex_offset == off)
1274 					    && (i = 10)
1275 					    && (Extents[0].ex_type ==
1276 						DM_EXTENT_RES) && (i = 11)
1277 					    && (Extents[1].ex_type ==
1278 						DM_EXTENT_HOLE) && (i = 12)
1279 					    && (Extents[2].ex_type ==
1280 						DM_EXTENT_RES) && (i = 13)
1281 					    && (Extents[3].ex_type ==
1282 						DM_EXTENT_HOLE) && (i = 14)
1283 					    && (Extents[4].ex_type ==
1284 						DM_EXTENT_RES) && (i = 15)
1285 					    && (Extents[5].ex_type ==
1286 						DM_EXTENT_HOLE) && (i = 16)
1287 					    && (Extents[6].ex_type ==
1288 						DM_EXTENT_RES) && (i = 17)
1289 					    && (Extents[7].ex_type ==
1290 						DM_EXTENT_HOLE)
1291 					    ) {
1292 						DMLOG_PRINT(DMLVL_DEBUG,
1293 							    "%s extent information correct\n",
1294 							    szFuncName);
1295 
1296 						rc = dm_get_allocinfo(sid, hanp,
1297 								      hlen,
1298 								      DM_NO_TOKEN,
1299 								      &off,
1300 								      sizeof
1301 								      (bigExtents)
1302 								      /
1303 								      sizeof
1304 								      (dm_extent_t),
1305 								      bigExtents,
1306 								      &nelem);
1307 						DMLOG_PRINT(DMLVL_DEBUG,
1308 							    "second %s returned %d\n",
1309 							    szFuncName, rc);
1310 						if (rc == 0) {
1311 							DMLOG_PRINT(DMLVL_DEBUG,
1312 								    "  nelem = %d\n",
1313 								    nelem);
1314 							LogExtents(bigExtents,
1315 								   nelem);
1316 							if (bigExtents
1317 							    [nelem -
1318 							     1].ex_offset +
1319 							    bigExtents[nelem -
1320 								       1].
1321 							    ex_length ==
1322 							    TMP_FILELEN) {
1323 								DMLOG_PRINT
1324 								    (DMLVL_DEBUG,
1325 								     "second %s extent information correct\n",
1326 								     szFuncName);
1327 								DMVAR_PASS();
1328 							} else {
1329 								DMLOG_PRINT
1330 								    (DMLVL_ERR,
1331 								     "second %s extent information NOT correct!\n",
1332 								     szFuncName);
1333 								DMVAR_FAIL();
1334 							}
1335 						} else {
1336 							DMLOG_PRINT(DMLVL_ERR,
1337 								    "second %s failed with unexpected rc = %d (errno = %d)\n",
1338 								    szFuncName,
1339 								    rc, errno);
1340 							DMVAR_FAIL();
1341 						}
1342 					} else {
1343 						DMLOG_PRINT(DMLVL_ERR,
1344 							    "%s extent information NOT correct! (test %d failed)\n",
1345 							    szFuncName, i);
1346 						DMVAR_FAIL();
1347 					}
1348 				} else {
1349 					DMLOG_PRINT(DMLVL_ERR,
1350 						    "%s nelem NOT correct! (%d vs %d)\n",
1351 						    szFuncName, nelem, 3);
1352 					DMVAR_FAIL();
1353 				}
1354 			} else {
1355 				DMLOG_PRINT(DMLVL_ERR,
1356 					    "%s failed with unexpected rc = %d (errno = %d)\n",
1357 					    szFuncName, rc, errno);
1358 				DMVAR_FAIL();
1359 			}
1360 
1361 			/* Variation clean up */
1362 			rc = close(fd);
1363 			rc |= remove(DUMMY_FILE);
1364 			if (rc == -1) {
1365 				DMLOG_PRINT(DMLVL_DEBUG,
1366 					    "Unable to clean up variation! (errno = %d)\n",
1367 					    errno);
1368 			}
1369 			dm_handle_free(hanp, hlen);
1370 		}
1371 	}
1372 
1373 	/*
1374 	 * TEST    : dm_get_allocinfo - DM_NO_SESSION sid
1375 	 * EXPECTED: rc = -1, errno = EINVAL
1376 	 */
1377 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 19)) {
1378 		int fd;
1379 		void *hanp;
1380 		size_t hlen;
1381 		dm_off_t off = 0;
1382 		u_int nelem;
1383 
1384 		/* Variation set up */
1385 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1386 		if ((rc = system(command)) == -1) {
1387 			/* No clean up */
1388 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1389 			remove(DUMMY_FILE);
1390 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1391 			close(fd);
1392 			remove(DUMMY_FILE);
1393 		}
1394 		if (fd == -1 || rc == -1) {
1395 			DMLOG_PRINT(DMLVL_DEBUG,
1396 				    "Unable to set up variation! (errno = %d)\n",
1397 				    errno);
1398 			DMVAR_SKIP();
1399 		} else {
1400 			/* Variation */
1401 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
1402 				    szFuncName);
1403 			rc = dm_get_allocinfo(DM_NO_SESSION, hanp, hlen,
1404 					      DM_NO_TOKEN, &off, NUM_EXTENTS,
1405 					      Extents, &nelem);
1406 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
1407 
1408 			/* Variation clean up */
1409 			rc = close(fd);
1410 			rc |= remove(DUMMY_FILE);
1411 			if (rc == -1) {
1412 				DMLOG_PRINT(DMLVL_DEBUG,
1413 					    "Unable to clean up variation! (errno = %d)\n",
1414 					    errno);
1415 			}
1416 			dm_handle_free(hanp, hlen);
1417 		}
1418 	}
1419 
1420 	/*
1421 	 * TEST    : dm_get_allocinfo - fs handle
1422 	 * EXPECTED: rc = -1, errno = EINVAL
1423 	 */
1424 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 20)) {
1425 		void *hanp;
1426 		size_t hlen;
1427 		dm_off_t off = 0;
1428 		u_int nelem;
1429 
1430 		/* Variation set up */
1431 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
1432 			/* No clean up */
1433 		} else
1434 		    if ((rc =
1435 			 dm_path_to_fshandle(DUMMY_SUBDIR, &hanp,
1436 					     &hlen)) == -1) {
1437 			rmdir(DUMMY_SUBDIR);
1438 		}
1439 		if (rc == -1) {
1440 			DMLOG_PRINT(DMLVL_DEBUG,
1441 				    "Unable to set up variation! (errno = %d)\n",
1442 				    errno);
1443 			DMVAR_SKIP();
1444 		} else {
1445 			/* Variation */
1446 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
1447 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
1448 					      &off, NUM_EXTENTS, Extents,
1449 					      &nelem);
1450 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
1451 
1452 			/* Variation clean up */
1453 			rc = rmdir(DUMMY_SUBDIR);
1454 			if (rc == -1) {
1455 				DMLOG_PRINT(DMLVL_DEBUG,
1456 					    "Unable to clean up variation! (errno = %d)\n",
1457 					    errno);
1458 			}
1459 			dm_handle_free(hanp, hlen);
1460 		}
1461 	}
1462 
1463 	/*
1464 	 * TEST    : dm_get_allocinfo - global handle
1465 	 * EXPECTED: rc = -1, errno = EBADF
1466 	 */
1467 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 21)) {
1468 		dm_off_t off = 0;
1469 		u_int nelem;
1470 
1471 		/* Variation set up */
1472 
1473 		/* Variation */
1474 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
1475 		rc = dm_get_allocinfo(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
1476 				      DM_NO_TOKEN, &off, NUM_EXTENTS, Extents,
1477 				      &nelem);
1478 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
1479 
1480 		/* Variation clean up */
1481 	}
1482 
1483 	/*
1484 	 * TEST    : dm_get_allocinfo - invalidated hanp
1485 	 * EXPECTED: rc = -1, errno = EBADF
1486 	 */
1487 	if (DMVAR_EXEC(GET_ALLOCINFO_BASE + 22)) {
1488 		int fd;
1489 		void *hanp;
1490 		size_t hlen;
1491 		dm_off_t off = 0;
1492 		u_int nelem;
1493 
1494 		/* Variation set up */
1495 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1496 		if ((rc = system(command)) == -1) {
1497 			/* No clean up */
1498 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1499 			remove(DUMMY_FILE);
1500 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1501 			close(fd);
1502 			remove(DUMMY_FILE);
1503 		} else if ((rc = close(fd)) == -1) {
1504 			dm_handle_free(hanp, hlen);
1505 			remove(DUMMY_FILE);
1506 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
1507 			dm_handle_free(hanp, hlen);
1508 		}
1509 		if (fd == -1 || rc == -1) {
1510 			DMLOG_PRINT(DMLVL_DEBUG,
1511 				    "Unable to set up variation! (errno = %d)\n",
1512 				    errno);
1513 			DMVAR_SKIP();
1514 		} else {
1515 			/* Variation */
1516 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
1517 				    szFuncName);
1518 			rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN,
1519 					      &off, NUM_EXTENTS, Extents,
1520 					      &nelem);
1521 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
1522 
1523 			/* Variation clean up */
1524 			dm_handle_free(hanp, hlen);
1525 		}
1526 	}
1527 
1528 	szFuncName = "dm_probe_hole";
1529 
1530 	/*
1531 	 * TEST    : dm_probe_hole - invalid sid
1532 	 * EXPECTED: rc = -1, errno = EINVAL
1533 	 */
1534 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 1)) {
1535 		int fd;
1536 		void *hanp;
1537 		size_t hlen;
1538 		dm_off_t inoff = 0, outoff;
1539 		dm_size_t inlen = 0, outlen;
1540 
1541 		/* Variation set up */
1542 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1543 		if ((rc = system(command)) == -1) {
1544 			/* No clean up */
1545 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1546 			remove(DUMMY_FILE);
1547 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1548 			close(fd);
1549 			remove(DUMMY_FILE);
1550 		}
1551 		if (fd == -1 || rc == -1) {
1552 			DMLOG_PRINT(DMLVL_DEBUG,
1553 				    "Unable to set up variation! (errno = %d)\n",
1554 				    errno);
1555 			DMVAR_SKIP();
1556 		} else {
1557 			/* Variation */
1558 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
1559 				    szFuncName);
1560 			rc = dm_probe_hole(INVALID_ADDR, hanp, hlen,
1561 					   DM_NO_TOKEN, inoff, inlen, &outoff,
1562 					   &outlen);
1563 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
1564 
1565 			/* Variation clean up */
1566 			rc = close(fd);
1567 			rc |= remove(DUMMY_FILE);
1568 			if (rc == -1) {
1569 				DMLOG_PRINT(DMLVL_DEBUG,
1570 					    "Unable to clean up variation! (errno = %d)\n",
1571 					    errno);
1572 			}
1573 			dm_handle_free(hanp, hlen);
1574 		}
1575 	}
1576 
1577 	/*
1578 	 * TEST    : dm_probe_hole - invalid hanp
1579 	 * EXPECTED: rc = -1, errno = EFAULT
1580 	 */
1581 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 2)) {
1582 		int fd;
1583 		void *hanp;
1584 		size_t hlen;
1585 		dm_off_t inoff = 0, outoff;
1586 		dm_size_t inlen = 0, outlen;
1587 
1588 		/* Variation set up */
1589 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1590 		if ((rc = system(command)) == -1) {
1591 			/* No clean up */
1592 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1593 			remove(DUMMY_FILE);
1594 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1595 			close(fd);
1596 			remove(DUMMY_FILE);
1597 		}
1598 		if (fd == -1 || rc == -1) {
1599 			DMLOG_PRINT(DMLVL_DEBUG,
1600 				    "Unable to set up variation! (errno = %d)\n",
1601 				    errno);
1602 			DMVAR_SKIP();
1603 		} else {
1604 			/* Variation */
1605 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
1606 				    szFuncName);
1607 			rc = dm_probe_hole(sid, (void *)INVALID_ADDR, hlen,
1608 					   DM_NO_TOKEN, inoff, inlen, &outoff,
1609 					   &outlen);
1610 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
1611 
1612 			/* Variation clean up */
1613 			rc = close(fd);
1614 			rc |= remove(DUMMY_FILE);
1615 			if (rc == -1) {
1616 				DMLOG_PRINT(DMLVL_DEBUG,
1617 					    "Unable to clean up variation! (errno = %d)\n",
1618 					    errno);
1619 			}
1620 			dm_handle_free(hanp, hlen);
1621 		}
1622 	}
1623 
1624 	/*
1625 	 * TEST    : dm_probe_hole - directory handle
1626 	 * EXPECTED: rc = -1, errno = EINVAL
1627 	 */
1628 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 3)) {
1629 		void *hanp;
1630 		size_t hlen;
1631 		dm_off_t inoff = 0, outoff;
1632 		dm_size_t inlen = 0, outlen;
1633 
1634 		/* Variation set up */
1635 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
1636 			/* No clean up */
1637 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
1638 			   == -1) {
1639 			rmdir(DUMMY_SUBDIR);
1640 		}
1641 		if (rc == -1) {
1642 			DMLOG_PRINT(DMLVL_DEBUG,
1643 				    "Unable to set up variation! (errno = %d)\n",
1644 				    errno);
1645 			DMVAR_SKIP();
1646 		} else {
1647 			/* Variation */
1648 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
1649 				    szFuncName);
1650 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1651 					   inlen, &outoff, &outlen);
1652 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
1653 
1654 			/* Variation clean up */
1655 			rc = rmdir(DUMMY_SUBDIR);
1656 			if (rc == -1) {
1657 				DMLOG_PRINT(DMLVL_DEBUG,
1658 					    "Unable to clean up variation! (errno = %d)\n",
1659 					    errno);
1660 			}
1661 			dm_handle_free(hanp, hlen);
1662 		}
1663 	}
1664 
1665 	/*
1666 	 * TEST    : dm_probe_hole - invalid hlen
1667 	 * EXPECTED: rc = -1, errno = EBADF
1668 	 */
1669 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 4)) {
1670 		int fd;
1671 		void *hanp;
1672 		size_t hlen;
1673 		dm_off_t inoff = 0, outoff;
1674 		dm_size_t inlen = 0, outlen;
1675 
1676 		/* Variation set up */
1677 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1678 		if ((rc = system(command)) == -1) {
1679 			/* No clean up */
1680 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1681 			remove(DUMMY_FILE);
1682 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1683 			close(fd);
1684 			remove(DUMMY_FILE);
1685 		}
1686 		if (fd == -1 || rc == -1) {
1687 			DMLOG_PRINT(DMLVL_DEBUG,
1688 				    "Unable to set up variation! (errno = %d)\n",
1689 				    errno);
1690 			DMVAR_SKIP();
1691 		} else {
1692 			/* Variation */
1693 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
1694 				    szFuncName);
1695 			rc = dm_probe_hole(sid, hanp, INVALID_ADDR, DM_NO_TOKEN,
1696 					   inoff, inlen, &outoff, &outlen);
1697 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
1698 
1699 			/* Variation clean up */
1700 			rc = close(fd);
1701 			rc |= remove(DUMMY_FILE);
1702 			if (rc == -1) {
1703 				DMLOG_PRINT(DMLVL_DEBUG,
1704 					    "Unable to clean up variation! (errno = %d)\n",
1705 					    errno);
1706 			}
1707 			dm_handle_free(hanp, hlen);
1708 		}
1709 	}
1710 
1711 	/*
1712 	 * TEST    : dm_probe_hole - invalid token
1713 	 * EXPECTED: rc = -1, errno = EINVAL
1714 	 */
1715 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 5)) {
1716 		int fd;
1717 		void *hanp;
1718 		size_t hlen;
1719 		dm_off_t inoff = 0, outoff;
1720 		dm_size_t inlen = 0, outlen;
1721 
1722 		/* Variation set up */
1723 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1724 		if ((rc = system(command)) == -1) {
1725 			/* No clean up */
1726 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1727 			remove(DUMMY_FILE);
1728 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1729 			close(fd);
1730 			remove(DUMMY_FILE);
1731 		}
1732 		if (fd == -1 || rc == -1) {
1733 			DMLOG_PRINT(DMLVL_DEBUG,
1734 				    "Unable to set up variation! (errno = %d)\n",
1735 				    errno);
1736 			DMVAR_SKIP();
1737 		} else {
1738 			/* Variation */
1739 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
1740 				    szFuncName);
1741 			rc = dm_probe_hole(sid, hanp, hlen, INVALID_ADDR, inoff,
1742 					   inlen, &outoff, &outlen);
1743 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
1744 
1745 			/* Variation clean up */
1746 			rc = close(fd);
1747 			rc |= remove(DUMMY_FILE);
1748 			if (rc == -1) {
1749 				DMLOG_PRINT(DMLVL_DEBUG,
1750 					    "Unable to clean up variation! (errno = %d)\n",
1751 					    errno);
1752 			}
1753 			dm_handle_free(hanp, hlen);
1754 		}
1755 	}
1756 
1757 	/*
1758 	 * TEST    : dm_probe_hole - invalid off
1759 	 * EXPECTED: rc = -1, errno = E2BIG
1760 	 */
1761 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 6)) {
1762 		int fd;
1763 		void *hanp;
1764 		size_t hlen;
1765 		dm_off_t inoff = TMP_FILELEN + 1, outoff;
1766 		dm_size_t inlen = 0, outlen;
1767 
1768 		/* Variation set up */
1769 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1770 		if ((rc = system(command)) == -1) {
1771 			/* No clean up */
1772 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1773 			remove(DUMMY_FILE);
1774 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1775 			close(fd);
1776 			remove(DUMMY_FILE);
1777 		}
1778 		if (fd == -1 || rc == -1) {
1779 			DMLOG_PRINT(DMLVL_DEBUG,
1780 				    "Unable to set up variation! (errno = %d)\n",
1781 				    errno);
1782 			DMVAR_SKIP();
1783 		} else {
1784 			/* Variation */
1785 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid off)\n",
1786 				    szFuncName);
1787 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1788 					   inlen, &outoff, &outlen);
1789 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
1790 
1791 			/* Variation clean up */
1792 			rc = close(fd);
1793 			rc |= remove(DUMMY_FILE);
1794 			if (rc == -1) {
1795 				DMLOG_PRINT(DMLVL_DEBUG,
1796 					    "Unable to clean up variation! (errno = %d)\n",
1797 					    errno);
1798 			}
1799 			dm_handle_free(hanp, hlen);
1800 		}
1801 	}
1802 
1803 	/*
1804 	 * TEST    : dm_probe_hole - invalid len
1805 	 * EXPECTED: rc = -1, errno = E2BIG
1806 	 *
1807 	 * This variation uncovered XFS BUG #8 (0 returned instead of -1 and
1808 	 * errno E2BIG)
1809 	 */
1810 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 7)) {
1811 		int fd;
1812 		void *hanp;
1813 		size_t hlen;
1814 		dm_off_t inoff = 0, outoff;
1815 		dm_size_t inlen = TMP_FILELEN + 1, outlen;
1816 
1817 		/* Variation set up */
1818 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1819 		if ((rc = system(command)) == -1) {
1820 			/* No clean up */
1821 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1822 			remove(DUMMY_FILE);
1823 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1824 			close(fd);
1825 			remove(DUMMY_FILE);
1826 		}
1827 		if (fd == -1 || rc == -1) {
1828 			DMLOG_PRINT(DMLVL_DEBUG,
1829 				    "Unable to set up variation! (errno = %d)\n",
1830 				    errno);
1831 			DMVAR_SKIP();
1832 		} else {
1833 			/* Variation */
1834 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid len)\n",
1835 				    szFuncName);
1836 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1837 					   inlen, &outoff, &outlen);
1838 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
1839 
1840 			/* Variation clean up */
1841 			rc = close(fd);
1842 			rc |= remove(DUMMY_FILE);
1843 			if (rc == -1) {
1844 				DMLOG_PRINT(DMLVL_DEBUG,
1845 					    "Unable to clean up variation! (errno = %d)\n",
1846 					    errno);
1847 			}
1848 			dm_handle_free(hanp, hlen);
1849 		}
1850 	}
1851 
1852 	/*
1853 	 * TEST    : dm_probe_hole - invalid roffp
1854 	 * EXPECTED: rc = -1, errno = EFAULT
1855 	 */
1856 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 8)) {
1857 		int fd;
1858 		void *hanp;
1859 		size_t hlen;
1860 		dm_off_t inoff = 0;
1861 		dm_size_t inlen = 0, outlen;
1862 
1863 		/* Variation set up */
1864 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1865 		if ((rc = system(command)) == -1) {
1866 			/* No clean up */
1867 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1868 			remove(DUMMY_FILE);
1869 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1870 			close(fd);
1871 			remove(DUMMY_FILE);
1872 		}
1873 		if (fd == -1 || rc == -1) {
1874 			DMLOG_PRINT(DMLVL_DEBUG,
1875 				    "Unable to set up variation! (errno = %d)\n",
1876 				    errno);
1877 			DMVAR_SKIP();
1878 		} else {
1879 			/* Variation */
1880 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid roffp)\n",
1881 				    szFuncName);
1882 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1883 					   inlen, (dm_off_t *) INVALID_ADDR,
1884 					   &outlen);
1885 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
1886 
1887 			/* Variation clean up */
1888 			rc = close(fd);
1889 			rc |= remove(DUMMY_FILE);
1890 			if (rc == -1) {
1891 				DMLOG_PRINT(DMLVL_DEBUG,
1892 					    "Unable to clean up variation! (errno = %d)\n",
1893 					    errno);
1894 			}
1895 			dm_handle_free(hanp, hlen);
1896 		}
1897 	}
1898 
1899 	/*
1900 	 * TEST    : dm_probe_hole - invalid rlenp
1901 	 * EXPECTED: rc = -1, errno = EFAULT
1902 	 */
1903 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 9)) {
1904 		int fd;
1905 		void *hanp;
1906 		size_t hlen;
1907 		dm_off_t inoff = 0, outoff;
1908 		dm_size_t inlen = 0;
1909 
1910 		/* Variation set up */
1911 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1912 		if ((rc = system(command)) == -1) {
1913 			/* No clean up */
1914 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1915 			remove(DUMMY_FILE);
1916 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1917 			close(fd);
1918 			remove(DUMMY_FILE);
1919 		}
1920 		if (fd == -1 || rc == -1) {
1921 			DMLOG_PRINT(DMLVL_DEBUG,
1922 				    "Unable to set up variation! (errno = %d)\n",
1923 				    errno);
1924 			DMVAR_SKIP();
1925 		} else {
1926 			/* Variation */
1927 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n",
1928 				    szFuncName);
1929 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1930 					   inlen, &outoff,
1931 					   (dm_size_t *) INVALID_ADDR);
1932 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
1933 
1934 			/* Variation clean up */
1935 			rc = close(fd);
1936 			rc |= remove(DUMMY_FILE);
1937 			if (rc == -1) {
1938 				DMLOG_PRINT(DMLVL_DEBUG,
1939 					    "Unable to clean up variation! (errno = %d)\n",
1940 					    errno);
1941 			}
1942 			dm_handle_free(hanp, hlen);
1943 		}
1944 	}
1945 
1946 	/*
1947 	 * TEST    : dm_probe_hole - entire file
1948 	 * EXPECTED: rc = 0
1949 	 */
1950 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 10)) {
1951 		int fd;
1952 		void *hanp;
1953 		size_t hlen;
1954 		dm_off_t inoff = 0, outoff;
1955 		dm_size_t inlen = 0, outlen;
1956 
1957 		/* Variation set up */
1958 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
1959 		if ((rc = system(command)) == -1) {
1960 			/* No clean up */
1961 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
1962 			remove(DUMMY_FILE);
1963 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
1964 			close(fd);
1965 			remove(DUMMY_FILE);
1966 		}
1967 		if (fd == -1 || rc == -1) {
1968 			DMLOG_PRINT(DMLVL_DEBUG,
1969 				    "Unable to set up variation! (errno = %d)\n",
1970 				    errno);
1971 			DMVAR_SKIP();
1972 		} else {
1973 			/* Variation */
1974 			DMLOG_PRINT(DMLVL_DEBUG, "%s(entire file)\n",
1975 				    szFuncName);
1976 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
1977 					   inlen, &outoff, &outlen);
1978 			if (rc == 0) {
1979 				DMLOG_PRINT(DMLVL_DEBUG,
1980 					    "In -> offset %lld, length %lld\n",
1981 					    inoff, inlen);
1982 				DMLOG_PRINT(DMLVL_DEBUG,
1983 					    "Out <- offset %lld, length %lld\n",
1984 					    outoff, outlen);
1985 				if (outoff == inoff) {
1986 					if (outlen == inlen) {
1987 						DMLOG_PRINT(DMLVL_DEBUG,
1988 							    "%s passed with expected rc %d\n",
1989 							    szFuncName, rc);
1990 						DMVAR_PASS();
1991 					} else {
1992 						DMLOG_PRINT(DMLVL_ERR,
1993 							    "%s failed with expected rc %d but unexpected outlen (%d vs %d)\n",
1994 							    szFuncName, rc,
1995 							    outlen, inlen);
1996 						DMVAR_FAIL();
1997 					}
1998 				} else {
1999 					DMLOG_PRINT(DMLVL_ERR,
2000 						    "%s failed with expected rc %d but unexpected outoff (%d vs %d)\n",
2001 						    szFuncName, rc, outoff,
2002 						    inoff);
2003 					DMVAR_FAIL();
2004 				}
2005 			} else {
2006 				DMLOG_PRINT(DMLVL_ERR,
2007 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2008 					    szFuncName, rc, errno);
2009 				DMVAR_FAIL();
2010 			}
2011 
2012 			/* Variation clean up */
2013 			rc = close(fd);
2014 			rc |= remove(DUMMY_FILE);
2015 			if (rc == -1) {
2016 				DMLOG_PRINT(DMLVL_DEBUG,
2017 					    "Unable to clean up variation! (errno = %d)\n",
2018 					    errno);
2019 			}
2020 			dm_handle_free(hanp, hlen);
2021 		}
2022 	}
2023 
2024 	/*
2025 	 * TEST    : dm_probe_hole - end of file without rounding
2026 	 * EXPECTED: rc = 0
2027 	 */
2028 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 11)) {
2029 		int fd;
2030 		void *hanp;
2031 		size_t hlen;
2032 		dm_off_t inoff = BLKALIGN(UNALIGNED_BLK_OFF), outoff;
2033 		dm_size_t inlen = 0, outlen;
2034 
2035 		/* Variation set up */
2036 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2037 		if ((rc = system(command)) == -1) {
2038 			/* No clean up */
2039 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2040 			remove(DUMMY_FILE);
2041 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2042 			close(fd);
2043 			remove(DUMMY_FILE);
2044 		}
2045 		if (fd == -1 || rc == -1) {
2046 			DMLOG_PRINT(DMLVL_DEBUG,
2047 				    "Unable to set up variation! (errno = %d)\n",
2048 				    errno);
2049 			DMVAR_SKIP();
2050 		} else {
2051 			/* Variation */
2052 			DMLOG_PRINT(DMLVL_DEBUG,
2053 				    "%s(end of file without rounding)\n",
2054 				    szFuncName);
2055 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2056 					   inlen, &outoff, &outlen);
2057 			if (rc == 0) {
2058 				DMLOG_PRINT(DMLVL_DEBUG,
2059 					    "In -> offset %lld, length %lld\n",
2060 					    inoff, inlen);
2061 				DMLOG_PRINT(DMLVL_DEBUG,
2062 					    "Out <- offset %lld, length %lld\n",
2063 					    outoff, outlen);
2064 				if (outoff == inoff) {
2065 					if (outlen == inlen) {
2066 						DMLOG_PRINT(DMLVL_DEBUG,
2067 							    "%s passed with expected rc %d\n",
2068 							    szFuncName, rc);
2069 						DMVAR_PASS();
2070 					} else {
2071 						DMLOG_PRINT(DMLVL_ERR,
2072 							    "%s failed with expected rc %d but unexpected outlen (%d vs %d)\n",
2073 							    szFuncName, rc,
2074 							    outlen, inlen);
2075 						DMVAR_FAIL();
2076 					}
2077 				} else {
2078 					DMLOG_PRINT(DMLVL_ERR,
2079 						    "%s failed with expected rc %d but unexpected outoff (%d vs %d)\n",
2080 						    szFuncName, rc, outoff,
2081 						    inoff);
2082 					DMVAR_FAIL();
2083 				}
2084 			} else {
2085 				DMLOG_PRINT(DMLVL_ERR,
2086 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2087 					    szFuncName, rc, errno);
2088 				DMVAR_FAIL();
2089 			}
2090 
2091 			/* Variation clean up */
2092 			rc = close(fd);
2093 			rc |= remove(DUMMY_FILE);
2094 			if (rc == -1) {
2095 				DMLOG_PRINT(DMLVL_DEBUG,
2096 					    "Unable to clean up variation! (errno = %d)\n",
2097 					    errno);
2098 			}
2099 			dm_handle_free(hanp, hlen);
2100 		}
2101 	}
2102 
2103 	/*
2104 	 * TEST    : dm_probe_hole - end of file with rounding
2105 	 * EXPECTED: rc = 0
2106 	 */
2107 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 12)) {
2108 		int fd;
2109 		void *hanp;
2110 		size_t hlen;
2111 		dm_off_t inoff = UNALIGNED_BLK_OFF, outoff;
2112 		dm_size_t inlen = TMP_FILELEN - UNALIGNED_BLK_OFF, outlen;
2113 
2114 		/* Variation set up */
2115 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2116 		if ((rc = system(command)) == -1) {
2117 			/* No clean up */
2118 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2119 			remove(DUMMY_FILE);
2120 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2121 			close(fd);
2122 			remove(DUMMY_FILE);
2123 		}
2124 		if (fd == -1 || rc == -1) {
2125 			DMLOG_PRINT(DMLVL_DEBUG,
2126 				    "Unable to set up variation! (errno = %d)\n",
2127 				    errno);
2128 			DMVAR_SKIP();
2129 		} else {
2130 			/* Variation */
2131 			DMLOG_PRINT(DMLVL_DEBUG,
2132 				    "%s(end of file with rounding)\n",
2133 				    szFuncName);
2134 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2135 					   inlen, &outoff, &outlen);
2136 			if (rc == 0) {
2137 				DMLOG_PRINT(DMLVL_DEBUG,
2138 					    "In -> offset %lld, length %lld\n",
2139 					    inoff, inlen);
2140 				DMLOG_PRINT(DMLVL_DEBUG,
2141 					    "Out <- offset %lld, length %lld\n",
2142 					    outoff, outlen);
2143 				if ((outoff >= inoff)
2144 				    && (!(outoff & (BLK_SIZE - 1)))) {
2145 					if (outlen == 0) {
2146 						DMLOG_PRINT(DMLVL_DEBUG,
2147 							    "%s passed with expected rc %d\n",
2148 							    szFuncName, rc);
2149 						DMVAR_PASS();
2150 					} else {
2151 						DMLOG_PRINT(DMLVL_ERR,
2152 							    "%s failed with expected rc %d but unexpected outlen (%d vs %d)\n",
2153 							    szFuncName, rc,
2154 							    outlen, 0);
2155 						DMVAR_FAIL();
2156 					}
2157 				} else {
2158 					DMLOG_PRINT(DMLVL_ERR,
2159 						    "%s failed with expected rc %d but unexpected outoff %d\n",
2160 						    szFuncName, rc, outoff);
2161 					DMVAR_FAIL();
2162 				}
2163 			} else {
2164 				DMLOG_PRINT(DMLVL_ERR,
2165 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2166 					    szFuncName, rc, errno);
2167 				DMVAR_FAIL();
2168 			}
2169 
2170 			/* Variation clean up */
2171 			rc = close(fd);
2172 			rc |= remove(DUMMY_FILE);
2173 			if (rc == -1) {
2174 				DMLOG_PRINT(DMLVL_DEBUG,
2175 					    "Unable to clean up variation! (errno = %d)\n",
2176 					    errno);
2177 			}
2178 			dm_handle_free(hanp, hlen);
2179 		}
2180 	}
2181 
2182 	/*
2183 	 * TEST    : dm_probe_hole - middle of file without rounding
2184 	 * EXPECTED: rc = 0
2185 	 */
2186 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 13)) {
2187 #ifdef INTERIOR_HOLES
2188 		int fd;
2189 		void *hanp;
2190 		size_t hlen;
2191 		dm_off_t inoff = BLKALIGN(UNALIGNED_BLK_OFF), outoff;
2192 		dm_size_t inlen =
2193 		    BLKALIGN(TMP_FILELEN - BLK_SIZE - UNALIGNED_BLK_OFF),
2194 		    outlen;
2195 
2196 		/* Variation set up */
2197 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2198 		if ((rc = system(command)) == -1) {
2199 			/* No clean up */
2200 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2201 			remove(DUMMY_FILE);
2202 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2203 			close(fd);
2204 			remove(DUMMY_FILE);
2205 		}
2206 		if (fd == -1 || rc == -1) {
2207 			DMLOG_PRINT(DMLVL_DEBUG,
2208 				    "Unable to set up variation! (errno = %d)\n",
2209 				    errno);
2210 			DMVAR_SKIP();
2211 		} else {
2212 			/* Variation */
2213 			DMLOG_PRINT(DMLVL_DEBUG,
2214 				    "%s(middle of file without rounding)\n",
2215 				    szFuncName);
2216 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2217 					   inlen, &outoff, &outlen);
2218 			if (rc == 0) {
2219 				DMLOG_PRINT(DMLVL_DEBUG,
2220 					    "In -> offset %lld, length %lld\n",
2221 					    inoff, inlen);
2222 				DMLOG_PRINT(DMLVL_DEBUG,
2223 					    "Out <- offset %lld, length %lld\n",
2224 					    outoff, outlen);
2225 				if (outoff == inoff) {
2226 					if (outlen == inlen) {
2227 						DMLOG_PRINT(DMLVL_DEBUG,
2228 							    "%s passed with expected rc %d\n",
2229 							    szFuncName, rc);
2230 						DMVAR_PASS();
2231 					} else {
2232 						DMLOG_PRINT(DMLVL_ERR,
2233 							    "%s failed with expected rc %d but unexpected outlen (%d vs %d)\n",
2234 							    szFuncName, rc,
2235 							    outlen, inlen);
2236 						DMVAR_FAIL();
2237 					}
2238 				} else {
2239 					DMLOG_PRINT(DMLVL_ERR,
2240 						    "%s failed with expected rc %d but unexpected outoff (%d vs %d)\n",
2241 						    szFuncName, rc, outoff,
2242 						    inoff);
2243 					DMVAR_FAIL();
2244 				}
2245 			} else {
2246 				DMLOG_PRINT(DMLVL_ERR,
2247 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2248 					    szFuncName, rc, errno);
2249 				DMVAR_FAIL();
2250 			}
2251 
2252 			/* Variation clean up */
2253 			rc = close(fd);
2254 			rc |= remove(DUMMY_FILE);
2255 			if (rc == -1) {
2256 				DMLOG_PRINT(DMLVL_DEBUG,
2257 					    "Unable to clean up variation! (errno = %d)\n",
2258 					    errno);
2259 			}
2260 			dm_handle_free(hanp, hlen);
2261 		}
2262 #else
2263 		DMLOG_PRINT(DMLVL_WARN,
2264 			    "Test case not built with INTERIOR_HOLES defined\n");
2265 		DMVAR_SKIP();
2266 #endif
2267 	}
2268 
2269 	/*
2270 	 * TEST    : dm_probe_hole - middle of file with rounding, large
2271 	 * EXPECTED: rc = 0
2272 	 */
2273 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 14)) {
2274 #ifdef INTERIOR_HOLES
2275 		int fd;
2276 		void *hanp;
2277 		size_t hlen;
2278 		dm_off_t inoff = UNALIGNED_BLK_OFF, outoff;
2279 		dm_size_t inlen =
2280 		    TMP_FILELEN - BLK_SIZE - UNALIGNED_BLK_OFF, outlen;
2281 
2282 		/* Variation set up */
2283 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2284 		if ((rc = system(command)) == -1) {
2285 			/* No clean up */
2286 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2287 			remove(DUMMY_FILE);
2288 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2289 			close(fd);
2290 			remove(DUMMY_FILE);
2291 		}
2292 		if (fd == -1 || rc == -1) {
2293 			DMLOG_PRINT(DMLVL_DEBUG,
2294 				    "Unable to set up variation! (errno = %d)\n",
2295 				    errno);
2296 			DMVAR_SKIP();
2297 		} else {
2298 			/* Variation */
2299 			DMLOG_PRINT(DMLVL_DEBUG,
2300 				    "%s(middle of file with rounding, large)\n",
2301 				    szFuncName);
2302 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2303 					   inlen, &outoff, &outlen);
2304 			if (rc == 0) {
2305 				DMLOG_PRINT(DMLVL_DEBUG,
2306 					    "In -> offset %lld, length %lld\n",
2307 					    inoff, inlen);
2308 				DMLOG_PRINT(DMLVL_DEBUG,
2309 					    "Out <- offset %lld, length %lld\n",
2310 					    outoff, outlen);
2311 				if ((outoff >= inoff)
2312 				    && (!(outoff & (BLK_SIZE - 1)))) {
2313 					if ((outlen <= inlen)
2314 					    && (!(outlen & (BLK_SIZE - 1)))) {
2315 						DMLOG_PRINT(DMLVL_DEBUG,
2316 							    "%s passed with expected rc %d\n",
2317 							    szFuncName, rc);
2318 						DMVAR_PASS();
2319 					} else {
2320 						DMLOG_PRINT(DMLVL_ERR,
2321 							    "%s failed with expected rc %d but unexpected outlen %d\n",
2322 							    szFuncName, rc,
2323 							    outlen);
2324 						DMVAR_FAIL();
2325 					}
2326 				} else {
2327 					DMLOG_PRINT(DMLVL_ERR,
2328 						    "%s failed with expected rc %d but unexpected outoff %d\n",
2329 						    szFuncName, rc, outoff);
2330 					DMVAR_FAIL();
2331 				}
2332 			} else {
2333 				DMLOG_PRINT(DMLVL_ERR,
2334 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2335 					    szFuncName, rc, errno);
2336 				DMVAR_FAIL();
2337 			}
2338 
2339 			/* Variation clean up */
2340 			rc = close(fd);
2341 			rc |= remove(DUMMY_FILE);
2342 			if (rc == -1) {
2343 				DMLOG_PRINT(DMLVL_DEBUG,
2344 					    "Unable to clean up variation! (errno = %d)\n",
2345 					    errno);
2346 			}
2347 			dm_handle_free(hanp, hlen);
2348 		}
2349 #else
2350 		DMLOG_PRINT(DMLVL_WARN,
2351 			    "Test case not built with INTERIOR_HOLES defined\n");
2352 		DMVAR_SKIP();
2353 #endif
2354 	}
2355 
2356 	/*
2357 	 * TEST    : dm_probe_hole - middle of file with rounding, small
2358 	 * EXPECTED: rc = 0
2359 	 */
2360 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 15)) {
2361 #ifdef INTERIOR_HOLES
2362 		int fd;
2363 		void *hanp;
2364 		size_t hlen;
2365 		dm_off_t inoff = TMP_FILELEN / 2 - BLK_SIZE, outoff;
2366 		dm_size_t inlen = 5 * BLK_SIZE, outlen;
2367 
2368 		/* Variation set up */
2369 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2370 		if ((rc = system(command)) == -1) {
2371 			/* No clean up */
2372 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2373 			remove(DUMMY_FILE);
2374 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2375 			close(fd);
2376 			remove(DUMMY_FILE);
2377 		}
2378 		if (fd == -1 || rc == -1) {
2379 			DMLOG_PRINT(DMLVL_DEBUG,
2380 				    "Unable to set up variation! (errno = %d)\n",
2381 				    errno);
2382 			DMVAR_SKIP();
2383 		} else {
2384 			/* Variation */
2385 			DMLOG_PRINT(DMLVL_DEBUG,
2386 				    "%s(middle of file with rounding, small)\n",
2387 				    szFuncName);
2388 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2389 					   inlen, &outoff, &outlen);
2390 			if (rc == 0) {
2391 				DMLOG_PRINT(DMLVL_DEBUG,
2392 					    "In -> offset %lld, length %lld\n",
2393 					    inoff, inlen);
2394 				DMLOG_PRINT(DMLVL_DEBUG,
2395 					    "Out <- offset %lld, length %lld\n",
2396 					    outoff, outlen);
2397 				if ((outoff >= inoff)
2398 				    && (!(outoff & (BLK_SIZE - 1)))) {
2399 					if ((outlen <= inlen)
2400 					    && (!(outlen & (BLK_SIZE - 1)))) {
2401 						DMLOG_PRINT(DMLVL_DEBUG,
2402 							    "%s passed with expected rc %d\n",
2403 							    szFuncName, rc);
2404 						DMVAR_PASS();
2405 					} else {
2406 						DMLOG_PRINT(DMLVL_ERR,
2407 							    "%s failed with expected rc %d but unexpected outlen %d\n",
2408 							    szFuncName, rc,
2409 							    outlen);
2410 						DMVAR_FAIL();
2411 					}
2412 				} else {
2413 					DMLOG_PRINT(DMLVL_ERR,
2414 						    "%s failed with expected rc %d but unexpected outoff %d\n",
2415 						    szFuncName, rc, outoff);
2416 					DMVAR_FAIL();
2417 				}
2418 			} else {
2419 				DMLOG_PRINT(DMLVL_ERR,
2420 					    "%s failed with unexpected rc = %d (errno = %d)\n",
2421 					    szFuncName, rc, errno);
2422 				DMVAR_FAIL();
2423 			}
2424 
2425 			/* Variation clean up */
2426 			rc = close(fd);
2427 			rc |= remove(DUMMY_FILE);
2428 			if (rc == -1) {
2429 				DMLOG_PRINT(DMLVL_DEBUG,
2430 					    "Unable to clean up variation! (errno = %d)\n",
2431 					    errno);
2432 			}
2433 			dm_handle_free(hanp, hlen);
2434 		}
2435 #else
2436 		DMLOG_PRINT(DMLVL_WARN,
2437 			    "Test case not built with INTERIOR_HOLES defined\n");
2438 		DMVAR_SKIP();
2439 #endif
2440 	}
2441 
2442 	/*
2443 	 * TEST    : dm_probe_hole - middle of file with rounding, no hole
2444 	 * EXPECTED: rc = -1, errno = EINVAL
2445 	 */
2446 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 16)) {
2447 #ifdef INTERIOR_HOLES
2448 		int fd;
2449 		void *hanp;
2450 		size_t hlen;
2451 		dm_off_t inoff =
2452 		    ((TMP_FILELEN / 2) & ~(BLK_SIZE - 1)) + 1, outoff;
2453 		dm_size_t inlen = BLK_SIZE, outlen;
2454 
2455 		/* Variation set up */
2456 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2457 		if ((rc = system(command)) == -1) {
2458 			/* No clean up */
2459 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2460 			remove(DUMMY_FILE);
2461 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2462 			close(fd);
2463 			remove(DUMMY_FILE);
2464 		}
2465 		if (fd == -1 || rc == -1) {
2466 			DMLOG_PRINT(DMLVL_DEBUG,
2467 				    "Unable to set up variation! (errno = %d)\n",
2468 				    errno);
2469 			DMVAR_SKIP();
2470 		} else {
2471 			/* Variation */
2472 			DMLOG_PRINT(DMLVL_DEBUG,
2473 				    "%s(middle of file with rounding, no hole)\n",
2474 				    szFuncName);
2475 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2476 					   inlen, &outoff, &outlen);
2477 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2478 
2479 			/* Variation clean up */
2480 			rc = close(fd);
2481 			rc |= remove(DUMMY_FILE);
2482 			if (rc == -1) {
2483 				DMLOG_PRINT(DMLVL_DEBUG,
2484 					    "Unable to clean up variation! (errno = %d)\n",
2485 					    errno);
2486 			}
2487 			dm_handle_free(hanp, hlen);
2488 		}
2489 #else
2490 		DMLOG_PRINT(DMLVL_WARN,
2491 			    "Test case not built with INTERIOR_HOLES defined\n");
2492 		DMVAR_SKIP();
2493 #endif
2494 	}
2495 
2496 	/*
2497 	 * TEST    : dm_probe_hole - DM_NO_SESSION sid
2498 	 * EXPECTED: rc = -1, errno = EINVAL
2499 	 */
2500 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 17)) {
2501 		int fd;
2502 		void *hanp;
2503 		size_t hlen;
2504 		dm_off_t inoff = 0, outoff;
2505 		dm_size_t inlen = 0, outlen;
2506 
2507 		/* Variation set up */
2508 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2509 		if ((rc = system(command)) == -1) {
2510 			/* No clean up */
2511 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2512 			remove(DUMMY_FILE);
2513 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2514 			close(fd);
2515 			remove(DUMMY_FILE);
2516 		}
2517 		if (fd == -1 || rc == -1) {
2518 			DMLOG_PRINT(DMLVL_DEBUG,
2519 				    "Unable to set up variation! (errno = %d)\n",
2520 				    errno);
2521 			DMVAR_SKIP();
2522 		} else {
2523 			/* Variation */
2524 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
2525 				    szFuncName);
2526 			rc = dm_probe_hole(DM_NO_SESSION, hanp, hlen,
2527 					   DM_NO_TOKEN, inoff, inlen, &outoff,
2528 					   &outlen);
2529 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2530 
2531 			/* Variation clean up */
2532 			rc = close(fd);
2533 			rc |= remove(DUMMY_FILE);
2534 			if (rc == -1) {
2535 				DMLOG_PRINT(DMLVL_DEBUG,
2536 					    "Unable to clean up variation! (errno = %d)\n",
2537 					    errno);
2538 			}
2539 			dm_handle_free(hanp, hlen);
2540 		}
2541 	}
2542 
2543 	/*
2544 	 * TEST    : dm_probe_hole - fs handle
2545 	 * EXPECTED: rc = -1, errno = EINVAL
2546 	 */
2547 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 18)) {
2548 		void *hanp;
2549 		size_t hlen;
2550 		dm_off_t inoff = 0, outoff;
2551 		dm_size_t inlen = 0, outlen;
2552 
2553 		/* Variation set up */
2554 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
2555 			/* No clean up */
2556 		} else
2557 		    if ((rc =
2558 			 dm_path_to_fshandle(DUMMY_SUBDIR, &hanp,
2559 					     &hlen)) == -1) {
2560 			rmdir(DUMMY_SUBDIR);
2561 		}
2562 		if (rc == -1) {
2563 			DMLOG_PRINT(DMLVL_DEBUG,
2564 				    "Unable to set up variation! (errno = %d)\n",
2565 				    errno);
2566 			DMVAR_SKIP();
2567 		} else {
2568 			/* Variation */
2569 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
2570 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2571 					   inlen, &outoff, &outlen);
2572 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2573 
2574 			/* Variation clean up */
2575 			rc = rmdir(DUMMY_SUBDIR);
2576 			if (rc == -1) {
2577 				DMLOG_PRINT(DMLVL_DEBUG,
2578 					    "Unable to clean up variation! (errno = %d)\n",
2579 					    errno);
2580 			}
2581 			dm_handle_free(hanp, hlen);
2582 		}
2583 	}
2584 
2585 	/*
2586 	 * TEST    : dm_probe_hole - global handle
2587 	 * EXPECTED: rc = -1, errno = EBADF
2588 	 */
2589 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 19)) {
2590 		dm_off_t inoff = 0, outoff;
2591 		dm_size_t inlen = 0, outlen;
2592 
2593 		/* Variation set up */
2594 
2595 		/* Variation */
2596 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
2597 		rc = dm_probe_hole(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
2598 				   DM_NO_TOKEN, inoff, inlen, &outoff, &outlen);
2599 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
2600 
2601 		/* Variation clean up */
2602 	}
2603 
2604 	/*
2605 	 * TEST    : dm_probe_hole - invalidated hanp
2606 	 * EXPECTED: rc = -1, errno = EBADF
2607 	 */
2608 	if (DMVAR_EXEC(PROBE_HOLE_BASE + 20)) {
2609 		int fd;
2610 		void *hanp;
2611 		size_t hlen;
2612 		dm_off_t inoff = 0, outoff;
2613 		dm_size_t inlen = 0, outlen;
2614 
2615 		/* Variation set up */
2616 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2617 		if ((rc = system(command)) == -1) {
2618 			/* No clean up */
2619 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2620 			remove(DUMMY_FILE);
2621 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2622 			close(fd);
2623 			remove(DUMMY_FILE);
2624 		} else if ((rc = close(fd)) == -1) {
2625 			dm_handle_free(hanp, hlen);
2626 			remove(DUMMY_FILE);
2627 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
2628 			dm_handle_free(hanp, hlen);
2629 		}
2630 		if (fd == -1 || rc == -1) {
2631 			DMLOG_PRINT(DMLVL_DEBUG,
2632 				    "Unable to set up variation! (errno = %d)\n",
2633 				    errno);
2634 			DMVAR_SKIP();
2635 		} else {
2636 			/* Variation */
2637 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
2638 				    szFuncName);
2639 			rc = dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, inoff,
2640 					   inlen, &outoff, &outlen);
2641 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
2642 
2643 			/* Variation clean up */
2644 			dm_handle_free(hanp, hlen);
2645 		}
2646 	}
2647 
2648 	szFuncName = "dm_punch_hole";
2649 
2650 	/*
2651 	 * TEST    : dm_punch_hole - invalid sid
2652 	 * EXPECTED: rc = -1, errno = EINVAL
2653 	 */
2654 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 1)) {
2655 		int fd;
2656 		void *hanp;
2657 		size_t hlen;
2658 		dm_off_t off = 0;
2659 		dm_size_t len = 0;
2660 
2661 		/* Variation set up */
2662 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2663 		if ((rc = system(command)) == -1) {
2664 			/* No clean up */
2665 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2666 			remove(DUMMY_FILE);
2667 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2668 			close(fd);
2669 			remove(DUMMY_FILE);
2670 		}
2671 		if (fd == -1 || rc == -1) {
2672 			DMLOG_PRINT(DMLVL_DEBUG,
2673 				    "Unable to set up variation! (errno = %d)\n",
2674 				    errno);
2675 			DMVAR_SKIP();
2676 		} else {
2677 			/* Variation */
2678 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
2679 				    szFuncName);
2680 			rc = dm_punch_hole(INVALID_ADDR, hanp, hlen,
2681 					   DM_NO_TOKEN, off, len);
2682 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2683 
2684 			/* Variation clean up */
2685 			rc = close(fd);
2686 			rc |= remove(DUMMY_FILE);
2687 			if (rc == -1) {
2688 				DMLOG_PRINT(DMLVL_DEBUG,
2689 					    "Unable to clean up variation! (errno = %d)\n",
2690 					    errno);
2691 			}
2692 			dm_handle_free(hanp, hlen);
2693 		}
2694 	}
2695 
2696 	/*
2697 	 * TEST    : dm_punch_hole - invalid hanp
2698 	 * EXPECTED: rc = -1, errno = EFAULT
2699 	 */
2700 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 2)) {
2701 		int fd;
2702 		void *hanp;
2703 		size_t hlen;
2704 		dm_off_t off = 0;
2705 		dm_size_t len = 0;
2706 
2707 		/* Variation set up */
2708 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2709 		if ((rc = system(command)) == -1) {
2710 			/* No clean up */
2711 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2712 			remove(DUMMY_FILE);
2713 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2714 			close(fd);
2715 			remove(DUMMY_FILE);
2716 		}
2717 		if (fd == -1 || rc == -1) {
2718 			DMLOG_PRINT(DMLVL_DEBUG,
2719 				    "Unable to set up variation! (errno = %d)\n",
2720 				    errno);
2721 			DMVAR_SKIP();
2722 		} else {
2723 			/* Variation */
2724 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
2725 				    szFuncName);
2726 			rc = dm_punch_hole(sid, (void *)INVALID_ADDR, hlen,
2727 					   DM_NO_TOKEN, off, len);
2728 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
2729 
2730 			/* Variation clean up */
2731 			rc = close(fd);
2732 			rc |= remove(DUMMY_FILE);
2733 			if (rc == -1) {
2734 				DMLOG_PRINT(DMLVL_DEBUG,
2735 					    "Unable to clean up variation! (errno = %d)\n",
2736 					    errno);
2737 			}
2738 			dm_handle_free(hanp, hlen);
2739 		}
2740 	}
2741 
2742 	/*
2743 	 * TEST    : dm_punch_hole - directory handle
2744 	 * EXPECTED: rc = -1, errno = EINVAL
2745 	 */
2746 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 3)) {
2747 		void *hanp;
2748 		size_t hlen;
2749 		dm_off_t off = 0;
2750 		dm_size_t len = 0;
2751 
2752 		/* Variation set up */
2753 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
2754 			/* No clean up */
2755 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
2756 			   == -1) {
2757 			rmdir(DUMMY_SUBDIR);
2758 		}
2759 		if (rc == -1) {
2760 			DMLOG_PRINT(DMLVL_DEBUG,
2761 				    "Unable to set up variation! (errno = %d)\n",
2762 				    errno);
2763 			DMVAR_SKIP();
2764 		} else {
2765 			/* Variation */
2766 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
2767 				    szFuncName);
2768 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
2769 					   len);
2770 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2771 
2772 			/* Variation clean up */
2773 			rc = rmdir(DUMMY_SUBDIR);
2774 			if (rc == -1) {
2775 				DMLOG_PRINT(DMLVL_DEBUG,
2776 					    "Unable to clean up variation! (errno = %d)\n",
2777 					    errno);
2778 			}
2779 			dm_handle_free(hanp, hlen);
2780 		}
2781 	}
2782 
2783 	/*
2784 	 * TEST    : dm_punch_hole - invalid hlen
2785 	 * EXPECTED: rc = -1, errno = EBADF
2786 	 */
2787 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 4)) {
2788 		int fd;
2789 		void *hanp;
2790 		size_t hlen;
2791 		dm_off_t off = 0;
2792 		dm_size_t len = 0;
2793 
2794 		/* Variation set up */
2795 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2796 		if ((rc = system(command)) == -1) {
2797 			/* No clean up */
2798 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2799 			remove(DUMMY_FILE);
2800 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2801 			close(fd);
2802 			remove(DUMMY_FILE);
2803 		}
2804 		if (fd == -1 || rc == -1) {
2805 			DMLOG_PRINT(DMLVL_DEBUG,
2806 				    "Unable to set up variation! (errno = %d)\n",
2807 				    errno);
2808 			DMVAR_SKIP();
2809 		} else {
2810 			/* Variation */
2811 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
2812 				    szFuncName);
2813 			rc = dm_punch_hole(sid, hanp, INVALID_ADDR, DM_NO_TOKEN,
2814 					   off, len);
2815 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
2816 
2817 			/* Variation clean up */
2818 			rc = close(fd);
2819 			rc |= remove(DUMMY_FILE);
2820 			if (rc == -1) {
2821 				DMLOG_PRINT(DMLVL_DEBUG,
2822 					    "Unable to clean up variation! (errno = %d)\n",
2823 					    errno);
2824 			}
2825 			dm_handle_free(hanp, hlen);
2826 		}
2827 	}
2828 
2829 	/*
2830 	 * TEST    : dm_punch_hole - invalid token
2831 	 * EXPECTED: rc = -1, errno = EINVAL
2832 	 */
2833 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 5)) {
2834 		int fd;
2835 		void *hanp;
2836 		size_t hlen;
2837 		dm_off_t off = 0;
2838 		dm_size_t len = 0;
2839 
2840 		/* Variation set up */
2841 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2842 		if ((rc = system(command)) == -1) {
2843 			/* No clean up */
2844 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2845 			remove(DUMMY_FILE);
2846 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2847 			close(fd);
2848 			remove(DUMMY_FILE);
2849 		}
2850 		if (fd == -1 || rc == -1) {
2851 			DMLOG_PRINT(DMLVL_DEBUG,
2852 				    "Unable to set up variation! (errno = %d)\n",
2853 				    errno);
2854 			DMVAR_SKIP();
2855 		} else {
2856 			/* Variation */
2857 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
2858 				    szFuncName);
2859 			rc = dm_punch_hole(sid, hanp, hlen, INVALID_ADDR, off,
2860 					   len);
2861 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
2862 
2863 			/* Variation clean up */
2864 			rc = close(fd);
2865 			rc |= remove(DUMMY_FILE);
2866 			if (rc == -1) {
2867 				DMLOG_PRINT(DMLVL_DEBUG,
2868 					    "Unable to clean up variation! (errno = %d)\n",
2869 					    errno);
2870 			}
2871 			dm_handle_free(hanp, hlen);
2872 		}
2873 	}
2874 
2875 	/*
2876 	 * TEST    : dm_punch_hole - invalid off
2877 	 * EXPECTED: rc = -1, errno = E2BIG
2878 	 */
2879 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 6)) {
2880 		int fd;
2881 		void *hanp;
2882 		size_t hlen;
2883 		dm_off_t off = TMP_FILELEN + 1;
2884 		dm_size_t len = 0;
2885 
2886 		/* Variation set up */
2887 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2888 		if ((rc = system(command)) == -1) {
2889 			/* No clean up */
2890 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2891 			remove(DUMMY_FILE);
2892 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2893 			close(fd);
2894 			remove(DUMMY_FILE);
2895 		}
2896 		if (fd == -1 || rc == -1) {
2897 			DMLOG_PRINT(DMLVL_DEBUG,
2898 				    "Unable to set up variation! (errno = %d)\n",
2899 				    errno);
2900 			DMVAR_SKIP();
2901 		} else {
2902 			/* Variation */
2903 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid off)\n",
2904 				    szFuncName);
2905 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
2906 					   len);
2907 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
2908 
2909 			/* Variation clean up */
2910 			rc = close(fd);
2911 			rc |= remove(DUMMY_FILE);
2912 			if (rc == -1) {
2913 				DMLOG_PRINT(DMLVL_DEBUG,
2914 					    "Unable to clean up variation! (errno = %d)\n",
2915 					    errno);
2916 			}
2917 			dm_handle_free(hanp, hlen);
2918 		}
2919 	}
2920 
2921 	/*
2922 	 * TEST    : dm_punch_hole - invalid len
2923 	 * EXPECTED: rc = -1, errno = E2BIG
2924 	 */
2925 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 7)) {
2926 		int fd;
2927 		void *hanp;
2928 		size_t hlen;
2929 		dm_off_t off = 0;
2930 		dm_size_t len = TMP_FILELEN + 1;
2931 
2932 		/* Variation set up */
2933 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2934 		if ((rc = system(command)) == -1) {
2935 			/* No clean up */
2936 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2937 			remove(DUMMY_FILE);
2938 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2939 			close(fd);
2940 			remove(DUMMY_FILE);
2941 		}
2942 		if (fd == -1 || rc == -1) {
2943 			DMLOG_PRINT(DMLVL_DEBUG,
2944 				    "Unable to set up variation! (errno = %d)\n",
2945 				    errno);
2946 			DMVAR_SKIP();
2947 		} else {
2948 			/* Variation */
2949 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid len)\n",
2950 				    szFuncName);
2951 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
2952 					   len);
2953 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
2954 
2955 			/* Variation clean up */
2956 			rc = close(fd);
2957 			rc |= remove(DUMMY_FILE);
2958 			if (rc == -1) {
2959 				DMLOG_PRINT(DMLVL_DEBUG,
2960 					    "Unable to clean up variation! (errno = %d)\n",
2961 					    errno);
2962 			}
2963 			dm_handle_free(hanp, hlen);
2964 		}
2965 	}
2966 
2967 	/*
2968 	 * TEST    : dm_punch_hole - unaligned off
2969 	 * EXPECTED: rc = -1, errno = EAGAIN
2970 	 */
2971 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 8)) {
2972 		int fd;
2973 		void *hanp;
2974 		size_t hlen;
2975 		dm_off_t off = 1;
2976 		dm_size_t len = 0;
2977 
2978 		/* Variation set up */
2979 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
2980 		if ((rc = system(command)) == -1) {
2981 			/* No clean up */
2982 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
2983 			remove(DUMMY_FILE);
2984 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
2985 			close(fd);
2986 			remove(DUMMY_FILE);
2987 		}
2988 		if (fd == -1 || rc == -1) {
2989 			DMLOG_PRINT(DMLVL_DEBUG,
2990 				    "Unable to set up variation! (errno = %d)\n",
2991 				    errno);
2992 			DMVAR_SKIP();
2993 		} else {
2994 			/* Variation */
2995 			DMLOG_PRINT(DMLVL_DEBUG, "%s(unaligned off)\n",
2996 				    szFuncName);
2997 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
2998 					   len);
2999 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EAGAIN);
3000 
3001 			/* Variation clean up */
3002 			rc = close(fd);
3003 			rc |= remove(DUMMY_FILE);
3004 			if (rc == -1) {
3005 				DMLOG_PRINT(DMLVL_DEBUG,
3006 					    "Unable to clean up variation! (errno = %d)\n",
3007 					    errno);
3008 			}
3009 			dm_handle_free(hanp, hlen);
3010 		}
3011 	}
3012 
3013 	/*
3014 	 * TEST    : dm_punch_hole - unaligned len
3015 	 * EXPECTED: rc = -1, errno = EAGAIN
3016 	 */
3017 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 9)) {
3018 		int fd;
3019 		void *hanp;
3020 		size_t hlen;
3021 		dm_off_t off = 0;
3022 		dm_size_t len = 1;
3023 
3024 		/* Variation set up */
3025 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3026 		if ((rc = system(command)) == -1) {
3027 			/* No clean up */
3028 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3029 			remove(DUMMY_FILE);
3030 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3031 			close(fd);
3032 			remove(DUMMY_FILE);
3033 		}
3034 		if (fd == -1 || rc == -1) {
3035 			DMLOG_PRINT(DMLVL_DEBUG,
3036 				    "Unable to set up variation! (errno = %d)\n",
3037 				    errno);
3038 			DMVAR_SKIP();
3039 		} else {
3040 			/* Variation */
3041 			DMLOG_PRINT(DMLVL_DEBUG, "%s(unaligned len)\n",
3042 				    szFuncName);
3043 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3044 					   len);
3045 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EAGAIN);
3046 
3047 			/* Variation clean up */
3048 			rc = close(fd);
3049 			rc |= remove(DUMMY_FILE);
3050 			if (rc == -1) {
3051 				DMLOG_PRINT(DMLVL_DEBUG,
3052 					    "Unable to clean up variation! (errno = %d)\n",
3053 					    errno);
3054 			}
3055 			dm_handle_free(hanp, hlen);
3056 		}
3057 	}
3058 
3059 	/*
3060 	 * TEST    : dm_punch_hole - unaligned off and len
3061 	 * EXPECTED: rc = -1, errno = EAGAIN
3062 	 */
3063 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 10)) {
3064 		int fd;
3065 		void *hanp;
3066 		size_t hlen;
3067 		dm_off_t off = UNALIGNED_BLK_OFF;
3068 		dm_size_t len = TMP_FILELEN - UNALIGNED_BLK_OFF;
3069 
3070 		/* Variation set up */
3071 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3072 		if ((rc = system(command)) == -1) {
3073 			/* No clean up */
3074 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3075 			remove(DUMMY_FILE);
3076 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3077 			close(fd);
3078 			remove(DUMMY_FILE);
3079 		}
3080 		if (fd == -1 || rc == -1) {
3081 			DMLOG_PRINT(DMLVL_DEBUG,
3082 				    "Unable to set up variation! (errno = %d)\n",
3083 				    errno);
3084 			DMVAR_SKIP();
3085 		} else {
3086 			/* Variation */
3087 			DMLOG_PRINT(DMLVL_DEBUG, "%s(unaligned off and len)\n",
3088 				    szFuncName);
3089 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3090 					   len);
3091 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EAGAIN);
3092 
3093 			/* Variation clean up */
3094 			rc = close(fd);
3095 			rc |= remove(DUMMY_FILE);
3096 			if (rc == -1) {
3097 				DMLOG_PRINT(DMLVL_DEBUG,
3098 					    "Unable to clean up variation! (errno = %d)\n",
3099 					    errno);
3100 			}
3101 			dm_handle_free(hanp, hlen);
3102 		}
3103 	}
3104 
3105 	/*
3106 	 * TEST    : dm_punch_hole - truncate entire file
3107 	 * EXPECTED: rc = 0, nelem = 0
3108 	 */
3109 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 11)) {
3110 		int fd;
3111 		void *hanp;
3112 		size_t hlen;
3113 		dm_off_t off = 0;
3114 		dm_size_t len = 0;
3115 		u_int nelem;
3116 
3117 		/* Variation set up */
3118 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3119 		if ((rc = system(command)) == -1) {
3120 			/* No clean up */
3121 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3122 			remove(DUMMY_FILE);
3123 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3124 			close(fd);
3125 			remove(DUMMY_FILE);
3126 		}
3127 		if (fd == -1 || rc == -1) {
3128 			DMLOG_PRINT(DMLVL_DEBUG,
3129 				    "Unable to set up variation! (errno = %d)\n",
3130 				    errno);
3131 			DMVAR_SKIP();
3132 		} else {
3133 			/* Variation */
3134 			DMLOG_PRINT(DMLVL_DEBUG, "%s(truncate entire file)\n",
3135 				    szFuncName);
3136 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3137 					   len);
3138 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
3139 				    rc);
3140 			if (rc == 0) {
3141 				off = 0;
3142 				rc = dm_get_allocinfo(sid, hanp, hlen,
3143 						      DM_NO_TOKEN, &off,
3144 						      NUM_EXTENTS, Extents,
3145 						      &nelem);
3146 				DMLOG_PRINT(DMLVL_DEBUG,
3147 					    "dm_get_allocinfo returned %d\n",
3148 					    rc);
3149 				if (rc == 0) {
3150 					if (nelem == 0) {
3151 						DMLOG_PRINT(DMLVL_DEBUG,
3152 							    "  nelem = %d\n",
3153 							    nelem);
3154 						DMVAR_PASS();
3155 					} else {
3156 						DMLOG_PRINT(DMLVL_ERR,
3157 							    "%s nelem NOT correct! (%d vs %d)\n",
3158 							    szFuncName, nelem,
3159 							    0);
3160 						DMVAR_FAIL();
3161 					}
3162 				} else {
3163 					DMLOG_PRINT(DMLVL_ERR,
3164 						    "dm_get_allocinfo failed with unexpected rc = %d (errno = %d)\n",
3165 						    rc, errno);
3166 					DMVAR_FAIL();
3167 				}
3168 			} else {
3169 				DMLOG_PRINT(DMLVL_ERR,
3170 					    "%s failed with unexpected rc = %d (errno = %d)\n",
3171 					    szFuncName, rc, errno);
3172 				DMVAR_FAIL();
3173 			}
3174 
3175 			/* Variation clean up */
3176 			rc = close(fd);
3177 			rc |= remove(DUMMY_FILE);
3178 			if (rc == -1) {
3179 				DMLOG_PRINT(DMLVL_DEBUG,
3180 					    "Unable to clean up variation! (errno = %d)\n",
3181 					    errno);
3182 			}
3183 			dm_handle_free(hanp, hlen);
3184 		}
3185 	}
3186 
3187 	/*
3188 	 * TEST    : dm_punch_hole - truncate part of file, len 0
3189 	 * EXPECTED: rc = 0, nelem = 1
3190 	 */
3191 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 12)) {
3192 		int fd;
3193 		void *hanp;
3194 		size_t hlen;
3195 		dm_off_t off = BLK_SIZE;
3196 		dm_size_t len = 0;
3197 		u_int nelem;
3198 
3199 		/* Variation set up */
3200 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3201 		if ((rc = system(command)) == -1) {
3202 			/* No clean up */
3203 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3204 			remove(DUMMY_FILE);
3205 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3206 			close(fd);
3207 			remove(DUMMY_FILE);
3208 		}
3209 		if (fd == -1 || rc == -1) {
3210 			DMLOG_PRINT(DMLVL_DEBUG,
3211 				    "Unable to set up variation! (errno = %d)\n",
3212 				    errno);
3213 			DMVAR_SKIP();
3214 		} else {
3215 			/* Variation */
3216 			DMLOG_PRINT(DMLVL_DEBUG,
3217 				    "%s(truncate part of file, len 0)\n",
3218 				    szFuncName);
3219 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3220 					   len);
3221 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
3222 				    rc);
3223 			if (rc == 0) {
3224 				off = 0;
3225 				rc = dm_get_allocinfo(sid, hanp, hlen,
3226 						      DM_NO_TOKEN, &off,
3227 						      NUM_EXTENTS, Extents,
3228 						      &nelem);
3229 				DMLOG_PRINT(DMLVL_DEBUG,
3230 					    "dm_get_allocinfo returned %d\n",
3231 					    rc);
3232 				if (rc == 0) {
3233 					if (nelem == 1) {
3234 						DMLOG_PRINT(DMLVL_DEBUG,
3235 							    "  nelem = %d\n",
3236 							    nelem);
3237 						LogExtents(Extents, nelem);
3238 						DMVAR_PASS();
3239 					} else {
3240 						DMLOG_PRINT(DMLVL_ERR,
3241 							    "%s nelem NOT correct! (%d vs %d)\n",
3242 							    szFuncName, nelem,
3243 							    1);
3244 						DMVAR_FAIL();
3245 					}
3246 				} else {
3247 					DMLOG_PRINT(DMLVL_ERR,
3248 						    "dm_get_allocinfo failed with unexpected rc = %d (errno = %d)\n",
3249 						    rc, errno);
3250 					DMVAR_FAIL();
3251 				}
3252 			} else {
3253 				DMLOG_PRINT(DMLVL_ERR,
3254 					    "%s failed with unexpected rc = %d (errno = %d)\n",
3255 					    szFuncName, rc, errno);
3256 				DMVAR_FAIL();
3257 			}
3258 
3259 			/* Variation clean up */
3260 			rc = close(fd);
3261 			rc |= remove(DUMMY_FILE);
3262 			if (rc == -1) {
3263 				DMLOG_PRINT(DMLVL_DEBUG,
3264 					    "Unable to clean up variation! (errno = %d)\n",
3265 					    errno);
3266 			}
3267 			dm_handle_free(hanp, hlen);
3268 		}
3269 	}
3270 
3271 	/*
3272 	 * TEST    : dm_punch_hole - truncate part of file, len non-zero
3273 	 * EXPECTED: rc = 0, nelem = 1
3274 	 */
3275 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 13)) {
3276 		int fd;
3277 		void *hanp;
3278 		size_t hlen;
3279 		dm_off_t off = BLK_SIZE;
3280 		dm_size_t len = TMP_FILELEN - BLK_SIZE;
3281 		u_int nelem;
3282 
3283 		/* Variation set up */
3284 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3285 		if ((rc = system(command)) == -1) {
3286 			/* No clean up */
3287 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3288 			remove(DUMMY_FILE);
3289 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3290 			close(fd);
3291 			remove(DUMMY_FILE);
3292 		}
3293 		if (fd == -1 || rc == -1) {
3294 			DMLOG_PRINT(DMLVL_DEBUG,
3295 				    "Unable to set up variation! (errno = %d)\n",
3296 				    errno);
3297 			DMVAR_SKIP();
3298 		} else {
3299 			/* Variation */
3300 			DMLOG_PRINT(DMLVL_DEBUG,
3301 				    "%s(truncate part of file, len non-0)\n",
3302 				    szFuncName);
3303 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3304 					   len);
3305 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
3306 				    rc);
3307 			if (rc == 0) {
3308 				off = 0;
3309 				rc = dm_get_allocinfo(sid, hanp, hlen,
3310 						      DM_NO_TOKEN, &off,
3311 						      NUM_EXTENTS, Extents,
3312 						      &nelem);
3313 				DMLOG_PRINT(DMLVL_DEBUG,
3314 					    "dm_get_allocinfo returned %d\n",
3315 					    rc);
3316 				if (rc == 0) {
3317 					if (nelem == 1) {
3318 						DMLOG_PRINT(DMLVL_DEBUG,
3319 							    "  nelem = %d\n",
3320 							    nelem);
3321 						LogExtents(Extents, nelem);
3322 						DMVAR_PASS();
3323 					} else {
3324 						DMLOG_PRINT(DMLVL_ERR,
3325 							    "%s nelem NOT correct! (%d vs %d)\n",
3326 							    szFuncName, nelem,
3327 							    1);
3328 						DMVAR_FAIL();
3329 					}
3330 				} else {
3331 					DMLOG_PRINT(DMLVL_ERR,
3332 						    "dm_get_allocinfo failed with unexpected rc = %d (errno = %d)\n",
3333 						    rc, errno);
3334 					DMVAR_FAIL();
3335 				}
3336 			} else {
3337 				DMLOG_PRINT(DMLVL_ERR,
3338 					    "%s failed with unexpected rc = %d (errno = %d)\n",
3339 					    szFuncName, rc, errno);
3340 				DMVAR_FAIL();
3341 			}
3342 
3343 			/* Variation clean up */
3344 			rc = close(fd);
3345 			rc |= remove(DUMMY_FILE);
3346 			if (rc == -1) {
3347 				DMLOG_PRINT(DMLVL_DEBUG,
3348 					    "Unable to clean up variation! (errno = %d)\n",
3349 					    errno);
3350 			}
3351 			dm_handle_free(hanp, hlen);
3352 		}
3353 	}
3354 
3355 	/*
3356 	 * TEST    : dm_punch_hole - small hole
3357 	 * EXPECTED: rc = 0, nelem = 3
3358 	 */
3359 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 14)) {
3360 #ifdef INTERIOR_HOLES
3361 		int fd;
3362 		void *hanp;
3363 		size_t hlen;
3364 		dm_off_t off = (TMP_FILELEN / 2) & (~(BLK_SIZE - 1));
3365 		dm_size_t len = 2 * BLK_SIZE;
3366 		u_int nelem;
3367 		char buf[DUMMY_STRLEN];
3368 
3369 		/* Variation set up */
3370 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3371 		if ((rc = system(command)) == -1) {
3372 			/* No clean up */
3373 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3374 			remove(DUMMY_FILE);
3375 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3376 			close(fd);
3377 			remove(DUMMY_FILE);
3378 		}
3379 		if (fd == -1 || rc == -1) {
3380 			DMLOG_PRINT(DMLVL_DEBUG,
3381 				    "Unable to set up variation! (errno = %d)\n",
3382 				    errno);
3383 			DMVAR_SKIP();
3384 		} else {
3385 			/* Variation */
3386 			DMLOG_PRINT(DMLVL_DEBUG, "%s(small hole)\n",
3387 				    szFuncName);
3388 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3389 					   len);
3390 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
3391 				    rc);
3392 			if (rc == 0) {
3393 				off = 0;
3394 				rc = dm_get_allocinfo(sid, hanp, hlen,
3395 						      DM_NO_TOKEN, &off,
3396 						      NUM_EXTENTS, Extents,
3397 						      &nelem);
3398 				DMLOG_PRINT(DMLVL_DEBUG,
3399 					    "dm_get_allocinfo returned %d\n",
3400 					    rc);
3401 				if (rc == 0) {
3402 					if (nelem == 3) {
3403 						DMLOG_PRINT(DMLVL_DEBUG,
3404 							    "  nelem = %d\n",
3405 							    nelem);
3406 						LogExtents(Extents, nelem);
3407 						if ((lseek
3408 						     (fd, TMP_FILELEN / 2,
3409 						      SEEK_SET) ==
3410 						     (TMP_FILELEN / 2))
3411 						    &&
3412 						    (read(fd, buf, DUMMY_STRLEN)
3413 						     == DUMMY_STRLEN)) {
3414 							DMLOG_PRINT(DMLVL_DEBUG,
3415 								    "buffer from hole: [%s]\n",
3416 								    buf);
3417 						}
3418 						if ((lseek
3419 						     (fd, TMP_FILELEN - 10,
3420 						      SEEK_SET) ==
3421 						     (TMP_FILELEN - 10))
3422 						    &&
3423 						    (read(fd, buf, DUMMY_STRLEN)
3424 						     == DUMMY_STRLEN)) {
3425 							DMLOG_PRINT(DMLVL_DEBUG,
3426 								    "buffer from resident extent: [%s]\n",
3427 								    buf);
3428 						}
3429 						DMVAR_PASS();
3430 					} else {
3431 						DMLOG_PRINT(DMLVL_ERR,
3432 							    "%s nelem NOT correct! (%d vs %d)\n",
3433 							    szFuncName, nelem,
3434 							    3);
3435 						DMVAR_FAIL();
3436 					}
3437 				} else {
3438 					DMLOG_PRINT(DMLVL_ERR,
3439 						    "dm_get_allocinfo failed with unexpected rc = %d (errno = %d)\n",
3440 						    rc, errno);
3441 					DMVAR_FAIL();
3442 				}
3443 			} else {
3444 				DMLOG_PRINT(DMLVL_ERR,
3445 					    "%s failed with unexpected rc = %d (errno = %d)\n",
3446 					    szFuncName, rc, errno);
3447 				DMVAR_FAIL();
3448 			}
3449 
3450 			/* Variation clean up */
3451 			rc = close(fd);
3452 			rc |= remove(DUMMY_FILE);
3453 			if (rc == -1) {
3454 				DMLOG_PRINT(DMLVL_DEBUG,
3455 					    "Unable to clean up variation! (errno = %d)\n",
3456 					    errno);
3457 			}
3458 			dm_handle_free(hanp, hlen);
3459 		}
3460 #else
3461 		DMLOG_PRINT(DMLVL_WARN,
3462 			    "Test case not built with INTERIOR_HOLES defined\n");
3463 		DMVAR_SKIP();
3464 #endif
3465 	}
3466 
3467 	/*
3468 	 * TEST    : dm_punch_hole - large hole
3469 	 * EXPECTED: rc = 0, nelem = 3
3470 	 */
3471 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 15)) {
3472 #ifdef INTERIOR_HOLES
3473 		int fd;
3474 		void *hanp;
3475 		size_t hlen;
3476 		dm_off_t off = BLK_SIZE;
3477 		dm_size_t len =
3478 		    (TMP_FILELEN - (2 * BLK_SIZE)) & (~(BLK_SIZE - 1));
3479 		u_int nelem;
3480 
3481 		/* Variation set up */
3482 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3483 		if ((rc = system(command)) == -1) {
3484 			/* No clean up */
3485 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3486 			remove(DUMMY_FILE);
3487 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3488 			close(fd);
3489 			remove(DUMMY_FILE);
3490 		}
3491 		if (fd == -1 || rc == -1) {
3492 			DMLOG_PRINT(DMLVL_DEBUG,
3493 				    "Unable to set up variation! (errno = %d)\n",
3494 				    errno);
3495 			DMVAR_SKIP();
3496 		} else {
3497 			/* Variation */
3498 			DMLOG_PRINT(DMLVL_DEBUG, "%s(large hole)\n",
3499 				    szFuncName);
3500 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3501 					   len);
3502 			DMLOG_PRINT(DMLVL_DEBUG, "%s returned %d\n", szFuncName,
3503 				    rc);
3504 			if (rc == 0) {
3505 				off = 0;
3506 				rc = dm_get_allocinfo(sid, hanp, hlen,
3507 						      DM_NO_TOKEN, &off,
3508 						      NUM_EXTENTS, Extents,
3509 						      &nelem);
3510 				DMLOG_PRINT(DMLVL_DEBUG,
3511 					    "dm_get_allocinfo returned %d\n",
3512 					    rc);
3513 				if (rc == 0) {
3514 					if (nelem == 3) {
3515 						DMLOG_PRINT(DMLVL_DEBUG,
3516 							    "  nelem = %d\n",
3517 							    nelem);
3518 						LogExtents(Extents, nelem);
3519 						DMVAR_PASS();
3520 					} else {
3521 						DMLOG_PRINT(DMLVL_ERR,
3522 							    "%s nelem NOT correct! (%d vs %d)\n",
3523 							    szFuncName, nelem,
3524 							    3);
3525 						DMVAR_FAIL();
3526 					}
3527 				} else {
3528 					DMLOG_PRINT(DMLVL_ERR,
3529 						    "dm_get_allocinfo failed with unexpected rc = %d (errno = %d)\n",
3530 						    rc, errno);
3531 					DMVAR_FAIL();
3532 				}
3533 			} else {
3534 				DMLOG_PRINT(DMLVL_ERR,
3535 					    "%s failed with unexpected rc = %d (errno = %d)\n",
3536 					    szFuncName, rc, errno);
3537 				DMVAR_FAIL();
3538 			}
3539 
3540 			/* Variation clean up */
3541 			rc = close(fd);
3542 			rc |= remove(DUMMY_FILE);
3543 			if (rc == -1) {
3544 				DMLOG_PRINT(DMLVL_DEBUG,
3545 					    "Unable to clean up variation! (errno = %d)\n",
3546 					    errno);
3547 			}
3548 			dm_handle_free(hanp, hlen);
3549 		}
3550 #else
3551 		DMLOG_PRINT(DMLVL_WARN,
3552 			    "Test case not built with INTERIOR_HOLES defined\n");
3553 		DMVAR_SKIP();
3554 #endif
3555 	}
3556 
3557 	/*
3558 	 * TEST    : dm_punch_hole - DM_NO_SESSION sid
3559 	 * EXPECTED: rc = -1, errno = EINVAL
3560 	 */
3561 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 16)) {
3562 		int fd;
3563 		void *hanp;
3564 		size_t hlen;
3565 		dm_off_t off = 0;
3566 		dm_size_t len = 0;
3567 
3568 		/* Variation set up */
3569 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3570 		if ((rc = system(command)) == -1) {
3571 			/* No clean up */
3572 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3573 			remove(DUMMY_FILE);
3574 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3575 			close(fd);
3576 			remove(DUMMY_FILE);
3577 		}
3578 		if (fd == -1 || rc == -1) {
3579 			DMLOG_PRINT(DMLVL_DEBUG,
3580 				    "Unable to set up variation! (errno = %d)\n",
3581 				    errno);
3582 			DMVAR_SKIP();
3583 		} else {
3584 			/* Variation */
3585 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
3586 				    szFuncName);
3587 			rc = dm_punch_hole(DM_NO_SESSION, hanp, hlen,
3588 					   DM_NO_TOKEN, off, len);
3589 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
3590 
3591 			/* Variation clean up */
3592 			rc = close(fd);
3593 			rc |= remove(DUMMY_FILE);
3594 			if (rc == -1) {
3595 				DMLOG_PRINT(DMLVL_DEBUG,
3596 					    "Unable to clean up variation! (errno = %d)\n",
3597 					    errno);
3598 			}
3599 			dm_handle_free(hanp, hlen);
3600 		}
3601 	}
3602 
3603 	/*
3604 	 * TEST    : dm_punch_hole - fs handle
3605 	 * EXPECTED: rc = -1, errno = EINVAL
3606 	 */
3607 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 17)) {
3608 		void *hanp;
3609 		size_t hlen;
3610 		dm_off_t off = 0;
3611 		dm_size_t len = 0;
3612 
3613 		/* Variation set up */
3614 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
3615 			/* No clean up */
3616 		} else
3617 		    if ((rc =
3618 			 dm_path_to_fshandle(DUMMY_SUBDIR, &hanp,
3619 					     &hlen)) == -1) {
3620 			rmdir(DUMMY_SUBDIR);
3621 		}
3622 		if (rc == -1) {
3623 			DMLOG_PRINT(DMLVL_DEBUG,
3624 				    "Unable to set up variation! (errno = %d)\n",
3625 				    errno);
3626 			DMVAR_SKIP();
3627 		} else {
3628 			/* Variation */
3629 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
3630 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3631 					   len);
3632 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
3633 
3634 			/* Variation clean up */
3635 			rc = rmdir(DUMMY_SUBDIR);
3636 			if (rc == -1) {
3637 				DMLOG_PRINT(DMLVL_DEBUG,
3638 					    "Unable to clean up variation! (errno = %d)\n",
3639 					    errno);
3640 			}
3641 			dm_handle_free(hanp, hlen);
3642 		}
3643 	}
3644 
3645 	/*
3646 	 * TEST    : dm_punch_hole - global handle
3647 	 * EXPECTED: rc = -1, errno = EBADF
3648 	 */
3649 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 18)) {
3650 		dm_off_t off = 0;
3651 		dm_size_t len = 0;
3652 
3653 		/* Variation set up */
3654 
3655 		/* Variation */
3656 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
3657 		rc = dm_punch_hole(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
3658 				   DM_NO_TOKEN, off, len);
3659 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
3660 
3661 		/* Variation clean up */
3662 	}
3663 
3664 	/*
3665 	 * TEST    : dm_punch_hole - invalidated hanp
3666 	 * EXPECTED: rc = -1, errno = EBADF
3667 	 */
3668 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 19)) {
3669 		int fd;
3670 		void *hanp;
3671 		size_t hlen;
3672 		dm_off_t off = 0;
3673 		dm_size_t len = 0;
3674 
3675 		/* Variation set up */
3676 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3677 		if ((rc = system(command)) == -1) {
3678 			/* No clean up */
3679 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3680 			remove(DUMMY_FILE);
3681 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3682 			close(fd);
3683 			remove(DUMMY_FILE);
3684 		} else if ((rc = close(fd)) == -1) {
3685 			dm_handle_free(hanp, hlen);
3686 			remove(DUMMY_FILE);
3687 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
3688 			dm_handle_free(hanp, hlen);
3689 		}
3690 		if (fd == -1 || rc == -1) {
3691 			DMLOG_PRINT(DMLVL_DEBUG,
3692 				    "Unable to set up variation! (errno = %d)\n",
3693 				    errno);
3694 			DMVAR_SKIP();
3695 		} else {
3696 			/* Variation */
3697 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
3698 				    szFuncName);
3699 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3700 					   len);
3701 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
3702 
3703 			/* Variation clean up */
3704 			dm_handle_free(hanp, hlen);
3705 		}
3706 	}
3707 
3708 	/*
3709 	 * TEST    : dm_punch_hole - private read mmap overlapping hole
3710 	 * EXPECTED: rc = -1, errno = EBUSY
3711 	 */
3712 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 20)) {
3713 		int fd;
3714 		void *hanp;
3715 		size_t hlen;
3716 		dm_off_t off = 0;
3717 		dm_size_t len = 0;
3718 		void *memmap;
3719 
3720 		/* Variation set up */
3721 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3722 		if ((rc = system(command)) == -1) {
3723 			/* No clean up */
3724 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3725 			remove(DUMMY_FILE);
3726 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3727 			close(fd);
3728 			remove(DUMMY_FILE);
3729 		} else
3730 		    if ((memmap =
3731 			 mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd,
3732 			      0)) == MAP_FAILED) {
3733 			dm_handle_free(hanp, hlen);
3734 			close(fd);
3735 			remove(DUMMY_FILE);
3736 		}
3737 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
3738 			DMLOG_PRINT(DMLVL_DEBUG,
3739 				    "Unable to set up variation! (errno = %d)\n",
3740 				    errno);
3741 			DMVAR_SKIP();
3742 		} else {
3743 			/* Variation */
3744 			DMLOG_PRINT(DMLVL_DEBUG,
3745 				    "%s(private read mmap overlap hole)\n",
3746 				    szFuncName);
3747 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3748 					   len);
3749 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
3750 
3751 			/* Variation clean up */
3752 			munmap(memmap, PAGE_SIZE);
3753 			rc = close(fd);
3754 			rc |= remove(DUMMY_FILE);
3755 			if (rc == -1) {
3756 				DMLOG_PRINT(DMLVL_DEBUG,
3757 					    "Unable to clean up variation! (errno = %d)\n",
3758 					    errno);
3759 			}
3760 			dm_handle_free(hanp, hlen);
3761 		}
3762 	}
3763 
3764 	/*
3765 	 * TEST    : dm_punch_hole - private write mmap overlapping hole
3766 	 * EXPECTED: rc = -1, errno = EBUSY
3767 	 */
3768 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 21)) {
3769 		int fd;
3770 		void *hanp;
3771 		size_t hlen;
3772 		dm_off_t off = 0;
3773 		dm_size_t len = 0;
3774 		void *memmap;
3775 
3776 		/* Variation set up */
3777 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3778 		if ((rc = system(command)) == -1) {
3779 			/* No clean up */
3780 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3781 			remove(DUMMY_FILE);
3782 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3783 			close(fd);
3784 			remove(DUMMY_FILE);
3785 		} else
3786 		    if ((memmap =
3787 			 mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_PRIVATE, fd,
3788 			      0)) == MAP_FAILED) {
3789 			dm_handle_free(hanp, hlen);
3790 			close(fd);
3791 			remove(DUMMY_FILE);
3792 		}
3793 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
3794 			DMLOG_PRINT(DMLVL_DEBUG,
3795 				    "Unable to set up variation! (errno = %d)\n",
3796 				    errno);
3797 			DMVAR_SKIP();
3798 		} else {
3799 			/* Variation */
3800 			DMLOG_PRINT(DMLVL_DEBUG,
3801 				    "%s(private write mmap overlap hole)\n",
3802 				    szFuncName);
3803 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3804 					   len);
3805 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
3806 
3807 			/* Variation clean up */
3808 			munmap(memmap, PAGE_SIZE);
3809 			rc = close(fd);
3810 			rc |= remove(DUMMY_FILE);
3811 			if (rc == -1) {
3812 				DMLOG_PRINT(DMLVL_DEBUG,
3813 					    "Unable to clean up variation! (errno = %d)\n",
3814 					    errno);
3815 			}
3816 			dm_handle_free(hanp, hlen);
3817 		}
3818 	}
3819 
3820 	/*
3821 	 * TEST    : dm_punch_hole - private exec mmap overlapping hole
3822 	 * EXPECTED: rc = -1, errno = EBUSY
3823 	 */
3824 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 22)) {
3825 		int fd;
3826 		void *hanp;
3827 		size_t hlen;
3828 		dm_off_t off = 0;
3829 		dm_size_t len = 0;
3830 		void *memmap;
3831 
3832 		/* Variation set up */
3833 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3834 		if ((rc = system(command)) == -1) {
3835 			/* No clean up */
3836 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3837 			remove(DUMMY_FILE);
3838 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3839 			close(fd);
3840 			remove(DUMMY_FILE);
3841 		} else
3842 		    if ((memmap =
3843 			 mmap(NULL, PAGE_SIZE, PROT_EXEC, MAP_PRIVATE, fd,
3844 			      0)) == MAP_FAILED) {
3845 			dm_handle_free(hanp, hlen);
3846 			close(fd);
3847 			remove(DUMMY_FILE);
3848 		}
3849 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
3850 			DMLOG_PRINT(DMLVL_DEBUG,
3851 				    "Unable to set up variation! (errno = %d)\n",
3852 				    errno);
3853 			DMVAR_SKIP();
3854 		} else {
3855 			/* Variation */
3856 			DMLOG_PRINT(DMLVL_DEBUG,
3857 				    "%s(private exec mmap overlap hole)\n",
3858 				    szFuncName);
3859 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3860 					   len);
3861 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
3862 
3863 			/* Variation clean up */
3864 			munmap(memmap, PAGE_SIZE);
3865 			rc = close(fd);
3866 			rc |= remove(DUMMY_FILE);
3867 			if (rc == -1) {
3868 				DMLOG_PRINT(DMLVL_DEBUG,
3869 					    "Unable to clean up variation! (errno = %d)\n",
3870 					    errno);
3871 			}
3872 			dm_handle_free(hanp, hlen);
3873 		}
3874 	}
3875 
3876 	/*
3877 	 * TEST    : dm_punch_hole - private r/w mmap overlapping hole
3878 	 * EXPECTED: rc = -1, errno = EBUSY
3879 	 */
3880 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 23)) {
3881 		int fd;
3882 		void *hanp;
3883 		size_t hlen;
3884 		dm_off_t off = 0;
3885 		dm_size_t len = 0;
3886 		void *memmap;
3887 
3888 		/* Variation set up */
3889 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3890 		if ((rc = system(command)) == -1) {
3891 			/* No clean up */
3892 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3893 			remove(DUMMY_FILE);
3894 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3895 			close(fd);
3896 			remove(DUMMY_FILE);
3897 		} else
3898 		    if ((memmap =
3899 			 mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
3900 			      MAP_PRIVATE, fd, 0)) == MAP_FAILED) {
3901 			dm_handle_free(hanp, hlen);
3902 			close(fd);
3903 			remove(DUMMY_FILE);
3904 		}
3905 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
3906 			DMLOG_PRINT(DMLVL_DEBUG,
3907 				    "Unable to set up variation! (errno = %d)\n",
3908 				    errno);
3909 			DMVAR_SKIP();
3910 		} else {
3911 			/* Variation */
3912 			DMLOG_PRINT(DMLVL_DEBUG,
3913 				    "%s(private r/w mmap overlap hole)\n",
3914 				    szFuncName);
3915 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3916 					   len);
3917 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
3918 
3919 			/* Variation clean up */
3920 			munmap(memmap, PAGE_SIZE);
3921 			rc = close(fd);
3922 			rc |= remove(DUMMY_FILE);
3923 			if (rc == -1) {
3924 				DMLOG_PRINT(DMLVL_DEBUG,
3925 					    "Unable to clean up variation! (errno = %d)\n",
3926 					    errno);
3927 			}
3928 			dm_handle_free(hanp, hlen);
3929 		}
3930 	}
3931 
3932 	/*
3933 	 * TEST    : dm_punch_hole - shared read mmap overlapping hole
3934 	 * EXPECTED: rc = -1, errno = EBUSY
3935 	 */
3936 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 24)) {
3937 		int fd;
3938 		void *hanp;
3939 		size_t hlen;
3940 		dm_off_t off = 0;
3941 		dm_size_t len = 0;
3942 		void *memmap;
3943 
3944 		/* Variation set up */
3945 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
3946 		if ((rc = system(command)) == -1) {
3947 			/* No clean up */
3948 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
3949 			remove(DUMMY_FILE);
3950 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
3951 			close(fd);
3952 			remove(DUMMY_FILE);
3953 		} else
3954 		    if ((memmap =
3955 			 mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd,
3956 			      0)) == MAP_FAILED) {
3957 			dm_handle_free(hanp, hlen);
3958 			close(fd);
3959 			remove(DUMMY_FILE);
3960 		}
3961 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
3962 			DMLOG_PRINT(DMLVL_DEBUG,
3963 				    "Unable to set up variation! (errno = %d)\n",
3964 				    errno);
3965 			DMVAR_SKIP();
3966 		} else {
3967 			/* Variation */
3968 			DMLOG_PRINT(DMLVL_DEBUG,
3969 				    "%s(shared read mmap overlap hole)\n",
3970 				    szFuncName);
3971 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
3972 					   len);
3973 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
3974 
3975 			/* Variation clean up */
3976 			munmap(memmap, PAGE_SIZE);
3977 			rc = close(fd);
3978 			rc |= remove(DUMMY_FILE);
3979 			if (rc == -1) {
3980 				DMLOG_PRINT(DMLVL_DEBUG,
3981 					    "Unable to clean up variation! (errno = %d)\n",
3982 					    errno);
3983 			}
3984 			dm_handle_free(hanp, hlen);
3985 		}
3986 	}
3987 
3988 	/*
3989 	 * TEST    : dm_punch_hole - shared write mmap overlapping hole
3990 	 * EXPECTED: rc = -1, errno = EBUSY
3991 	 */
3992 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 25)) {
3993 		int fd;
3994 		void *hanp;
3995 		size_t hlen;
3996 		dm_off_t off = 0;
3997 		dm_size_t len = 0;
3998 		void *memmap;
3999 
4000 		/* Variation set up */
4001 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4002 		if ((rc = system(command)) == -1) {
4003 			/* No clean up */
4004 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4005 			remove(DUMMY_FILE);
4006 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4007 			close(fd);
4008 			remove(DUMMY_FILE);
4009 		} else
4010 		    if ((memmap =
4011 			 mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED, fd,
4012 			      0)) == MAP_FAILED) {
4013 			dm_handle_free(hanp, hlen);
4014 			close(fd);
4015 			remove(DUMMY_FILE);
4016 		}
4017 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4018 			DMLOG_PRINT(DMLVL_DEBUG,
4019 				    "Unable to set up variation! (errno = %d)\n",
4020 				    errno);
4021 			DMVAR_SKIP();
4022 		} else {
4023 			/* Variation */
4024 			DMLOG_PRINT(DMLVL_DEBUG,
4025 				    "%s(shared write mmap overlap hole)\n",
4026 				    szFuncName);
4027 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4028 					   len);
4029 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
4030 
4031 			/* Variation clean up */
4032 			munmap(memmap, PAGE_SIZE);
4033 			rc = close(fd);
4034 			rc |= remove(DUMMY_FILE);
4035 			if (rc == -1) {
4036 				DMLOG_PRINT(DMLVL_DEBUG,
4037 					    "Unable to clean up variation! (errno = %d)\n",
4038 					    errno);
4039 			}
4040 			dm_handle_free(hanp, hlen);
4041 		}
4042 	}
4043 
4044 	/*
4045 	 * TEST    : dm_punch_hole - shared exec mmap overlapping hole
4046 	 * EXPECTED: rc = -1, errno = EBUSY
4047 	 */
4048 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 26)) {
4049 		int fd;
4050 		void *hanp;
4051 		size_t hlen;
4052 		dm_off_t off = 0;
4053 		dm_size_t len = 0;
4054 		void *memmap;
4055 
4056 		/* Variation set up */
4057 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4058 		if ((rc = system(command)) == -1) {
4059 			/* No clean up */
4060 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4061 			remove(DUMMY_FILE);
4062 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4063 			close(fd);
4064 			remove(DUMMY_FILE);
4065 		} else
4066 		    if ((memmap =
4067 			 mmap(NULL, PAGE_SIZE, PROT_EXEC, MAP_SHARED, fd,
4068 			      0)) == MAP_FAILED) {
4069 			dm_handle_free(hanp, hlen);
4070 			close(fd);
4071 			remove(DUMMY_FILE);
4072 		}
4073 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4074 			DMLOG_PRINT(DMLVL_DEBUG,
4075 				    "Unable to set up variation! (errno = %d)\n",
4076 				    errno);
4077 			DMVAR_SKIP();
4078 		} else {
4079 			/* Variation */
4080 			DMLOG_PRINT(DMLVL_DEBUG,
4081 				    "%s(shared exec mmap overlap hole)\n",
4082 				    szFuncName);
4083 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4084 					   len);
4085 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
4086 
4087 			/* Variation clean up */
4088 			munmap(memmap, PAGE_SIZE);
4089 			rc = close(fd);
4090 			rc |= remove(DUMMY_FILE);
4091 			if (rc == -1) {
4092 				DMLOG_PRINT(DMLVL_DEBUG,
4093 					    "Unable to clean up variation! (errno = %d)\n",
4094 					    errno);
4095 			}
4096 			dm_handle_free(hanp, hlen);
4097 		}
4098 	}
4099 
4100 	/*
4101 	 * TEST    : dm_punch_hole - shared r/w mmap overlapping hole
4102 	 * EXPECTED: rc = -1, errno = EBUSY
4103 	 */
4104 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 27)) {
4105 		int fd;
4106 		void *hanp;
4107 		size_t hlen;
4108 		dm_off_t off = 0;
4109 		dm_size_t len = 0;
4110 		void *memmap;
4111 
4112 		/* Variation set up */
4113 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4114 		if ((rc = system(command)) == -1) {
4115 			/* No clean up */
4116 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4117 			remove(DUMMY_FILE);
4118 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4119 			close(fd);
4120 			remove(DUMMY_FILE);
4121 		} else
4122 		    if ((memmap =
4123 			 mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
4124 			      MAP_SHARED, fd, 0)) == MAP_FAILED) {
4125 			dm_handle_free(hanp, hlen);
4126 			close(fd);
4127 			remove(DUMMY_FILE);
4128 		}
4129 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4130 			DMLOG_PRINT(DMLVL_DEBUG,
4131 				    "Unable to set up variation! (errno = %d)\n",
4132 				    errno);
4133 			DMVAR_SKIP();
4134 		} else {
4135 			/* Variation */
4136 			DMLOG_PRINT(DMLVL_DEBUG,
4137 				    "%s(shared r/w mmap overlap hole)\n",
4138 				    szFuncName);
4139 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4140 					   len);
4141 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
4142 
4143 			/* Variation clean up */
4144 			munmap(memmap, PAGE_SIZE);
4145 			rc = close(fd);
4146 			rc |= remove(DUMMY_FILE);
4147 			if (rc == -1) {
4148 				DMLOG_PRINT(DMLVL_DEBUG,
4149 					    "Unable to clean up variation! (errno = %d)\n",
4150 					    errno);
4151 			}
4152 			dm_handle_free(hanp, hlen);
4153 		}
4154 	}
4155 
4156 	/*
4157 	 * TEST    : dm_punch_hole - private read mmap not overlapping hole
4158 	 * EXPECTED: rc = 0
4159 	 */
4160 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 28)) {
4161 		int fd;
4162 		void *hanp;
4163 		size_t hlen;
4164 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4165 		dm_size_t len = 0;
4166 		void *memmap;
4167 
4168 		/* Variation set up */
4169 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4170 		if ((rc = system(command)) == -1) {
4171 			/* No clean up */
4172 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4173 			remove(DUMMY_FILE);
4174 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4175 			close(fd);
4176 			remove(DUMMY_FILE);
4177 		} else
4178 		    if ((memmap =
4179 			 mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd,
4180 			      0)) == MAP_FAILED) {
4181 			dm_handle_free(hanp, hlen);
4182 			close(fd);
4183 			remove(DUMMY_FILE);
4184 		}
4185 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4186 			DMLOG_PRINT(DMLVL_DEBUG,
4187 				    "Unable to set up variation! (errno = %d)\n",
4188 				    errno);
4189 			DMVAR_SKIP();
4190 		} else {
4191 			/* Variation */
4192 			DMLOG_PRINT(DMLVL_DEBUG,
4193 				    "%s(private read mmap not overlap hole)\n",
4194 				    szFuncName);
4195 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4196 					   len);
4197 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4198 
4199 			/* Variation clean up */
4200 			munmap(memmap, PAGE_SIZE);
4201 			rc = close(fd);
4202 			rc |= remove(DUMMY_FILE);
4203 			if (rc == -1) {
4204 				DMLOG_PRINT(DMLVL_DEBUG,
4205 					    "Unable to clean up variation! (errno = %d)\n",
4206 					    errno);
4207 			}
4208 			dm_handle_free(hanp, hlen);
4209 		}
4210 	}
4211 
4212 	/*
4213 	 * TEST    : dm_punch_hole - private write mmap not overlapping hole
4214 	 * EXPECTED: rc = 0
4215 	 */
4216 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 29)) {
4217 		int fd;
4218 		void *hanp;
4219 		size_t hlen;
4220 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4221 		dm_size_t len = 0;
4222 		void *memmap;
4223 
4224 		/* Variation set up */
4225 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4226 		if ((rc = system(command)) == -1) {
4227 			/* No clean up */
4228 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4229 			remove(DUMMY_FILE);
4230 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4231 			close(fd);
4232 			remove(DUMMY_FILE);
4233 		} else
4234 		    if ((memmap =
4235 			 mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_PRIVATE, fd,
4236 			      0)) == MAP_FAILED) {
4237 			dm_handle_free(hanp, hlen);
4238 			close(fd);
4239 			remove(DUMMY_FILE);
4240 		}
4241 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4242 			DMLOG_PRINT(DMLVL_DEBUG,
4243 				    "Unable to set up variation! (errno = %d)\n",
4244 				    errno);
4245 			DMVAR_SKIP();
4246 		} else {
4247 			/* Variation */
4248 			DMLOG_PRINT(DMLVL_DEBUG,
4249 				    "%s(private write mmap not overlap hole)\n",
4250 				    szFuncName);
4251 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4252 					   len);
4253 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4254 
4255 			/* Variation clean up */
4256 			munmap(memmap, PAGE_SIZE);
4257 			rc = close(fd);
4258 			rc |= remove(DUMMY_FILE);
4259 			if (rc == -1) {
4260 				DMLOG_PRINT(DMLVL_DEBUG,
4261 					    "Unable to clean up variation! (errno = %d)\n",
4262 					    errno);
4263 			}
4264 			dm_handle_free(hanp, hlen);
4265 		}
4266 	}
4267 
4268 	/*
4269 	 * TEST    : dm_punch_hole - private exec mmap not overlapping hole
4270 	 * EXPECTED: rc = -1, errno = EBUSY
4271 	 */
4272 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 30)) {
4273 		int fd;
4274 		void *hanp;
4275 		size_t hlen;
4276 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4277 		dm_size_t len = 0;
4278 		void *memmap;
4279 
4280 		/* Variation set up */
4281 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4282 		if ((rc = system(command)) == -1) {
4283 			/* No clean up */
4284 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4285 			remove(DUMMY_FILE);
4286 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4287 			close(fd);
4288 			remove(DUMMY_FILE);
4289 		} else
4290 		    if ((memmap =
4291 			 mmap(NULL, PAGE_SIZE, PROT_EXEC, MAP_PRIVATE, fd,
4292 			      0)) == MAP_FAILED) {
4293 			dm_handle_free(hanp, hlen);
4294 			close(fd);
4295 			remove(DUMMY_FILE);
4296 		}
4297 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4298 			DMLOG_PRINT(DMLVL_DEBUG,
4299 				    "Unable to set up variation! (errno = %d)\n",
4300 				    errno);
4301 			DMVAR_SKIP();
4302 		} else {
4303 			/* Variation */
4304 			DMLOG_PRINT(DMLVL_DEBUG,
4305 				    "%s(private exec mmap not overlap hole)\n",
4306 				    szFuncName);
4307 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4308 					   len);
4309 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
4310 
4311 			/* Variation clean up */
4312 			munmap(memmap, PAGE_SIZE);
4313 			rc = close(fd);
4314 			rc |= remove(DUMMY_FILE);
4315 			if (rc == -1) {
4316 				DMLOG_PRINT(DMLVL_DEBUG,
4317 					    "Unable to clean up variation! (errno = %d)\n",
4318 					    errno);
4319 			}
4320 			dm_handle_free(hanp, hlen);
4321 		}
4322 	}
4323 
4324 	/*
4325 	 * TEST    : dm_punch_hole - private r/w mmap not overlapping hole
4326 	 * EXPECTED: rc = 0
4327 	 */
4328 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 31)) {
4329 		int fd;
4330 		void *hanp;
4331 		size_t hlen;
4332 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4333 		dm_size_t len = 0;
4334 		void *memmap;
4335 
4336 		/* Variation set up */
4337 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4338 		if ((rc = system(command)) == -1) {
4339 			/* No clean up */
4340 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4341 			remove(DUMMY_FILE);
4342 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4343 			close(fd);
4344 			remove(DUMMY_FILE);
4345 		} else
4346 		    if ((memmap =
4347 			 mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
4348 			      MAP_PRIVATE, fd, 0)) == MAP_FAILED) {
4349 			dm_handle_free(hanp, hlen);
4350 			close(fd);
4351 			remove(DUMMY_FILE);
4352 		}
4353 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4354 			DMLOG_PRINT(DMLVL_DEBUG,
4355 				    "Unable to set up variation! (errno = %d)\n",
4356 				    errno);
4357 			DMVAR_SKIP();
4358 		} else {
4359 			/* Variation */
4360 			DMLOG_PRINT(DMLVL_DEBUG,
4361 				    "%s(private r/w mmap not overlap hole)\n",
4362 				    szFuncName);
4363 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4364 					   len);
4365 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4366 
4367 			/* Variation clean up */
4368 			munmap(memmap, PAGE_SIZE);
4369 			rc = close(fd);
4370 			rc |= remove(DUMMY_FILE);
4371 			if (rc == -1) {
4372 				DMLOG_PRINT(DMLVL_DEBUG,
4373 					    "Unable to clean up variation! (errno = %d)\n",
4374 					    errno);
4375 			}
4376 			dm_handle_free(hanp, hlen);
4377 		}
4378 	}
4379 
4380 	/*
4381 	 * TEST    : dm_punch_hole - shared read mmap not overlapping hole
4382 	 * EXPECTED: rc = 0
4383 	 */
4384 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 32)) {
4385 		int fd;
4386 		void *hanp;
4387 		size_t hlen;
4388 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4389 		dm_size_t len = 0;
4390 		void *memmap;
4391 
4392 		/* Variation set up */
4393 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4394 		if ((rc = system(command)) == -1) {
4395 			/* No clean up */
4396 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4397 			remove(DUMMY_FILE);
4398 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4399 			close(fd);
4400 			remove(DUMMY_FILE);
4401 		} else
4402 		    if ((memmap =
4403 			 mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd,
4404 			      0)) == MAP_FAILED) {
4405 			dm_handle_free(hanp, hlen);
4406 			close(fd);
4407 			remove(DUMMY_FILE);
4408 		}
4409 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4410 			DMLOG_PRINT(DMLVL_DEBUG,
4411 				    "Unable to set up variation! (errno = %d)\n",
4412 				    errno);
4413 			DMVAR_SKIP();
4414 		} else {
4415 			/* Variation */
4416 			DMLOG_PRINT(DMLVL_DEBUG,
4417 				    "%s(shared read mmap not overlap hole)\n",
4418 				    szFuncName);
4419 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4420 					   len);
4421 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4422 
4423 			/* Variation clean up */
4424 			munmap(memmap, PAGE_SIZE);
4425 			rc = close(fd);
4426 			rc |= remove(DUMMY_FILE);
4427 			if (rc == -1) {
4428 				DMLOG_PRINT(DMLVL_DEBUG,
4429 					    "Unable to clean up variation! (errno = %d)\n",
4430 					    errno);
4431 			}
4432 			dm_handle_free(hanp, hlen);
4433 		}
4434 	}
4435 
4436 	/*
4437 	 * TEST    : dm_punch_hole - shared write mmap not overlapping hole
4438 	 * EXPECTED: rc = 0
4439 	 */
4440 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 33)) {
4441 		int fd;
4442 		void *hanp;
4443 		size_t hlen;
4444 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4445 		dm_size_t len = 0;
4446 		void *memmap;
4447 
4448 		/* Variation set up */
4449 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4450 		if ((rc = system(command)) == -1) {
4451 			/* No clean up */
4452 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4453 			remove(DUMMY_FILE);
4454 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4455 			close(fd);
4456 			remove(DUMMY_FILE);
4457 		} else
4458 		    if ((memmap =
4459 			 mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED, fd,
4460 			      0)) == MAP_FAILED) {
4461 			dm_handle_free(hanp, hlen);
4462 			close(fd);
4463 			remove(DUMMY_FILE);
4464 		}
4465 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4466 			DMLOG_PRINT(DMLVL_DEBUG,
4467 				    "Unable to set up variation! (errno = %d)\n",
4468 				    errno);
4469 			DMVAR_SKIP();
4470 		} else {
4471 			/* Variation */
4472 			DMLOG_PRINT(DMLVL_DEBUG,
4473 				    "%s(shared write mmap not overlap hole)\n",
4474 				    szFuncName);
4475 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4476 					   len);
4477 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4478 
4479 			/* Variation clean up */
4480 			munmap(memmap, PAGE_SIZE);
4481 			rc = close(fd);
4482 			rc |= remove(DUMMY_FILE);
4483 			if (rc == -1) {
4484 				DMLOG_PRINT(DMLVL_DEBUG,
4485 					    "Unable to clean up variation! (errno = %d)\n",
4486 					    errno);
4487 			}
4488 			dm_handle_free(hanp, hlen);
4489 		}
4490 	}
4491 
4492 	/*
4493 	 * TEST    : dm_punch_hole - shared exec mmap not overlapping hole
4494 	 * EXPECTED: rc = -1, errno = EBUSY
4495 	 */
4496 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 34)) {
4497 		int fd;
4498 		void *hanp;
4499 		size_t hlen;
4500 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4501 		dm_size_t len = 0;
4502 		void *memmap;
4503 
4504 		/* Variation set up */
4505 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4506 		if ((rc = system(command)) == -1) {
4507 			/* No clean up */
4508 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4509 			remove(DUMMY_FILE);
4510 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4511 			close(fd);
4512 			remove(DUMMY_FILE);
4513 		} else
4514 		    if ((memmap =
4515 			 mmap(NULL, PAGE_SIZE, PROT_EXEC, MAP_SHARED, fd,
4516 			      0)) == MAP_FAILED) {
4517 			dm_handle_free(hanp, hlen);
4518 			close(fd);
4519 			remove(DUMMY_FILE);
4520 		}
4521 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4522 			DMLOG_PRINT(DMLVL_DEBUG,
4523 				    "Unable to set up variation! (errno = %d)\n",
4524 				    errno);
4525 			DMVAR_SKIP();
4526 		} else {
4527 			/* Variation */
4528 			DMLOG_PRINT(DMLVL_DEBUG,
4529 				    "%s(shared exec mmap not overlap hole)\n",
4530 				    szFuncName);
4531 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4532 					   len);
4533 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
4534 
4535 			/* Variation clean up */
4536 			munmap(memmap, PAGE_SIZE);
4537 			rc = close(fd);
4538 			rc |= remove(DUMMY_FILE);
4539 			if (rc == -1) {
4540 				DMLOG_PRINT(DMLVL_DEBUG,
4541 					    "Unable to clean up variation! (errno = %d)\n",
4542 					    errno);
4543 			}
4544 			dm_handle_free(hanp, hlen);
4545 		}
4546 	}
4547 
4548 	/*
4549 	 * TEST    : dm_punch_hole - shared r/w mmap not overlapping hole
4550 	 * EXPECTED: rc = 0
4551 	 */
4552 	if (DMVAR_EXEC(PUNCH_HOLE_BASE + 35)) {
4553 		int fd;
4554 		void *hanp;
4555 		size_t hlen;
4556 		dm_off_t off = BLKALIGN(TMP_FILELEN / 2);
4557 		dm_size_t len = 0;
4558 		void *memmap;
4559 
4560 		/* Variation set up */
4561 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
4562 		if ((rc = system(command)) == -1) {
4563 			/* No clean up */
4564 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
4565 			remove(DUMMY_FILE);
4566 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
4567 			close(fd);
4568 			remove(DUMMY_FILE);
4569 		} else
4570 		    if ((memmap =
4571 			 mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
4572 			      MAP_SHARED, fd, 0)) == MAP_FAILED) {
4573 			dm_handle_free(hanp, hlen);
4574 			close(fd);
4575 			remove(DUMMY_FILE);
4576 		}
4577 		if (fd == -1 || rc == -1 || memmap == MAP_FAILED) {
4578 			DMLOG_PRINT(DMLVL_DEBUG,
4579 				    "Unable to set up variation! (errno = %d)\n",
4580 				    errno);
4581 			DMVAR_SKIP();
4582 		} else {
4583 			/* Variation */
4584 			DMLOG_PRINT(DMLVL_DEBUG,
4585 				    "%s(shared r/w mmap not overlap hole)\n",
4586 				    szFuncName);
4587 			rc = dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, off,
4588 					   len);
4589 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
4590 
4591 			/* Variation clean up */
4592 			munmap(memmap, PAGE_SIZE);
4593 			rc = close(fd);
4594 			rc |= remove(DUMMY_FILE);
4595 			if (rc == -1) {
4596 				DMLOG_PRINT(DMLVL_DEBUG,
4597 					    "Unable to clean up variation! (errno = %d)\n",
4598 					    errno);
4599 			}
4600 			dm_handle_free(hanp, hlen);
4601 		}
4602 	}
4603 
4604 	rc = dm_destroy_session(sid);
4605 	if (rc == -1) {
4606 		DMLOG_PRINT(DMLVL_ERR,
4607 			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
4608 			    rc, errno);
4609 	}
4610 
4611 	remove(DUMMY_TMP);
4612 
4613 	DMLOG_STOP();
4614 
4615 	tst_exit();
4616 }
4617