Home | History | Annotate | Download | only in dmapi
      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	: invis.c
     21  *
     22  * VARIATIONS	: 32
     23  *
     24  * API'S TESTED	: dm_read_invis
     25  * 		  dm_write_invis
     26  */
     27 #include <string.h>
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <errno.h>
     31 #include <pthread.h>
     32 #include <unistd.h>
     33 #include <sys/stat.h>
     34 #include <sys/mount.h>
     35 #include <fcntl.h>
     36 #include "dm_test.h"
     37 
     38 #define TMP_FILELEN 1000
     39 
     40 pthread_t tid;
     41 dm_sessid_t sid;
     42 char dmMsgBuf[4096];
     43 char command[4096];
     44 char *mountPt;
     45 char *deviceNm;
     46 char DummyFile[FILENAME_MAX];
     47 char DummySubdir[FILENAME_MAX];
     48 char DummyTmp[FILENAME_MAX];
     49 char DummyString[DUMMY_STRLEN];
     50 
     51 /* Variables for thread communications */
     52 dm_eventtype_t eventReceived;
     53 void *hanp1;
     54 size_t hlen1;
     55 dm_off_t offset;
     56 dm_size_t length;
     57 int numRegions;
     58 dm_region_t maxRegions[1], minRegions[1];
     59 
     60 void *Thread(void *);
     61 
     62 void LogStat(struct stat *statfs)
     63 {
     64 
     65 	DMLOG_PRINT(DMLVL_DEBUG, "  st_dev %d\n", statfs->st_dev);
     66 	DMLOG_PRINT(DMLVL_DEBUG, "  st_ino %d\n", statfs->st_ino);
     67 	DMLOG_PRINT(DMLVL_DEBUG, "  st_mode 0x%x\n", statfs->st_mode);
     68 	DMLOG_PRINT(DMLVL_DEBUG, "  st_nlink %d\n", statfs->st_nlink);
     69 	DMLOG_PRINT(DMLVL_DEBUG, "  st_uid %d\n", statfs->st_uid);
     70 	DMLOG_PRINT(DMLVL_DEBUG, "  st_gid %d\n", statfs->st_gid);
     71 	DMLOG_PRINT(DMLVL_DEBUG, "  st_rdev %d\n", statfs->st_rdev);
     72 	DMLOG_PRINT(DMLVL_DEBUG, "  st_size %lld\n", statfs->st_size);
     73 	DMLOG_PRINT(DMLVL_DEBUG, "  st_blksize %d\n", statfs->st_blksize);
     74 	DMLOG_PRINT(DMLVL_DEBUG, "  st_blocks %d\n", statfs->st_blocks);
     75 	DMLOG_PRINT(DMLVL_DEBUG, "  st_atime %d\n", statfs->st_atime);
     76 	DMLOG_PRINT(DMLVL_DEBUG, "  st_mtime %d\n", statfs->st_mtime);
     77 	DMLOG_PRINT(DMLVL_DEBUG, "  st_ctime %d\n", statfs->st_ctime);
     78 
     79 }
     80 
     81 /*
     82  * StatCmp is used instead of memcmp because some of the pad fields or unused
     83  * fields may not be the same even though the pertinent info may be the same
     84  */
     85 int StatCmp(struct stat *stat1, struct stat *stat2)
     86 {
     87 
     88 	if ((stat1->st_dev != stat2->st_dev) ||
     89 	    (stat1->st_ino != stat2->st_ino) ||
     90 	    (stat1->st_mode != stat2->st_mode) ||
     91 	    (stat1->st_nlink != stat2->st_nlink) ||
     92 	    (stat1->st_uid != stat2->st_uid) ||
     93 	    (stat1->st_gid != stat2->st_gid) ||
     94 	    (stat1->st_rdev != stat2->st_rdev) ||
     95 	    (stat1->st_size != stat2->st_size) ||
     96 	    (stat1->st_blksize != stat2->st_blksize) ||
     97 	    (stat1->st_blocks != stat2->st_blocks) ||
     98 	    (stat1->st_atime != stat2->st_atime) ||
     99 	    (stat1->st_mtime != stat2->st_mtime) ||
    100 	    (stat1->st_ctime != stat2->st_ctime)) {
    101 		return -1;
    102 	} else {
    103 		return 0;
    104 	}
    105 
    106 }
    107 
    108 int main(int argc, char **argv)
    109 {
    110 
    111 	char *szFuncName;
    112 	char *varstr;
    113 	int i;
    114 	int rc;
    115 	char *szSessionInfo = "dm_test session info";
    116 	dm_eventset_t events, maxFileEvents, minFileEvents;
    117 
    118 	DMOPT_PARSE(argc, argv);
    119 	DMLOG_START();
    120 
    121 	DMEV_ZERO(events);
    122 	DMEV_SET(DM_EVENT_MOUNT, events);
    123 
    124 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
    125 	if ((rc = dm_init_service(&varstr)) != 0) {
    126 		DMLOG_PRINT(DMLVL_ERR,
    127 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
    128 			    rc, errno);
    129 		DM_EXIT();
    130 	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
    131 		   == -1) {
    132 		DMLOG_PRINT(DMLVL_ERR,
    133 			    "dm_create_session failed! (rc = %d, errno = %d)\n",
    134 			    rc, errno);
    135 		DM_EXIT();
    136 	} else
    137 	    if ((rc =
    138 		 dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN,
    139 			     &events, DM_EVENT_MAX)) == -1) {
    140 		DMLOG_PRINT(DMLVL_ERR,
    141 			    "dm_set_disp failed! (rc = %d, errno = %d)\n", rc,
    142 			    errno);
    143 		dm_destroy_session(sid);
    144 		DM_EXIT();
    145 	} else if ((rc = pthread_create(&tid, NULL, Thread, NULL)) != 0) {
    146 		DMLOG_PRINT(DMLVL_ERR,
    147 			    "pthread_create failed! (rc = %d, errno = %d)\n",
    148 			    rc, errno);
    149 		dm_destroy_session(sid);
    150 		DM_EXIT();
    151 	} else if ((rc = dmimpl_mount(&mountPt, &deviceNm)) == -1) {
    152 		DMLOG_PRINT(DMLVL_ERR,
    153 			    "dmimpl_mount failed! (rc = %d, errno = %d)\n", rc,
    154 			    errno);
    155 		dm_destroy_session(sid);
    156 		DM_EXIT();
    157 	} else {
    158 		int fd;
    159 
    160 		sprintf(DummyFile, "%s/%s", mountPt, DUMMY_FILE);
    161 		sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR);
    162 		sprintf(DummyTmp, "%s/%s", mountPt, DUMMY_TMP);
    163 
    164 		remove(DummyFile);
    165 		rmdir(DummySubdir);
    166 
    167 		memcpy(DummyString, DUMMY_STRING, DUMMY_STRLEN);
    168 
    169 		EVENT_DELIVERY_DELAY;
    170 		fd = open(DummyTmp, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE);
    171 		if (fd != -1) {
    172 			for (i = 0; i < TMP_FILELEN / DUMMY_STRLEN; i++) {
    173 				if (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
    174 				    DUMMY_STRLEN) {
    175 					rc = -1;
    176 					break;
    177 				}
    178 			}
    179 		} else {
    180 			rc = -1;
    181 		}
    182 		if (rc != -1) {
    183 			rc = fsync(fd);
    184 		}
    185 		if (rc != -1) {
    186 			rc = close(fd);
    187 		}
    188 		if (rc == -1) {
    189 			DMLOG_PRINT(DMLVL_ERR,
    190 				    "creating dummy file failed! (rc = %d, errno = %d)\n",
    191 				    rc, errno);
    192 			dm_destroy_session(sid);
    193 			DM_EXIT();
    194 		}
    195 	}
    196 
    197 	numRegions = 1;
    198 	maxRegions[0].rg_offset = 0;
    199 	maxRegions[0].rg_size = 0;
    200 	maxRegions[0].rg_flags =
    201 	    DM_REGION_READ | DM_REGION_WRITE | DM_REGION_TRUNCATE;
    202 	minRegions[0].rg_offset = 0;
    203 	minRegions[0].rg_size = 0;
    204 	minRegions[0].rg_flags = DM_REGION_NOEVENT;
    205 
    206 	DMEV_ZERO(maxFileEvents);
    207 	DMEV_SET(DM_EVENT_PREUNMOUNT, maxFileEvents);
    208 	DMEV_SET(DM_EVENT_UNMOUNT, maxFileEvents);
    209 	DMEV_SET(DM_EVENT_CREATE, maxFileEvents);
    210 	DMEV_SET(DM_EVENT_CLOSE, maxFileEvents);
    211 	DMEV_SET(DM_EVENT_POSTCREATE, maxFileEvents);
    212 	DMEV_SET(DM_EVENT_REMOVE, maxFileEvents);
    213 	DMEV_SET(DM_EVENT_POSTREMOVE, maxFileEvents);
    214 	DMEV_SET(DM_EVENT_RENAME, maxFileEvents);
    215 	DMEV_SET(DM_EVENT_POSTRENAME, maxFileEvents);
    216 	DMEV_SET(DM_EVENT_LINK, maxFileEvents);
    217 	DMEV_SET(DM_EVENT_POSTLINK, maxFileEvents);
    218 	DMEV_SET(DM_EVENT_SYMLINK, maxFileEvents);
    219 	DMEV_SET(DM_EVENT_POSTSYMLINK, maxFileEvents);
    220 	DMEV_SET(DM_EVENT_ATTRIBUTE, maxFileEvents);
    221 
    222 	DMEV_ZERO(minFileEvents);
    223 	DMEV_SET(DM_EVENT_PREUNMOUNT, minFileEvents);
    224 	DMEV_SET(DM_EVENT_UNMOUNT, minFileEvents);
    225 
    226 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI invisible read/write tests\n");
    227 
    228 	szFuncName = "dm_read_invis";
    229 
    230 	/*
    231 	 * TEST    : dm_read_invis - invalid sid
    232 	 * EXPECTED: rc = -1, errno = EINVAL
    233 	 */
    234 	if (DMVAR_EXEC(READ_INVIS_BASE + 1)) {
    235 		void *hanp;
    236 		size_t hlen;
    237 		dm_off_t inoff = 0;
    238 		dm_size_t inlen = DUMMY_STRLEN;
    239 		char buf[DUMMY_STRLEN];
    240 
    241 		/* Variation set up */
    242 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    243 		if ((rc = system(command)) == -1) {
    244 			/* No clean up */
    245 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    246 			   -1) {
    247 			remove(DummyFile);
    248 		}
    249 		if (rc == -1) {
    250 			DMLOG_PRINT(DMLVL_DEBUG,
    251 				    "Unable to set up variation! (errno = %d)\n",
    252 				    errno);
    253 			DMVAR_SKIP();
    254 		} else {
    255 			/* Variation */
    256 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
    257 				    szFuncName);
    258 			rc = dm_read_invis(INVALID_ADDR, hanp, hlen,
    259 					   DM_NO_TOKEN, inoff, inlen, buf);
    260 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    261 
    262 			/* Variation clean up */
    263 			rc = remove(DummyFile);
    264 			if (rc == -1) {
    265 				DMLOG_PRINT(DMLVL_DEBUG,
    266 					    "Unable to clean up variation! (errno = %d)\n",
    267 					    errno);
    268 			}
    269 			dm_handle_free(hanp, hlen);
    270 		}
    271 	}
    272 
    273 	/*
    274 	 * TEST    : dm_read_invis - invalid hanp
    275 	 * EXPECTED: rc = -1, errno = EFAULT
    276 	 */
    277 	if (DMVAR_EXEC(READ_INVIS_BASE + 2)) {
    278 		void *hanp;
    279 		size_t hlen;
    280 		dm_off_t inoff = 0;
    281 		dm_size_t inlen = DUMMY_STRLEN;
    282 		char buf[DUMMY_STRLEN];
    283 
    284 		/* Variation set up */
    285 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    286 		if ((rc = system(command)) == -1) {
    287 			/* No clean up */
    288 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    289 			   -1) {
    290 			remove(DummyFile);
    291 		}
    292 		if (rc == -1) {
    293 			DMLOG_PRINT(DMLVL_DEBUG,
    294 				    "Unable to set up variation! (errno = %d)\n",
    295 				    errno);
    296 			DMVAR_SKIP();
    297 		} else {
    298 			/* Variation */
    299 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
    300 				    szFuncName);
    301 			rc = dm_read_invis(sid, (void *)INVALID_ADDR, hlen,
    302 					   DM_NO_TOKEN, inoff, inlen, buf);
    303 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    304 
    305 			/* Variation clean up */
    306 			rc = remove(DummyFile);
    307 			if (rc == -1) {
    308 				DMLOG_PRINT(DMLVL_DEBUG,
    309 					    "Unable to clean up variation! (errno = %d)\n",
    310 					    errno);
    311 			}
    312 			dm_handle_free(hanp, hlen);
    313 		}
    314 	}
    315 
    316 	/*
    317 	 * TEST    : dm_read_invis - invalid hlen
    318 	 * EXPECTED: rc = -1, errno = EBADF
    319 	 */
    320 	if (DMVAR_EXEC(READ_INVIS_BASE + 3)) {
    321 		void *hanp;
    322 		size_t hlen;
    323 		dm_off_t inoff = 0;
    324 		dm_size_t inlen = DUMMY_STRLEN;
    325 		char buf[DUMMY_STRLEN];
    326 
    327 		/* Variation set up */
    328 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    329 		if ((rc = system(command)) == -1) {
    330 			/* No clean up */
    331 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    332 			   -1) {
    333 			remove(DummyFile);
    334 		}
    335 		if (rc == -1) {
    336 			DMLOG_PRINT(DMLVL_DEBUG,
    337 				    "Unable to set up variation! (errno = %d)\n",
    338 				    errno);
    339 			DMVAR_SKIP();
    340 		} else {
    341 			/* Variation */
    342 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
    343 				    szFuncName);
    344 			rc = dm_read_invis(sid, hanp, INVALID_ADDR, DM_NO_TOKEN,
    345 					   inoff, inlen, buf);
    346 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
    347 
    348 			/* Variation clean up */
    349 			rc = remove(DummyFile);
    350 			if (rc == -1) {
    351 				DMLOG_PRINT(DMLVL_DEBUG,
    352 					    "Unable to clean up variation! (errno = %d)\n",
    353 					    errno);
    354 			}
    355 			dm_handle_free(hanp, hlen);
    356 		}
    357 	}
    358 
    359 	/*
    360 	 * TEST    : dm_read_invis - invalid token
    361 	 * EXPECTED: rc = -1, errno = EINVAL
    362 	 */
    363 	if (DMVAR_EXEC(READ_INVIS_BASE + 4)) {
    364 		void *hanp;
    365 		size_t hlen;
    366 		dm_off_t inoff = 0;
    367 		dm_size_t inlen = DUMMY_STRLEN;
    368 		char buf[DUMMY_STRLEN];
    369 
    370 		/* Variation set up */
    371 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    372 		if ((rc = system(command)) == -1) {
    373 			/* No clean up */
    374 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    375 			   -1) {
    376 			remove(DummyFile);
    377 		}
    378 		if (rc == -1) {
    379 			DMLOG_PRINT(DMLVL_DEBUG,
    380 				    "Unable to set up variation! (errno = %d)\n",
    381 				    errno);
    382 			DMVAR_SKIP();
    383 		} else {
    384 			/* Variation */
    385 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
    386 				    szFuncName);
    387 			rc = dm_read_invis(sid, hanp, hlen, INVALID_ADDR, inoff,
    388 					   inlen, buf);
    389 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    390 
    391 			/* Variation clean up */
    392 			rc = remove(DummyFile);
    393 			if (rc == -1) {
    394 				DMLOG_PRINT(DMLVL_DEBUG,
    395 					    "Unable to clean up variation! (errno = %d)\n",
    396 					    errno);
    397 			}
    398 			dm_handle_free(hanp, hlen);
    399 		}
    400 	}
    401 
    402 	/*
    403 	 * TEST    : dm_read_invis - invalid off
    404 	 * EXPECTED: rc = -1, errno = EINVAL
    405 	 *
    406 	 * This variation uncovered XFS BUG #9 (0 returned instead of -1 and
    407 	 * errno EINVAL)
    408 	 */
    409 	if (DMVAR_EXEC(READ_INVIS_BASE + 5)) {
    410 		void *hanp;
    411 		size_t hlen;
    412 		dm_off_t inoff = TMP_FILELEN + 1;
    413 		dm_size_t inlen = DUMMY_STRLEN;
    414 		char buf[DUMMY_STRLEN];
    415 
    416 		/* Variation set up */
    417 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    418 		if ((rc = system(command)) == -1) {
    419 			/* No clean up */
    420 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    421 			   -1) {
    422 			remove(DummyFile);
    423 		}
    424 		if (rc == -1) {
    425 			DMLOG_PRINT(DMLVL_DEBUG,
    426 				    "Unable to set up variation! (errno = %d)\n",
    427 				    errno);
    428 			DMVAR_SKIP();
    429 		} else {
    430 			/* Variation */
    431 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid off)\n",
    432 				    szFuncName);
    433 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    434 					   inlen, buf);
    435 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    436 
    437 			/* Variation clean up */
    438 			rc = remove(DummyFile);
    439 			if (rc == -1) {
    440 				DMLOG_PRINT(DMLVL_DEBUG,
    441 					    "Unable to clean up variation! (errno = %d)\n",
    442 					    errno);
    443 			}
    444 			dm_handle_free(hanp, hlen);
    445 		}
    446 	}
    447 
    448 	/*
    449 	 * TEST    : dm_read_invis - invalid bufp
    450 	 * EXPECTED: rc = -1, errno = EFAULT
    451 	 */
    452 	if (DMVAR_EXEC(READ_INVIS_BASE + 6)) {
    453 		void *hanp;
    454 		size_t hlen;
    455 		dm_off_t inoff = 0;
    456 		dm_size_t inlen = DUMMY_STRLEN;
    457 
    458 		/* Variation set up */
    459 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    460 		if ((rc = system(command)) == -1) {
    461 			/* No clean up */
    462 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    463 			   -1) {
    464 			remove(DummyFile);
    465 		}
    466 		if (rc == -1) {
    467 			DMLOG_PRINT(DMLVL_DEBUG,
    468 				    "Unable to set up variation! (errno = %d)\n",
    469 				    errno);
    470 			DMVAR_SKIP();
    471 		} else {
    472 			/* Variation */
    473 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
    474 				    szFuncName);
    475 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    476 					   inlen, (void *)INVALID_ADDR);
    477 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    478 
    479 			/* Variation clean up */
    480 			rc = remove(DummyFile);
    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_read_invis - file start
    492 	 * EXPECTED: rc = DUMMY_STRLEN
    493 	 */
    494 	if (DMVAR_EXEC(READ_INVIS_BASE + 7)) {
    495 		void *hanp, *fshanp;
    496 		size_t hlen, fshlen;
    497 		dm_off_t inoff = 0;
    498 		dm_size_t inlen = DUMMY_STRLEN;
    499 		char buf[DUMMY_STRLEN];
    500 		struct stat statfs1, statfs2;
    501 		int errnoSaved = 0;
    502 		dm_boolean_t exactflag;
    503 		int rc2;
    504 
    505 		/* Variation set up */
    506 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    507 		if ((rc = system(command)) == -1) {
    508 			/* No clean up */
    509 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    510 			   -1) {
    511 			remove(DummyFile);
    512 		} else
    513 		    if ((rc =
    514 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
    515 					       &fshlen)) == -1) {
    516 			dm_handle_free(hanp, hlen);
    517 			remove(DummyFile);
    518 		} else
    519 		    if (((rc =
    520 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    521 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
    522 			||
    523 			((rc =
    524 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
    525 					numRegions, maxRegions,
    526 					&exactflag)) == -1)
    527 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
    528 			dm_handle_free(fshanp, fshlen);
    529 			dm_handle_free(hanp, hlen);
    530 			remove(DummyFile);
    531 		}
    532 		if (rc == -1) {
    533 			DMLOG_PRINT(DMLVL_DEBUG,
    534 				    "Unable to set up variation! %d\n", errno);
    535 			DMVAR_SKIP();
    536 		} else {
    537 			/* Variation */
    538 			TIMESTAMP_DELAY;
    539 			eventReceived = DM_EVENT_INVALID;
    540 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file start)\n",
    541 				    szFuncName);
    542 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    543 					   inlen, buf);
    544 			errnoSaved = errno;
    545 			EVENT_DELIVERY_DELAY;
    546 			rc2 = stat(DummyFile, &statfs2);
    547 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
    548 				      minRegions, &exactflag);
    549 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    550 					 &minFileEvents, DM_EVENT_MAX);
    551 			if (rc == inlen) {
    552 				DMLOG_PRINT(DMLVL_DEBUG, "read %d bytes\n", rc);
    553 				if (memcmp(buf, DUMMY_STRING, DUMMY_STRLEN) ==
    554 				    0) {
    555 					DMLOG_PRINT(DMLVL_DEBUG,
    556 						    "buffer contents [%.*s]\n",
    557 						    rc, buf);
    558 					if (eventReceived == DM_EVENT_INVALID) {
    559 						DMLOG_PRINT(DMLVL_DEBUG,
    560 							    "no event received\n");
    561 						if ((rc2 == 0)
    562 						    &&
    563 						    (StatCmp(&statfs1, &statfs2)
    564 						     == 0)) {
    565 							DMLOG_PRINT(DMLVL_DEBUG,
    566 								    "stat info same\n");
    567 							DMVAR_PASS();
    568 						} else {
    569 							DMLOG_PRINT(DMLVL_ERR,
    570 								    "stat info NOT same!\n");
    571 							DMLOG_PRINT(DMLVL_DEBUG,
    572 								    "stat info before:\n");
    573 							LogStat(&statfs1);
    574 							DMLOG_PRINT(DMLVL_DEBUG,
    575 								    "stat info after:\n");
    576 							LogStat(&statfs2);
    577 							DMVAR_FAIL();
    578 						}
    579 					} else {
    580 						DMLOG_PRINT(DMLVL_ERR,
    581 							    "event %d received!\n",
    582 							    eventReceived);
    583 						DMVAR_FAIL();
    584 					}
    585 				} else {
    586 					DMLOG_PRINT(DMLVL_ERR,
    587 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
    588 						    DUMMY_STRLEN, DUMMY_STRING,
    589 						    rc, buf);
    590 					DMVAR_FAIL();
    591 				}
    592 			} else {
    593 				DMLOG_PRINT(DMLVL_ERR,
    594 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    595 					    szFuncName, rc, errnoSaved);
    596 				DMVAR_FAIL();
    597 			}
    598 
    599 			/* Variation clean up */
    600 			rc = remove(DummyFile);
    601 			if (rc == -1) {
    602 				DMLOG_PRINT(DMLVL_DEBUG,
    603 					    "Unable to clean up variation! (errno = %d)\n",
    604 					    errno);
    605 			}
    606 			dm_handle_free(fshanp, fshlen);
    607 			dm_handle_free(hanp, hlen);
    608 		}
    609 	}
    610 
    611 	/*
    612 	 * TEST    : dm_read_invis - file middle
    613 	 * EXPECTED: rc = DUMMY_STRLEN
    614 	 */
    615 	if (DMVAR_EXEC(READ_INVIS_BASE + 8)) {
    616 		void *hanp, *fshanp;
    617 		size_t hlen, fshlen;
    618 		dm_off_t inoff = (TMP_FILELEN / 2) - ((TMP_FILELEN / 2) % 10);
    619 		dm_size_t inlen = DUMMY_STRLEN;
    620 		char buf[DUMMY_STRLEN];
    621 		struct stat statfs1, statfs2;
    622 		int errnoSaved = 0;
    623 		dm_boolean_t exactflag;
    624 		int rc2;
    625 
    626 		/* Variation set up */
    627 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    628 		if ((rc = system(command)) == -1) {
    629 			/* No clean up */
    630 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    631 			   -1) {
    632 			remove(DummyFile);
    633 		} else
    634 		    if ((rc =
    635 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
    636 					       &fshlen)) == -1) {
    637 			dm_handle_free(hanp, hlen);
    638 			remove(DummyFile);
    639 		} else
    640 		    if (((rc =
    641 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    642 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
    643 			||
    644 			((rc =
    645 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
    646 					numRegions, maxRegions,
    647 					&exactflag)) == -1)
    648 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
    649 			dm_handle_free(fshanp, fshlen);
    650 			dm_handle_free(hanp, hlen);
    651 			remove(DummyFile);
    652 		}
    653 		if (rc == -1) {
    654 			DMLOG_PRINT(DMLVL_DEBUG,
    655 				    "Unable to set up variation! %d\n", errno);
    656 			DMVAR_SKIP();
    657 		} else {
    658 			/* Variation */
    659 			TIMESTAMP_DELAY;
    660 			eventReceived = DM_EVENT_INVALID;
    661 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file middle)\n",
    662 				    szFuncName);
    663 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    664 					   inlen, buf);
    665 			errnoSaved = errno;
    666 			EVENT_DELIVERY_DELAY;
    667 			rc2 = stat(DummyFile, &statfs2);
    668 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
    669 				      minRegions, &exactflag);
    670 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    671 					 &minFileEvents, DM_EVENT_MAX);
    672 			if (rc == inlen) {
    673 				DMLOG_PRINT(DMLVL_DEBUG, "read %d bytes\n", rc);
    674 				if (memcmp(buf, DUMMY_STRING, DUMMY_STRLEN) ==
    675 				    0) {
    676 					DMLOG_PRINT(DMLVL_DEBUG,
    677 						    "buffer contents [%.*s]\n",
    678 						    rc, buf);
    679 					if (eventReceived == DM_EVENT_INVALID) {
    680 						DMLOG_PRINT(DMLVL_DEBUG,
    681 							    "no event received\n");
    682 						if ((rc2 == 0)
    683 						    &&
    684 						    (StatCmp(&statfs1, &statfs2)
    685 						     == 0)) {
    686 							DMLOG_PRINT(DMLVL_DEBUG,
    687 								    "stat info same\n");
    688 							DMVAR_PASS();
    689 						} else {
    690 							DMLOG_PRINT(DMLVL_ERR,
    691 								    "stat info NOT same!\n");
    692 							DMLOG_PRINT(DMLVL_DEBUG,
    693 								    "stat info before:\n");
    694 							LogStat(&statfs1);
    695 							DMLOG_PRINT(DMLVL_DEBUG,
    696 								    "stat info after:\n");
    697 							LogStat(&statfs2);
    698 							DMVAR_FAIL();
    699 						}
    700 					} else {
    701 						DMLOG_PRINT(DMLVL_ERR,
    702 							    "event %d received!\n",
    703 							    eventReceived);
    704 						DMVAR_FAIL();
    705 					}
    706 				} else {
    707 					DMLOG_PRINT(DMLVL_ERR,
    708 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
    709 						    DUMMY_STRLEN, DUMMY_STRING,
    710 						    rc, buf);
    711 					DMVAR_FAIL();
    712 				}
    713 			} else {
    714 				DMLOG_PRINT(DMLVL_ERR,
    715 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    716 					    szFuncName, rc, errnoSaved);
    717 				DMVAR_FAIL();
    718 			}
    719 
    720 			/* Variation clean up */
    721 			rc = remove(DummyFile);
    722 			if (rc == -1) {
    723 				DMLOG_PRINT(DMLVL_DEBUG,
    724 					    "Unable to clean up variation! (errno = %d)\n",
    725 					    errno);
    726 			}
    727 			dm_handle_free(fshanp, fshlen);
    728 			dm_handle_free(hanp, hlen);
    729 		}
    730 	}
    731 
    732 	/*
    733 	 * TEST    : dm_read_invis - file end
    734 	 * EXPECTED: rc = DUMMY_STRLEN
    735 	 */
    736 	if (DMVAR_EXEC(READ_INVIS_BASE + 9)) {
    737 		void *hanp, *fshanp;
    738 		size_t hlen, fshlen;
    739 		dm_off_t inoff = TMP_FILELEN - DUMMY_STRLEN;
    740 		dm_size_t inlen = DUMMY_STRLEN;
    741 		char buf[DUMMY_STRLEN];
    742 		struct stat statfs1, statfs2;
    743 		int errnoSaved = 0;
    744 		dm_boolean_t exactflag;
    745 		int rc2;
    746 
    747 		/* Variation set up */
    748 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    749 		if ((rc = system(command)) == -1) {
    750 			/* No clean up */
    751 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    752 			   -1) {
    753 			remove(DummyFile);
    754 		} else
    755 		    if ((rc =
    756 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
    757 					       &fshlen)) == -1) {
    758 			dm_handle_free(hanp, hlen);
    759 			remove(DummyFile);
    760 		} else
    761 		    if (((rc =
    762 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    763 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
    764 			||
    765 			((rc =
    766 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
    767 					numRegions, maxRegions,
    768 					&exactflag)) == -1)
    769 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
    770 			dm_handle_free(fshanp, fshlen);
    771 			dm_handle_free(hanp, hlen);
    772 			remove(DummyFile);
    773 		}
    774 		if (rc == -1) {
    775 			DMLOG_PRINT(DMLVL_DEBUG,
    776 				    "Unable to set up variation! %d\n", errno);
    777 			DMVAR_SKIP();
    778 		} else {
    779 			/* Variation */
    780 			TIMESTAMP_DELAY;
    781 			eventReceived = DM_EVENT_INVALID;
    782 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file end)\n", szFuncName);
    783 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    784 					   inlen, buf);
    785 			errnoSaved = errno;
    786 			EVENT_DELIVERY_DELAY;
    787 			rc2 = stat(DummyFile, &statfs2);
    788 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
    789 				      minRegions, &exactflag);
    790 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    791 					 &minFileEvents, DM_EVENT_MAX);
    792 			if (rc == inlen) {
    793 				DMLOG_PRINT(DMLVL_DEBUG, "read %d bytes\n", rc);
    794 				if (memcmp(buf, DUMMY_STRING, DUMMY_STRLEN) ==
    795 				    0) {
    796 					DMLOG_PRINT(DMLVL_DEBUG,
    797 						    "buffer contents [%.*s]\n",
    798 						    rc, buf);
    799 					if (eventReceived == DM_EVENT_INVALID) {
    800 						DMLOG_PRINT(DMLVL_DEBUG,
    801 							    "no event received\n");
    802 						if ((rc2 == 0)
    803 						    &&
    804 						    (StatCmp(&statfs1, &statfs2)
    805 						     == 0)) {
    806 							DMLOG_PRINT(DMLVL_DEBUG,
    807 								    "stat info same\n");
    808 							DMVAR_PASS();
    809 						} else {
    810 							DMLOG_PRINT(DMLVL_ERR,
    811 								    "stat info NOT same!\n");
    812 							DMLOG_PRINT(DMLVL_DEBUG,
    813 								    "stat info before:\n");
    814 							LogStat(&statfs1);
    815 							DMLOG_PRINT(DMLVL_DEBUG,
    816 								    "stat info after:\n");
    817 							LogStat(&statfs2);
    818 							DMVAR_FAIL();
    819 						}
    820 					} else {
    821 						DMLOG_PRINT(DMLVL_ERR,
    822 							    "event %d received!\n",
    823 							    eventReceived);
    824 						DMVAR_FAIL();
    825 					}
    826 				} else {
    827 					DMLOG_PRINT(DMLVL_ERR,
    828 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
    829 						    DUMMY_STRLEN, DUMMY_STRING,
    830 						    rc, buf);
    831 					DMVAR_FAIL();
    832 				}
    833 			} else {
    834 				DMLOG_PRINT(DMLVL_ERR,
    835 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    836 					    szFuncName, rc, errnoSaved);
    837 				DMVAR_FAIL();
    838 			}
    839 
    840 			/* Variation clean up */
    841 			rc = remove(DummyFile);
    842 			if (rc == -1) {
    843 				DMLOG_PRINT(DMLVL_DEBUG,
    844 					    "Unable to clean up variation! (errno = %d)\n",
    845 					    errno);
    846 			}
    847 			dm_handle_free(fshanp, fshlen);
    848 			dm_handle_free(hanp, hlen);
    849 		}
    850 	}
    851 
    852 	/*
    853 	 * TEST    : dm_read_invis - overlaps file end
    854 	 * EXPECTED: rc = DUMMY_STRLEN/2
    855 	 */
    856 	if (DMVAR_EXEC(READ_INVIS_BASE + 10)) {
    857 		void *hanp, *fshanp;
    858 		size_t hlen, fshlen;
    859 		dm_off_t inoff = TMP_FILELEN - (DUMMY_STRLEN / 2);
    860 		dm_size_t inlen = DUMMY_STRLEN;
    861 		char buf[DUMMY_STRLEN];
    862 		struct stat statfs1, statfs2;
    863 		int errnoSaved = 0;
    864 		dm_boolean_t exactflag;
    865 		int rc2;
    866 
    867 		/* Variation set up */
    868 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    869 		if ((rc = system(command)) == -1) {
    870 			/* No clean up */
    871 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    872 			   -1) {
    873 			remove(DummyFile);
    874 		} else
    875 		    if ((rc =
    876 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
    877 					       &fshlen)) == -1) {
    878 			dm_handle_free(hanp, hlen);
    879 			remove(DummyFile);
    880 		} else
    881 		    if (((rc =
    882 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    883 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
    884 			||
    885 			((rc =
    886 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
    887 					numRegions, maxRegions,
    888 					&exactflag)) == -1)
    889 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
    890 			dm_handle_free(fshanp, fshlen);
    891 			dm_handle_free(hanp, hlen);
    892 			remove(DummyFile);
    893 		}
    894 		if (rc == -1) {
    895 			DMLOG_PRINT(DMLVL_DEBUG,
    896 				    "Unable to set up variation! %d\n", errno);
    897 			DMVAR_SKIP();
    898 		} else {
    899 			/* Variation */
    900 			TIMESTAMP_DELAY;
    901 			eventReceived = DM_EVENT_INVALID;
    902 			DMLOG_PRINT(DMLVL_DEBUG, "%s(overlaps file end)\n",
    903 				    szFuncName);
    904 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
    905 					   inlen, buf);
    906 			errnoSaved = errno;
    907 			EVENT_DELIVERY_DELAY;
    908 			rc2 = stat(DummyFile, &statfs2);
    909 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
    910 				      minRegions, &exactflag);
    911 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
    912 					 &minFileEvents, DM_EVENT_MAX);
    913 			if (rc == DUMMY_STRLEN / 2) {
    914 				DMLOG_PRINT(DMLVL_DEBUG, "read %d bytes\n", rc);
    915 				if (memcmp
    916 				    (buf, DummyString + (DUMMY_STRLEN / 2),
    917 				     DUMMY_STRLEN / 2) == 0) {
    918 					DMLOG_PRINT(DMLVL_DEBUG,
    919 						    "buffer contents [%.*s]\n",
    920 						    rc, buf);
    921 					if (eventReceived == DM_EVENT_INVALID) {
    922 						DMLOG_PRINT(DMLVL_DEBUG,
    923 							    "no event received\n");
    924 						if ((rc2 == 0)
    925 						    &&
    926 						    (StatCmp(&statfs1, &statfs2)
    927 						     == 0)) {
    928 							DMLOG_PRINT(DMLVL_DEBUG,
    929 								    "stat info same\n");
    930 							DMVAR_PASS();
    931 						} else {
    932 							DMLOG_PRINT(DMLVL_ERR,
    933 								    "stat info NOT same!\n");
    934 							DMLOG_PRINT(DMLVL_DEBUG,
    935 								    "stat info before:\n");
    936 							LogStat(&statfs1);
    937 							DMLOG_PRINT(DMLVL_DEBUG,
    938 								    "stat info after:\n");
    939 							LogStat(&statfs2);
    940 							DMVAR_FAIL();
    941 						}
    942 					} else {
    943 						DMLOG_PRINT(DMLVL_ERR,
    944 							    "event %d received!\n",
    945 							    eventReceived);
    946 						DMVAR_FAIL();
    947 					}
    948 				} else {
    949 					DMLOG_PRINT(DMLVL_ERR,
    950 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
    951 						    DUMMY_STRLEN, DUMMY_STRING,
    952 						    rc, buf);
    953 					DMVAR_FAIL();
    954 				}
    955 			} else {
    956 				DMLOG_PRINT(DMLVL_ERR,
    957 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    958 					    szFuncName, rc, errnoSaved);
    959 				DMVAR_FAIL();
    960 			}
    961 
    962 			/* Variation clean up */
    963 			rc = remove(DummyFile);
    964 			if (rc == -1) {
    965 				DMLOG_PRINT(DMLVL_DEBUG,
    966 					    "Unable to clean up variation! (errno = %d)\n",
    967 					    errno);
    968 			}
    969 			dm_handle_free(fshanp, fshlen);
    970 			dm_handle_free(hanp, hlen);
    971 		}
    972 	}
    973 
    974 	/*
    975 	 * TEST    : dm_read_invis - DM_NO_SESSION sid
    976 	 * EXPECTED: rc = -1, errno = EINVAL
    977 	 */
    978 	if (DMVAR_EXEC(READ_INVIS_BASE + 11)) {
    979 		void *hanp;
    980 		size_t hlen;
    981 		dm_off_t inoff = 0;
    982 		dm_size_t inlen = DUMMY_STRLEN;
    983 		char buf[DUMMY_STRLEN];
    984 
    985 		/* Variation set up */
    986 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
    987 		if ((rc = system(command)) == -1) {
    988 			/* No clean up */
    989 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
    990 			   -1) {
    991 			remove(DummyFile);
    992 		}
    993 		if (rc == -1) {
    994 			DMLOG_PRINT(DMLVL_DEBUG,
    995 				    "Unable to set up variation! (errno = %d)\n",
    996 				    errno);
    997 			DMVAR_SKIP();
    998 		} else {
    999 			/* Variation */
   1000 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   1001 				    szFuncName);
   1002 			rc = dm_read_invis(DM_NO_SESSION, hanp, hlen,
   1003 					   DM_NO_TOKEN, inoff, inlen, buf);
   1004 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1005 
   1006 			/* Variation clean up */
   1007 			rc = remove(DummyFile);
   1008 			if (rc == -1) {
   1009 				DMLOG_PRINT(DMLVL_DEBUG,
   1010 					    "Unable to clean up variation! (errno = %d)\n",
   1011 					    errno);
   1012 			}
   1013 			dm_handle_free(hanp, hlen);
   1014 		}
   1015 	}
   1016 
   1017 	/*
   1018 	 * TEST    : dm_read_invis - directory handle
   1019 	 * EXPECTED: rc = -1, errno = EINVAL
   1020 	 */
   1021 	if (DMVAR_EXEC(READ_INVIS_BASE + 12)) {
   1022 		void *hanp;
   1023 		size_t hlen;
   1024 		dm_off_t inoff = 0;
   1025 		dm_size_t inlen = DUMMY_STRLEN;
   1026 		char buf[DUMMY_STRLEN];
   1027 
   1028 		/* Variation set up */
   1029 		if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
   1030 			/* No clean up */
   1031 		} else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen))
   1032 			   == -1) {
   1033 			rmdir(DummySubdir);
   1034 		}
   1035 		if (rc == -1) {
   1036 			DMLOG_PRINT(DMLVL_DEBUG,
   1037 				    "Unable to set up variation! (errno = %d)\n",
   1038 				    errno);
   1039 			DMVAR_SKIP();
   1040 		} else {
   1041 			/* Variation */
   1042 			DMLOG_PRINT(DMLVL_DEBUG, "%s(directory handle)\n",
   1043 				    szFuncName);
   1044 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
   1045 					   inlen, buf);
   1046 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1047 
   1048 			/* Variation clean up */
   1049 			rc = rmdir(DummySubdir);
   1050 			if (rc == -1) {
   1051 				DMLOG_PRINT(DMLVL_DEBUG,
   1052 					    "Unable to clean up variation! (errno = %d)\n",
   1053 					    errno);
   1054 			}
   1055 			dm_handle_free(hanp, hlen);
   1056 		}
   1057 	}
   1058 
   1059 	/*
   1060 	 * TEST    : dm_read_invis - fs handle
   1061 	 * EXPECTED: rc = -1, errno = EINVAL
   1062 	 */
   1063 	if (DMVAR_EXEC(READ_INVIS_BASE + 13)) {
   1064 		void *hanp;
   1065 		size_t hlen;
   1066 		dm_off_t inoff = 0;
   1067 		dm_size_t inlen = DUMMY_STRLEN;
   1068 		char buf[DUMMY_STRLEN];
   1069 
   1070 		/* Variation set up */
   1071 		if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
   1072 			/* No clean up */
   1073 		} else if ((rc = dm_path_to_fshandle(DummySubdir, &hanp, &hlen))
   1074 			   == -1) {
   1075 			rmdir(DummySubdir);
   1076 		}
   1077 		if (rc == -1) {
   1078 			DMLOG_PRINT(DMLVL_DEBUG,
   1079 				    "Unable to set up variation! (errno = %d)\n",
   1080 				    errno);
   1081 			DMVAR_SKIP();
   1082 		} else {
   1083 			/* Variation */
   1084 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   1085 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
   1086 					   inlen, buf);
   1087 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1088 
   1089 			/* Variation clean up */
   1090 			rc = rmdir(DummySubdir);
   1091 			if (rc == -1) {
   1092 				DMLOG_PRINT(DMLVL_DEBUG,
   1093 					    "Unable to clean up variation! (errno = %d)\n",
   1094 					    errno);
   1095 			}
   1096 			dm_handle_free(hanp, hlen);
   1097 		}
   1098 	}
   1099 
   1100 	/*
   1101 	 * TEST    : dm_read_invis - global handle
   1102 	 * EXPECTED: rc = -1, errno = EBADF
   1103 	 */
   1104 	if (DMVAR_EXEC(READ_INVIS_BASE + 14)) {
   1105 		dm_off_t inoff = 0;
   1106 		dm_size_t inlen = DUMMY_STRLEN;
   1107 		char buf[DUMMY_STRLEN];
   1108 
   1109 		/* Variation set up */
   1110 
   1111 		/* Variation */
   1112 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   1113 		rc = dm_read_invis(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   1114 				   DM_NO_TOKEN, inoff, inlen, buf);
   1115 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1116 
   1117 		/* Variation clean up */
   1118 	}
   1119 
   1120 	/*
   1121 	 * TEST    : dm_read_invis - invalidated hanp
   1122 	 * EXPECTED: rc = -1, errno = EBADF
   1123 	 */
   1124 	if (DMVAR_EXEC(READ_INVIS_BASE + 15)) {
   1125 		void *hanp;
   1126 		size_t hlen;
   1127 		dm_off_t inoff = 0;
   1128 		dm_size_t inlen = DUMMY_STRLEN;
   1129 		char buf[DUMMY_STRLEN];
   1130 
   1131 		/* Variation set up */
   1132 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1133 		if ((rc = system(command)) == -1) {
   1134 			/* No clean up */
   1135 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1136 			   -1) {
   1137 			remove(DummyFile);
   1138 		} else if ((rc = remove(DummyFile)) == -1) {
   1139 			dm_handle_free(hanp, hlen);
   1140 		}
   1141 		if (rc == -1) {
   1142 			DMLOG_PRINT(DMLVL_DEBUG,
   1143 				    "Unable to set up variation! (errno = %d)\n",
   1144 				    errno);
   1145 			DMVAR_SKIP();
   1146 		} else {
   1147 			/* Variation */
   1148 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   1149 				    szFuncName);
   1150 			rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, inoff,
   1151 					   inlen, buf);
   1152 			DMLOG_PRINT(DMLVL_DEBUG, "GOT %d, %s\n", rc, buf);
   1153 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1154 
   1155 			/* Variation clean up */
   1156 			dm_handle_free(hanp, hlen);
   1157 		}
   1158 	}
   1159 
   1160 	szFuncName = "dm_write_invis";
   1161 
   1162 	/*
   1163 	 * TEST    : dm_write_invis - invalid sid
   1164 	 * EXPECTED: rc = -1, errno = EINVAL
   1165 	 */
   1166 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 1)) {
   1167 		void *hanp;
   1168 		size_t hlen;
   1169 		dm_off_t outoff = 0;
   1170 		dm_size_t outlen = DUMMY_STRLEN;
   1171 		char buf[DUMMY_STRLEN];
   1172 
   1173 		/* Variation set up */
   1174 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1175 		if ((rc = system(command)) == -1) {
   1176 			/* No clean up */
   1177 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1178 			   -1) {
   1179 			remove(DummyFile);
   1180 		}
   1181 		if (rc == -1) {
   1182 			DMLOG_PRINT(DMLVL_DEBUG,
   1183 				    "Unable to set up variation! (errno = %d)\n",
   1184 				    errno);
   1185 			DMVAR_SKIP();
   1186 		} else {
   1187 			/* Variation */
   1188 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   1189 				    szFuncName);
   1190 			rc = dm_write_invis(INVALID_ADDR, hanp, hlen,
   1191 					    DM_NO_TOKEN, 0, outoff, outlen,
   1192 					    buf);
   1193 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1194 
   1195 			/* Variation clean up */
   1196 			rc = remove(DummyFile);
   1197 			if (rc == -1) {
   1198 				DMLOG_PRINT(DMLVL_DEBUG,
   1199 					    "Unable to clean up variation! (errno = %d)\n",
   1200 					    errno);
   1201 			}
   1202 			dm_handle_free(hanp, hlen);
   1203 		}
   1204 	}
   1205 
   1206 	/*
   1207 	 * TEST    : dm_write_invis - invalid hanp
   1208 	 * EXPECTED: rc = -1, errno = EFAULT
   1209 	 */
   1210 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 2)) {
   1211 		void *hanp;
   1212 		size_t hlen;
   1213 		dm_off_t outoff = 0;
   1214 		dm_size_t outlen = DUMMY_STRLEN;
   1215 		char buf[DUMMY_STRLEN];
   1216 
   1217 		/* Variation set up */
   1218 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1219 		if ((rc = system(command)) == -1) {
   1220 			/* No clean up */
   1221 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1222 			   -1) {
   1223 			remove(DummyFile);
   1224 		}
   1225 		if (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 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   1233 				    szFuncName);
   1234 			rc = dm_write_invis(sid, (void *)INVALID_ADDR, hlen,
   1235 					    DM_NO_TOKEN, 0, outoff, outlen,
   1236 					    buf);
   1237 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1238 
   1239 			/* Variation clean up */
   1240 			rc = remove(DummyFile);
   1241 			if (rc == -1) {
   1242 				DMLOG_PRINT(DMLVL_DEBUG,
   1243 					    "Unable to clean up variation! (errno = %d)\n",
   1244 					    errno);
   1245 			}
   1246 			dm_handle_free(hanp, hlen);
   1247 		}
   1248 	}
   1249 
   1250 	/*
   1251 	 * TEST    : dm_write_invis - invalid hlen
   1252 	 * EXPECTED: rc = -1, errno = EBADF
   1253 	 */
   1254 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 3)) {
   1255 		void *hanp;
   1256 		size_t hlen;
   1257 		dm_off_t outoff = 0;
   1258 		dm_size_t outlen = DUMMY_STRLEN;
   1259 		char buf[DUMMY_STRLEN];
   1260 
   1261 		/* Variation set up */
   1262 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1263 		if ((rc = system(command)) == -1) {
   1264 			/* No clean up */
   1265 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1266 			   -1) {
   1267 			remove(DummyFile);
   1268 		}
   1269 		if (rc == -1) {
   1270 			DMLOG_PRINT(DMLVL_DEBUG,
   1271 				    "Unable to set up variation! (errno = %d)\n",
   1272 				    errno);
   1273 			DMVAR_SKIP();
   1274 		} else {
   1275 			/* Variation */
   1276 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   1277 				    szFuncName);
   1278 			rc = dm_write_invis(sid, hanp, INVALID_ADDR,
   1279 					    DM_NO_TOKEN, 0, outoff, outlen,
   1280 					    buf);
   1281 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1282 
   1283 			/* Variation clean up */
   1284 			rc = remove(DummyFile);
   1285 			if (rc == -1) {
   1286 				DMLOG_PRINT(DMLVL_DEBUG,
   1287 					    "Unable to clean up variation! (errno = %d)\n",
   1288 					    errno);
   1289 			}
   1290 			dm_handle_free(hanp, hlen);
   1291 		}
   1292 	}
   1293 
   1294 	/*
   1295 	 * TEST    : dm_write_invis - invalid token
   1296 	 * EXPECTED: rc = -1, errno = EINVAL
   1297 	 */
   1298 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 4)) {
   1299 		void *hanp;
   1300 		size_t hlen;
   1301 		dm_off_t outoff = 0;
   1302 		dm_size_t outlen = DUMMY_STRLEN;
   1303 		char buf[DUMMY_STRLEN];
   1304 
   1305 		/* Variation set up */
   1306 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1307 		if ((rc = system(command)) == -1) {
   1308 			/* No clean up */
   1309 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1310 			   -1) {
   1311 			remove(DummyFile);
   1312 		}
   1313 		if (rc == -1) {
   1314 			DMLOG_PRINT(DMLVL_DEBUG,
   1315 				    "Unable to set up variation! (errno = %d)\n",
   1316 				    errno);
   1317 			DMVAR_SKIP();
   1318 		} else {
   1319 			/* Variation */
   1320 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   1321 				    szFuncName);
   1322 			rc = dm_write_invis(sid, hanp, hlen, INVALID_ADDR, 0,
   1323 					    outoff, outlen, buf);
   1324 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1325 
   1326 			/* Variation clean up */
   1327 			rc = remove(DummyFile);
   1328 			if (rc == -1) {
   1329 				DMLOG_PRINT(DMLVL_DEBUG,
   1330 					    "Unable to clean up variation! (errno = %d)\n",
   1331 					    errno);
   1332 			}
   1333 			dm_handle_free(hanp, hlen);
   1334 		}
   1335 	}
   1336 
   1337 	/*
   1338 	 * TEST    : dm_write_invis - invalid off+len
   1339 	 * EXPECTED: rc = -1, errno = EFBIG
   1340 	 */
   1341 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 5)) {
   1342 		void *hanp;
   1343 		size_t hlen;
   1344 		dm_off_t outoff = MAXFILESIZE - 5;
   1345 		dm_size_t outlen = TMP_FILELEN;
   1346 		char buf[DUMMY_STRLEN];
   1347 
   1348 		/* Variation set up */
   1349 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1350 		if ((rc = system(command)) == -1) {
   1351 			/* No clean up */
   1352 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1353 			   -1) {
   1354 			remove(DummyFile);
   1355 		}
   1356 		if (rc == -1) {
   1357 			DMLOG_PRINT(DMLVL_DEBUG,
   1358 				    "Unable to set up variation! (errno = %d)\n",
   1359 				    errno);
   1360 			DMVAR_SKIP();
   1361 		} else {
   1362 			/* Variation */
   1363 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid off+len)\n",
   1364 				    szFuncName);
   1365 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   1366 					    outoff, outlen, buf);
   1367 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFBIG);
   1368 
   1369 			/* Variation clean up */
   1370 			rc = remove(DummyFile);
   1371 			if (rc == -1) {
   1372 				DMLOG_PRINT(DMLVL_DEBUG,
   1373 					    "Unable to clean up variation! (errno = %d)\n",
   1374 					    errno);
   1375 			}
   1376 			dm_handle_free(hanp, hlen);
   1377 		}
   1378 	}
   1379 
   1380 	/*
   1381 	 * TEST    : dm_write_invis - invalid bufp
   1382 	 * EXPECTED: rc = -1, errno = EFAULT
   1383 	 */
   1384 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 6)) {
   1385 		void *hanp;
   1386 		size_t hlen;
   1387 		dm_off_t outoff = 0;
   1388 		dm_size_t outlen = DUMMY_STRLEN;
   1389 
   1390 		/* Variation set up */
   1391 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1392 		if ((rc = system(command)) == -1) {
   1393 			/* No clean up */
   1394 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1395 			   -1) {
   1396 			remove(DummyFile);
   1397 		}
   1398 		if (rc == -1) {
   1399 			DMLOG_PRINT(DMLVL_DEBUG,
   1400 				    "Unable to set up variation! (errno = %d)\n",
   1401 				    errno);
   1402 			DMVAR_SKIP();
   1403 		} else {
   1404 			/* Variation */
   1405 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
   1406 				    szFuncName);
   1407 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   1408 					    outoff, outlen,
   1409 					    (void *)INVALID_ADDR);
   1410 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1411 
   1412 			/* Variation clean up */
   1413 			rc = remove(DummyFile);
   1414 			if (rc == -1) {
   1415 				DMLOG_PRINT(DMLVL_DEBUG,
   1416 					    "Unable to clean up variation! (errno = %d)\n",
   1417 					    errno);
   1418 			}
   1419 			dm_handle_free(hanp, hlen);
   1420 		}
   1421 	}
   1422 
   1423 	/*
   1424 	 * TEST    : dm_write_invis - file start, async
   1425 	 * EXPECTED: rc = DUMMY_STRLEN
   1426 	 */
   1427 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 7)) {
   1428 		int fd;
   1429 		void *hanp, *fshanp;
   1430 		size_t hlen, fshlen;
   1431 		dm_off_t outoff = 0;
   1432 		dm_size_t outlen = DUMMY_STRLEN;
   1433 		char buf[DUMMY_STRLEN];
   1434 		struct stat statfs1, statfs2;
   1435 		int errnoSaved = 0;
   1436 		dm_boolean_t exactflag;
   1437 		int rc2;
   1438 
   1439 		/* Variation set up */
   1440 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1441 		if ((rc = system(command)) == -1) {
   1442 			/* No clean up */
   1443 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   1444 			remove(DummyFile);
   1445 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1446 			   -1) {
   1447 			close(fd);
   1448 			remove(DummyFile);
   1449 		} else
   1450 		    if ((rc =
   1451 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   1452 					       &fshlen)) == -1) {
   1453 			dm_handle_free(hanp, hlen);
   1454 			close(fd);
   1455 			remove(DummyFile);
   1456 		} else
   1457 		    if (((rc =
   1458 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1459 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   1460 			||
   1461 			((rc =
   1462 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   1463 					numRegions, maxRegions,
   1464 					&exactflag)) == -1)
   1465 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   1466 			dm_handle_free(fshanp, fshlen);
   1467 			dm_handle_free(hanp, hlen);
   1468 			close(fd);
   1469 			remove(DummyFile);
   1470 		}
   1471 		if (fd == -1 || rc == -1) {
   1472 			DMLOG_PRINT(DMLVL_DEBUG,
   1473 				    "Unable to set up variation! %d\n", errno);
   1474 			DMVAR_SKIP();
   1475 		} else {
   1476 			/* Variation */
   1477 			TIMESTAMP_DELAY;
   1478 			eventReceived = DM_EVENT_INVALID;
   1479 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file start, async)\n",
   1480 				    szFuncName);
   1481 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   1482 					    outoff, outlen, DUMMY_STRING2);
   1483 			errnoSaved = errno;
   1484 			EVENT_DELIVERY_DELAY;
   1485 			rc2 = stat(DummyFile, &statfs2);
   1486 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   1487 				      minRegions, &exactflag);
   1488 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1489 					 &minFileEvents, DM_EVENT_MAX);
   1490 			if (rc == outlen) {
   1491 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   1492 					    rc);
   1493 				if ((rc2 == 0)
   1494 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   1495 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   1496 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   1497 					== 0)) {
   1498 					DMLOG_PRINT(DMLVL_DEBUG,
   1499 						    "buffer contents [%.*s]\n",
   1500 						    rc, buf);
   1501 					if (eventReceived == DM_EVENT_INVALID) {
   1502 						DMLOG_PRINT(DMLVL_DEBUG,
   1503 							    "no event received\n");
   1504 						if (StatCmp(&statfs1, &statfs2)
   1505 						    == 0) {
   1506 							DMLOG_PRINT(DMLVL_DEBUG,
   1507 								    "stat info same\n");
   1508 							DMVAR_PASS();
   1509 						} else {
   1510 							DMLOG_PRINT(DMLVL_ERR,
   1511 								    "stat info NOT same!\n");
   1512 							DMLOG_PRINT(DMLVL_DEBUG,
   1513 								    "stat info before:\n");
   1514 							LogStat(&statfs1);
   1515 							DMLOG_PRINT(DMLVL_DEBUG,
   1516 								    "stat info after:\n");
   1517 							LogStat(&statfs2);
   1518 							DMVAR_FAIL();
   1519 						}
   1520 					} else {
   1521 						DMLOG_PRINT(DMLVL_ERR,
   1522 							    "event %d received!\n",
   1523 							    eventReceived);
   1524 						DMVAR_FAIL();
   1525 					}
   1526 				} else {
   1527 					DMLOG_PRINT(DMLVL_ERR,
   1528 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   1529 						    DUMMY_STRLEN, DUMMY_STRING2,
   1530 						    rc, buf);
   1531 					DMVAR_FAIL();
   1532 				}
   1533 			} else {
   1534 				DMLOG_PRINT(DMLVL_ERR,
   1535 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1536 					    szFuncName, rc, errnoSaved);
   1537 				DMVAR_FAIL();
   1538 			}
   1539 
   1540 			/* Variation clean up */
   1541 			rc = close(fd);
   1542 			rc |= remove(DummyFile);
   1543 			if (rc == -1) {
   1544 				DMLOG_PRINT(DMLVL_DEBUG,
   1545 					    "Unable to clean up variation! (errno = %d)\n",
   1546 					    errno);
   1547 			}
   1548 			dm_handle_free(fshanp, fshlen);
   1549 			dm_handle_free(hanp, hlen);
   1550 		}
   1551 	}
   1552 
   1553 	/*
   1554 	 * TEST    : dm_write_invis - file middle, async
   1555 	 * EXPECTED: rc = DUMMY_STRLEN
   1556 	 */
   1557 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 8)) {
   1558 		int fd;
   1559 		void *hanp, *fshanp;
   1560 		size_t hlen, fshlen;
   1561 		dm_off_t outoff = (TMP_FILELEN / 2) - ((TMP_FILELEN / 2) % 10);
   1562 		dm_size_t outlen = DUMMY_STRLEN;
   1563 		char buf[DUMMY_STRLEN];
   1564 		struct stat statfs1, statfs2;
   1565 		int errnoSaved = 0;
   1566 		dm_boolean_t exactflag;
   1567 		int rc2;
   1568 
   1569 		/* Variation set up */
   1570 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1571 		if ((rc = system(command)) == -1) {
   1572 			/* No clean up */
   1573 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   1574 			remove(DummyFile);
   1575 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1576 			   -1) {
   1577 			close(fd);
   1578 			remove(DummyFile);
   1579 		} else
   1580 		    if ((rc =
   1581 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   1582 					       &fshlen)) == -1) {
   1583 			dm_handle_free(hanp, hlen);
   1584 			close(fd);
   1585 			remove(DummyFile);
   1586 		} else
   1587 		    if (((rc =
   1588 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1589 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   1590 			||
   1591 			((rc =
   1592 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   1593 					numRegions, maxRegions,
   1594 					&exactflag)) == -1)
   1595 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   1596 			dm_handle_free(fshanp, fshlen);
   1597 			dm_handle_free(hanp, hlen);
   1598 			close(fd);
   1599 			remove(DummyFile);
   1600 		}
   1601 		if (rc == -1) {
   1602 			DMLOG_PRINT(DMLVL_DEBUG,
   1603 				    "Unable to set up variation! %d\n", errno);
   1604 			DMVAR_SKIP();
   1605 		} else {
   1606 			/* Variation */
   1607 			TIMESTAMP_DELAY;
   1608 			eventReceived = DM_EVENT_INVALID;
   1609 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file middle, async)\n",
   1610 				    szFuncName);
   1611 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   1612 					    outoff, outlen, DUMMY_STRING2);
   1613 			errnoSaved = errno;
   1614 			EVENT_DELIVERY_DELAY;
   1615 			rc2 = stat(DummyFile, &statfs2);
   1616 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   1617 				      minRegions, &exactflag);
   1618 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1619 					 &minFileEvents, DM_EVENT_MAX);
   1620 			if (rc == outlen) {
   1621 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   1622 					    rc);
   1623 				if ((rc2 == 0)
   1624 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   1625 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   1626 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   1627 					== 0)) {
   1628 					DMLOG_PRINT(DMLVL_DEBUG,
   1629 						    "buffer contents [%.*s]\n",
   1630 						    rc, buf);
   1631 					if (eventReceived == DM_EVENT_INVALID) {
   1632 						DMLOG_PRINT(DMLVL_DEBUG,
   1633 							    "no event received\n");
   1634 						if (StatCmp(&statfs1, &statfs2)
   1635 						    == 0) {
   1636 							DMLOG_PRINT(DMLVL_DEBUG,
   1637 								    "stat info same\n");
   1638 							DMVAR_PASS();
   1639 						} else {
   1640 							DMLOG_PRINT(DMLVL_ERR,
   1641 								    "stat info NOT same!\n");
   1642 							DMLOG_PRINT(DMLVL_DEBUG,
   1643 								    "stat info before:\n");
   1644 							LogStat(&statfs1);
   1645 							DMLOG_PRINT(DMLVL_DEBUG,
   1646 								    "stat info after:\n");
   1647 							LogStat(&statfs2);
   1648 							DMVAR_FAIL();
   1649 						}
   1650 					} else {
   1651 						DMLOG_PRINT(DMLVL_ERR,
   1652 							    "event %d received!\n",
   1653 							    eventReceived);
   1654 						DMVAR_FAIL();
   1655 					}
   1656 				} else {
   1657 					DMLOG_PRINT(DMLVL_ERR,
   1658 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   1659 						    DUMMY_STRLEN, DUMMY_STRING2,
   1660 						    rc, buf);
   1661 					DMVAR_FAIL();
   1662 				}
   1663 			} else {
   1664 				DMLOG_PRINT(DMLVL_ERR,
   1665 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1666 					    szFuncName, rc, errnoSaved);
   1667 				DMVAR_FAIL();
   1668 			}
   1669 
   1670 			/* Variation clean up */
   1671 			rc = close(fd);
   1672 			rc |= remove(DummyFile);
   1673 			if (rc == -1) {
   1674 				DMLOG_PRINT(DMLVL_DEBUG,
   1675 					    "Unable to clean up variation! (errno = %d)\n",
   1676 					    errno);
   1677 			}
   1678 			dm_handle_free(fshanp, fshlen);
   1679 			dm_handle_free(hanp, hlen);
   1680 		}
   1681 	}
   1682 
   1683 	/*
   1684 	 * TEST    : dm_write_invis - file end, async
   1685 	 * EXPECTED: rc = DUMMY_STRLEN
   1686 	 */
   1687 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 9)) {
   1688 		int fd;
   1689 		void *hanp, *fshanp;
   1690 		size_t hlen, fshlen;
   1691 		dm_off_t outoff = TMP_FILELEN - DUMMY_STRLEN;
   1692 		dm_size_t outlen = DUMMY_STRLEN;
   1693 		char buf[DUMMY_STRLEN];
   1694 		struct stat statfs1, statfs2;
   1695 		int errnoSaved = 0;
   1696 		dm_boolean_t exactflag;
   1697 		int rc2;
   1698 
   1699 		/* Variation set up */
   1700 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1701 		if ((rc = system(command)) == -1) {
   1702 			/* No clean up */
   1703 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   1704 			remove(DummyFile);
   1705 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1706 			   -1) {
   1707 			close(fd);
   1708 			remove(DummyFile);
   1709 		} else
   1710 		    if ((rc =
   1711 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   1712 					       &fshlen)) == -1) {
   1713 			dm_handle_free(hanp, hlen);
   1714 			close(fd);
   1715 			remove(DummyFile);
   1716 		} else
   1717 		    if (((rc =
   1718 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1719 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   1720 			||
   1721 			((rc =
   1722 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   1723 					numRegions, maxRegions,
   1724 					&exactflag)) == -1)
   1725 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   1726 			dm_handle_free(fshanp, fshlen);
   1727 			dm_handle_free(hanp, hlen);
   1728 			close(fd);
   1729 			remove(DummyFile);
   1730 		}
   1731 		if (rc == -1) {
   1732 			DMLOG_PRINT(DMLVL_DEBUG,
   1733 				    "Unable to set up variation! %d\n", errno);
   1734 			DMVAR_SKIP();
   1735 		} else {
   1736 			/* Variation */
   1737 			TIMESTAMP_DELAY;
   1738 			eventReceived = DM_EVENT_INVALID;
   1739 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file end, async)\n",
   1740 				    szFuncName);
   1741 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   1742 					    outoff, outlen, DUMMY_STRING2);
   1743 			errnoSaved = errno;
   1744 			EVENT_DELIVERY_DELAY;
   1745 			rc2 = stat(DummyFile, &statfs2);
   1746 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   1747 				      minRegions, &exactflag);
   1748 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1749 					 &minFileEvents, DM_EVENT_MAX);
   1750 			if (rc == outlen) {
   1751 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   1752 					    rc);
   1753 				if ((rc2 == 0)
   1754 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   1755 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   1756 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   1757 					== 0)) {
   1758 					DMLOG_PRINT(DMLVL_DEBUG,
   1759 						    "buffer contents [%.*s]\n",
   1760 						    rc, buf);
   1761 					if (eventReceived == DM_EVENT_INVALID) {
   1762 						DMLOG_PRINT(DMLVL_DEBUG,
   1763 							    "no event received\n");
   1764 						if (StatCmp(&statfs1, &statfs2)
   1765 						    == 0) {
   1766 							DMLOG_PRINT(DMLVL_DEBUG,
   1767 								    "stat info same\n");
   1768 							DMVAR_PASS();
   1769 						} else {
   1770 							DMLOG_PRINT(DMLVL_ERR,
   1771 								    "stat info NOT same!\n");
   1772 							DMLOG_PRINT(DMLVL_DEBUG,
   1773 								    "stat info before:\n");
   1774 							LogStat(&statfs1);
   1775 							DMLOG_PRINT(DMLVL_DEBUG,
   1776 								    "stat info after:\n");
   1777 							LogStat(&statfs2);
   1778 							DMVAR_FAIL();
   1779 						}
   1780 					} else {
   1781 						DMLOG_PRINT(DMLVL_ERR,
   1782 							    "event %d received!\n",
   1783 							    eventReceived);
   1784 						DMVAR_FAIL();
   1785 					}
   1786 				} else {
   1787 					DMLOG_PRINT(DMLVL_ERR,
   1788 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   1789 						    DUMMY_STRLEN, DUMMY_STRING2,
   1790 						    rc, buf);
   1791 					DMVAR_FAIL();
   1792 				}
   1793 			} else {
   1794 				DMLOG_PRINT(DMLVL_ERR,
   1795 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1796 					    szFuncName, rc, errnoSaved);
   1797 				DMVAR_FAIL();
   1798 			}
   1799 
   1800 			/* Variation clean up */
   1801 			rc = close(fd);
   1802 			rc |= remove(DummyFile);
   1803 			if (rc == -1) {
   1804 				DMLOG_PRINT(DMLVL_DEBUG,
   1805 					    "Unable to clean up variation! (errno = %d)\n",
   1806 					    errno);
   1807 			}
   1808 			dm_handle_free(fshanp, fshlen);
   1809 			dm_handle_free(hanp, hlen);
   1810 		}
   1811 	}
   1812 
   1813 	/*
   1814 	 * TEST    : dm_write_invis - file start, sync
   1815 	 * EXPECTED: rc = DUMMY_STRLEN
   1816 	 */
   1817 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 10)) {
   1818 		int fd;
   1819 		void *hanp, *fshanp;
   1820 		size_t hlen, fshlen;
   1821 		dm_off_t outoff = 0;
   1822 		dm_size_t outlen = DUMMY_STRLEN;
   1823 		char buf[DUMMY_STRLEN];
   1824 		struct stat statfs1, statfs2;
   1825 		int errnoSaved = 0;
   1826 		dm_boolean_t exactflag;
   1827 		int rc2;
   1828 
   1829 		/* Variation set up */
   1830 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1831 		if ((rc = system(command)) == -1) {
   1832 			/* No clean up */
   1833 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   1834 			remove(DummyFile);
   1835 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1836 			   -1) {
   1837 			close(fd);
   1838 			remove(DummyFile);
   1839 		} else
   1840 		    if ((rc =
   1841 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   1842 					       &fshlen)) == -1) {
   1843 			dm_handle_free(hanp, hlen);
   1844 			close(fd);
   1845 			remove(DummyFile);
   1846 		} else
   1847 		    if (((rc =
   1848 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1849 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   1850 			||
   1851 			((rc =
   1852 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   1853 					numRegions, maxRegions,
   1854 					&exactflag)) == -1)
   1855 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   1856 			dm_handle_free(fshanp, fshlen);
   1857 			dm_handle_free(hanp, hlen);
   1858 			close(fd);
   1859 			remove(DummyFile);
   1860 		}
   1861 		if (fd == -1 || rc == -1) {
   1862 			DMLOG_PRINT(DMLVL_DEBUG,
   1863 				    "Unable to set up variation! %d\n", errno);
   1864 			DMVAR_SKIP();
   1865 		} else {
   1866 			/* Variation */
   1867 			TIMESTAMP_DELAY;
   1868 			eventReceived = DM_EVENT_INVALID;
   1869 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file start, sync)\n",
   1870 				    szFuncName);
   1871 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN,
   1872 					    DM_WRITE_SYNC, outoff, outlen,
   1873 					    DUMMY_STRING2);
   1874 			errnoSaved = errno;
   1875 			EVENT_DELIVERY_DELAY;
   1876 			rc2 = stat(DummyFile, &statfs2);
   1877 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   1878 				      minRegions, &exactflag);
   1879 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1880 					 &minFileEvents, DM_EVENT_MAX);
   1881 			if (rc == outlen) {
   1882 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   1883 					    rc);
   1884 				if ((rc2 == 0)
   1885 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   1886 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   1887 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   1888 					== 0)) {
   1889 					DMLOG_PRINT(DMLVL_DEBUG,
   1890 						    "buffer contents [%.*s]\n",
   1891 						    rc, buf);
   1892 					if (eventReceived == DM_EVENT_INVALID) {
   1893 						DMLOG_PRINT(DMLVL_DEBUG,
   1894 							    "no event received\n");
   1895 						if (StatCmp(&statfs1, &statfs2)
   1896 						    == 0) {
   1897 							DMLOG_PRINT(DMLVL_DEBUG,
   1898 								    "stat info same\n");
   1899 							DMVAR_PASS();
   1900 						} else {
   1901 							DMLOG_PRINT(DMLVL_ERR,
   1902 								    "stat info NOT same!\n");
   1903 							DMLOG_PRINT(DMLVL_DEBUG,
   1904 								    "stat info before:\n");
   1905 							LogStat(&statfs1);
   1906 							DMLOG_PRINT(DMLVL_DEBUG,
   1907 								    "stat info after:\n");
   1908 							LogStat(&statfs2);
   1909 							DMVAR_FAIL();
   1910 						}
   1911 					} else {
   1912 						DMLOG_PRINT(DMLVL_ERR,
   1913 							    "event %d received!\n",
   1914 							    eventReceived);
   1915 						DMVAR_FAIL();
   1916 					}
   1917 				} else {
   1918 					DMLOG_PRINT(DMLVL_ERR,
   1919 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   1920 						    DUMMY_STRLEN, DUMMY_STRING2,
   1921 						    rc, buf);
   1922 					DMVAR_FAIL();
   1923 				}
   1924 			} else {
   1925 				DMLOG_PRINT(DMLVL_ERR,
   1926 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1927 					    szFuncName, rc, errnoSaved);
   1928 				DMVAR_FAIL();
   1929 			}
   1930 
   1931 			/* Variation clean up */
   1932 			rc = close(fd);
   1933 			rc |= remove(DummyFile);
   1934 			if (rc == -1) {
   1935 				DMLOG_PRINT(DMLVL_DEBUG,
   1936 					    "Unable to clean up variation! (errno = %d)\n",
   1937 					    errno);
   1938 			}
   1939 			dm_handle_free(fshanp, fshlen);
   1940 			dm_handle_free(hanp, hlen);
   1941 		}
   1942 	}
   1943 
   1944 	/*
   1945 	 * TEST    : dm_write_invis - file middle, sync
   1946 	 * EXPECTED: rc = DUMMY_STRLEN
   1947 	 */
   1948 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 11)) {
   1949 		int fd;
   1950 		void *hanp, *fshanp;
   1951 		size_t hlen, fshlen;
   1952 		dm_off_t outoff = (TMP_FILELEN / 2) - ((TMP_FILELEN / 2) % 10);
   1953 		dm_size_t outlen = DUMMY_STRLEN;
   1954 		char buf[DUMMY_STRLEN];
   1955 		struct stat statfs1, statfs2;
   1956 		int errnoSaved = 0;
   1957 		dm_boolean_t exactflag;
   1958 		int rc2;
   1959 
   1960 		/* Variation set up */
   1961 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   1962 		if ((rc = system(command)) == -1) {
   1963 			/* No clean up */
   1964 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   1965 			remove(DummyFile);
   1966 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   1967 			   -1) {
   1968 			close(fd);
   1969 			remove(DummyFile);
   1970 		} else
   1971 		    if ((rc =
   1972 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   1973 					       &fshlen)) == -1) {
   1974 			dm_handle_free(hanp, hlen);
   1975 			close(fd);
   1976 			remove(DummyFile);
   1977 		} else
   1978 		    if (((rc =
   1979 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   1980 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   1981 			||
   1982 			((rc =
   1983 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   1984 					numRegions, maxRegions,
   1985 					&exactflag)) == -1)
   1986 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   1987 			dm_handle_free(fshanp, fshlen);
   1988 			dm_handle_free(hanp, hlen);
   1989 			close(fd);
   1990 			remove(DummyFile);
   1991 		}
   1992 		if (rc == -1) {
   1993 			DMLOG_PRINT(DMLVL_DEBUG,
   1994 				    "Unable to set up variation! %d\n", errno);
   1995 			DMVAR_SKIP();
   1996 		} else {
   1997 			/* Variation */
   1998 			TIMESTAMP_DELAY;
   1999 			eventReceived = DM_EVENT_INVALID;
   2000 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file middle, sync)\n",
   2001 				    szFuncName);
   2002 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN,
   2003 					    DM_WRITE_SYNC, outoff, outlen,
   2004 					    DUMMY_STRING2);
   2005 			errnoSaved = errno;
   2006 			EVENT_DELIVERY_DELAY;
   2007 			rc2 = stat(DummyFile, &statfs2);
   2008 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   2009 				      minRegions, &exactflag);
   2010 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   2011 					 &minFileEvents, DM_EVENT_MAX);
   2012 			if (rc == outlen) {
   2013 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   2014 					    rc);
   2015 				if ((rc2 == 0)
   2016 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   2017 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   2018 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   2019 					== 0)) {
   2020 					DMLOG_PRINT(DMLVL_DEBUG,
   2021 						    "buffer contents [%.*s]\n",
   2022 						    rc, buf);
   2023 					if (eventReceived == DM_EVENT_INVALID) {
   2024 						DMLOG_PRINT(DMLVL_DEBUG,
   2025 							    "no event received\n");
   2026 						if (StatCmp(&statfs1, &statfs2)
   2027 						    == 0) {
   2028 							DMLOG_PRINT(DMLVL_DEBUG,
   2029 								    "stat info same\n");
   2030 							DMVAR_PASS();
   2031 						} else {
   2032 							DMLOG_PRINT(DMLVL_ERR,
   2033 								    "stat info NOT same!\n");
   2034 							DMLOG_PRINT(DMLVL_DEBUG,
   2035 								    "stat info before:\n");
   2036 							LogStat(&statfs1);
   2037 							DMLOG_PRINT(DMLVL_DEBUG,
   2038 								    "stat info after:\n");
   2039 							LogStat(&statfs2);
   2040 							DMVAR_FAIL();
   2041 						}
   2042 					} else {
   2043 						DMLOG_PRINT(DMLVL_ERR,
   2044 							    "event %d received!\n",
   2045 							    eventReceived);
   2046 						DMVAR_FAIL();
   2047 					}
   2048 				} else {
   2049 					DMLOG_PRINT(DMLVL_ERR,
   2050 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   2051 						    DUMMY_STRLEN, DUMMY_STRING2,
   2052 						    rc, buf);
   2053 					DMVAR_FAIL();
   2054 				}
   2055 			} else {
   2056 				DMLOG_PRINT(DMLVL_ERR,
   2057 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   2058 					    szFuncName, rc, errnoSaved);
   2059 				DMVAR_FAIL();
   2060 			}
   2061 
   2062 			/* Variation clean up */
   2063 			rc = close(fd);
   2064 			rc |= remove(DummyFile);
   2065 			if (rc == -1) {
   2066 				DMLOG_PRINT(DMLVL_DEBUG,
   2067 					    "Unable to clean up variation! (errno = %d)\n",
   2068 					    errno);
   2069 			}
   2070 			dm_handle_free(fshanp, fshlen);
   2071 			dm_handle_free(hanp, hlen);
   2072 		}
   2073 	}
   2074 
   2075 	/*
   2076 	 * TEST    : dm_write_invis - file end, sync
   2077 	 * EXPECTED: rc = DUMMY_STRLEN
   2078 	 */
   2079 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 12)) {
   2080 		int fd;
   2081 		void *hanp, *fshanp;
   2082 		size_t hlen, fshlen;
   2083 		dm_off_t outoff = TMP_FILELEN - DUMMY_STRLEN;
   2084 		dm_size_t outlen = DUMMY_STRLEN;
   2085 		char buf[DUMMY_STRLEN];
   2086 		struct stat statfs1, statfs2;
   2087 		int errnoSaved = 0;
   2088 		dm_boolean_t exactflag;
   2089 		int rc2;
   2090 
   2091 		/* Variation set up */
   2092 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   2093 		if ((rc = system(command)) == -1) {
   2094 			/* No clean up */
   2095 		} else if ((fd = open(DummyFile, O_RDWR)) == -1) {
   2096 			remove(DummyFile);
   2097 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   2098 			   -1) {
   2099 			close(fd);
   2100 			remove(DummyFile);
   2101 		} else
   2102 		    if ((rc =
   2103 			 dm_handle_to_fshandle(hanp, hlen, &fshanp,
   2104 					       &fshlen)) == -1) {
   2105 			dm_handle_free(hanp, hlen);
   2106 			close(fd);
   2107 			remove(DummyFile);
   2108 		} else
   2109 		    if (((rc =
   2110 			  dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   2111 					   &maxFileEvents, DM_EVENT_MAX)) == -1)
   2112 			||
   2113 			((rc =
   2114 			  dm_set_region(sid, hanp, hlen, DM_NO_TOKEN,
   2115 					numRegions, maxRegions,
   2116 					&exactflag)) == -1)
   2117 			|| ((rc = stat(DummyFile, &statfs1)) == -1)) {
   2118 			dm_handle_free(fshanp, fshlen);
   2119 			dm_handle_free(hanp, hlen);
   2120 			close(fd);
   2121 			remove(DummyFile);
   2122 		}
   2123 		if (rc == -1) {
   2124 			DMLOG_PRINT(DMLVL_DEBUG,
   2125 				    "Unable to set up variation! %d\n", errno);
   2126 			DMVAR_SKIP();
   2127 		} else {
   2128 			/* Variation */
   2129 			TIMESTAMP_DELAY;
   2130 			eventReceived = DM_EVENT_INVALID;
   2131 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file end, sync)\n",
   2132 				    szFuncName);
   2133 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN,
   2134 					    DM_WRITE_SYNC, outoff, outlen,
   2135 					    DUMMY_STRING2);
   2136 			errnoSaved = errno;
   2137 			EVENT_DELIVERY_DELAY;
   2138 			rc2 = stat(DummyFile, &statfs2);
   2139 			dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions,
   2140 				      minRegions, &exactflag);
   2141 			dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN,
   2142 					 &minFileEvents, DM_EVENT_MAX);
   2143 			if (rc == outlen) {
   2144 				DMLOG_PRINT(DMLVL_DEBUG, "wrote %d bytes\n",
   2145 					    rc);
   2146 				if ((rc2 == 0)
   2147 				    && (lseek(fd, outoff, SEEK_SET) == outoff)
   2148 				    && (read(fd, buf, DUMMY_STRLEN) == outlen)
   2149 				    && (memcmp(buf, DUMMY_STRING2, DUMMY_STRLEN)
   2150 					== 0)) {
   2151 					DMLOG_PRINT(DMLVL_DEBUG,
   2152 						    "buffer contents [%.*s]\n",
   2153 						    rc, buf);
   2154 					if (eventReceived == DM_EVENT_INVALID) {
   2155 						DMLOG_PRINT(DMLVL_DEBUG,
   2156 							    "no event received\n");
   2157 						if (StatCmp(&statfs1, &statfs2)
   2158 						    == 0) {
   2159 							DMLOG_PRINT(DMLVL_DEBUG,
   2160 								    "stat info same\n");
   2161 							DMVAR_PASS();
   2162 						} else {
   2163 							DMLOG_PRINT(DMLVL_ERR,
   2164 								    "stat info NOT same!\n");
   2165 							DMLOG_PRINT(DMLVL_DEBUG,
   2166 								    "stat info before:\n");
   2167 							LogStat(&statfs1);
   2168 							DMLOG_PRINT(DMLVL_DEBUG,
   2169 								    "stat info after:\n");
   2170 							LogStat(&statfs2);
   2171 							DMVAR_FAIL();
   2172 						}
   2173 					} else {
   2174 						DMLOG_PRINT(DMLVL_ERR,
   2175 							    "event %d received!\n",
   2176 							    eventReceived);
   2177 						DMVAR_FAIL();
   2178 					}
   2179 				} else {
   2180 					DMLOG_PRINT(DMLVL_ERR,
   2181 						    "buffer contents NOT correct! (%.*s vs %.*s)\n",
   2182 						    DUMMY_STRLEN, DUMMY_STRING2,
   2183 						    rc, buf);
   2184 					DMVAR_FAIL();
   2185 				}
   2186 			} else {
   2187 				DMLOG_PRINT(DMLVL_ERR,
   2188 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   2189 					    szFuncName, rc, errnoSaved);
   2190 				DMVAR_FAIL();
   2191 			}
   2192 
   2193 			/* Variation clean up */
   2194 			rc = close(fd);
   2195 			rc |= remove(DummyFile);
   2196 			if (rc == -1) {
   2197 				DMLOG_PRINT(DMLVL_DEBUG,
   2198 					    "Unable to clean up variation! (errno = %d)\n",
   2199 					    errno);
   2200 			}
   2201 			dm_handle_free(fshanp, fshlen);
   2202 			dm_handle_free(hanp, hlen);
   2203 		}
   2204 	}
   2205 
   2206 	/*
   2207 	 * TEST    : dm_write_invis - DM_NO_SESSION sid
   2208 	 * EXPECTED: rc = -1, errno = EINVAL
   2209 	 */
   2210 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 13)) {
   2211 		void *hanp;
   2212 		size_t hlen;
   2213 		dm_off_t outoff = 0;
   2214 		dm_size_t outlen = DUMMY_STRLEN;
   2215 		char buf[DUMMY_STRLEN];
   2216 
   2217 		/* Variation set up */
   2218 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   2219 		if ((rc = system(command)) == -1) {
   2220 			/* No clean up */
   2221 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   2222 			   -1) {
   2223 			remove(DummyFile);
   2224 		}
   2225 		if (rc == -1) {
   2226 			DMLOG_PRINT(DMLVL_DEBUG,
   2227 				    "Unable to set up variation! (errno = %d)\n",
   2228 				    errno);
   2229 			DMVAR_SKIP();
   2230 		} else {
   2231 			/* Variation */
   2232 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   2233 				    szFuncName);
   2234 			rc = dm_write_invis(DM_NO_SESSION, hanp, hlen,
   2235 					    DM_NO_TOKEN, 0, outoff, outlen,
   2236 					    buf);
   2237 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2238 
   2239 			/* Variation clean up */
   2240 			rc = remove(DummyFile);
   2241 			if (rc == -1) {
   2242 				DMLOG_PRINT(DMLVL_DEBUG,
   2243 					    "Unable to clean up variation! (errno = %d)\n",
   2244 					    errno);
   2245 			}
   2246 			dm_handle_free(hanp, hlen);
   2247 		}
   2248 	}
   2249 
   2250 	/*
   2251 	 * TEST    : dm_write_invis - directory handle
   2252 	 * EXPECTED: rc = -1, errno = EINVAL
   2253 	 */
   2254 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 14)) {
   2255 		void *hanp;
   2256 		size_t hlen;
   2257 		dm_off_t outoff = 0;
   2258 		dm_size_t outlen = DUMMY_STRLEN;
   2259 		char buf[DUMMY_STRLEN];
   2260 
   2261 		/* Variation set up */
   2262 		if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
   2263 			/* No clean up */
   2264 		} else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen))
   2265 			   == -1) {
   2266 			rmdir(DummySubdir);
   2267 		}
   2268 		if (rc == -1) {
   2269 			DMLOG_PRINT(DMLVL_DEBUG,
   2270 				    "Unable to set up variation! (errno = %d)\n",
   2271 				    errno);
   2272 			DMVAR_SKIP();
   2273 		} else {
   2274 			/* Variation */
   2275 			DMLOG_PRINT(DMLVL_DEBUG, "%s(directory handle)\n",
   2276 				    szFuncName);
   2277 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   2278 					    outoff, outlen, buf);
   2279 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2280 
   2281 			/* Variation clean up */
   2282 			rc = rmdir(DummySubdir);
   2283 			if (rc == -1) {
   2284 				DMLOG_PRINT(DMLVL_DEBUG,
   2285 					    "Unable to clean up variation! (errno = %d)\n",
   2286 					    errno);
   2287 			}
   2288 			dm_handle_free(hanp, hlen);
   2289 		}
   2290 	}
   2291 
   2292 	/*
   2293 	 * TEST    : dm_write_invis - fs handle
   2294 	 * EXPECTED: rc = -1, errno = EINVAL
   2295 	 */
   2296 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 15)) {
   2297 		void *hanp;
   2298 		size_t hlen;
   2299 		dm_off_t outoff = 0;
   2300 		dm_size_t outlen = DUMMY_STRLEN;
   2301 		char buf[DUMMY_STRLEN];
   2302 
   2303 		/* Variation set up */
   2304 		if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
   2305 			/* No clean up */
   2306 		} else if ((rc = dm_path_to_fshandle(DummySubdir, &hanp, &hlen))
   2307 			   == -1) {
   2308 			rmdir(DummySubdir);
   2309 		}
   2310 		if (rc == -1) {
   2311 			DMLOG_PRINT(DMLVL_DEBUG,
   2312 				    "Unable to set up variation! (errno = %d)\n",
   2313 				    errno);
   2314 			DMVAR_SKIP();
   2315 		} else {
   2316 			/* Variation */
   2317 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   2318 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   2319 					    outoff, outlen, buf);
   2320 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2321 
   2322 			/* Variation clean up */
   2323 			rc = rmdir(DummySubdir);
   2324 			if (rc == -1) {
   2325 				DMLOG_PRINT(DMLVL_DEBUG,
   2326 					    "Unable to clean up variation! (errno = %d)\n",
   2327 					    errno);
   2328 			}
   2329 			dm_handle_free(hanp, hlen);
   2330 		}
   2331 	}
   2332 
   2333 	/*
   2334 	 * TEST    : dm_write_invis - global handle
   2335 	 * EXPECTED: rc = -1, errno = EBADF
   2336 	 */
   2337 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 16)) {
   2338 		dm_off_t inoff = 0;
   2339 		dm_size_t inlen = DUMMY_STRLEN;
   2340 		char buf[DUMMY_STRLEN];
   2341 
   2342 		/* Variation set up */
   2343 
   2344 		/* Variation */
   2345 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   2346 		rc = dm_write_invis(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   2347 				    DM_NO_TOKEN, 0, inoff, inlen, buf);
   2348 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   2349 
   2350 		/* Variation clean up */
   2351 	}
   2352 
   2353 	/*
   2354 	 * TEST    : dm_write_invis - invalidated hanp
   2355 	 * EXPECTED: rc = -1, errno = EBADF
   2356 	 */
   2357 	if (DMVAR_EXEC(WRITE_INVIS_BASE + 17)) {
   2358 		void *hanp;
   2359 		size_t hlen;
   2360 		dm_off_t inoff = 0;
   2361 		dm_size_t inlen = DUMMY_STRLEN;
   2362 		char buf[DUMMY_STRLEN];
   2363 
   2364 		/* Variation set up */
   2365 		sprintf(command, "cp %s %s", DummyTmp, DummyFile);
   2366 		if ((rc = system(command)) == -1) {
   2367 			/* No clean up */
   2368 		} else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) ==
   2369 			   -1) {
   2370 			remove(DummyFile);
   2371 		} else if ((rc = remove(DummyFile)) == -1) {
   2372 			dm_handle_free(hanp, hlen);
   2373 		}
   2374 		if (rc == -1) {
   2375 			DMLOG_PRINT(DMLVL_DEBUG,
   2376 				    "Unable to set up variation! (errno = %d)\n",
   2377 				    errno);
   2378 			DMVAR_SKIP();
   2379 		} else {
   2380 			/* Variation */
   2381 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   2382 				    szFuncName);
   2383 			rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0,
   2384 					    inoff, inlen, buf);
   2385 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   2386 
   2387 			/* Variation clean up */
   2388 			dm_handle_free(hanp, hlen);
   2389 		}
   2390 	}
   2391 
   2392 	remove(DummyTmp);
   2393 
   2394 	rc = umount(mountPt);
   2395 	if (rc == -1) {
   2396 		DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n",
   2397 			    rc, errno);
   2398 	}
   2399 
   2400 	pthread_join(tid, NULL);
   2401 
   2402 	rc = dm_destroy_session(sid);
   2403 	if (rc == -1) {
   2404 		DMLOG_PRINT(DMLVL_ERR,
   2405 			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
   2406 			    rc, errno);
   2407 	}
   2408 
   2409 	DMLOG_STOP();
   2410 
   2411 	tst_exit();
   2412 }
   2413 
   2414 void *Thread(void *parm)
   2415 {
   2416 	int rc;
   2417 	size_t dmMsgBufLen;
   2418 	dm_eventmsg_t *dmMsg;
   2419 	int bMounted = DM_FALSE;
   2420 	dm_eventtype_t type;
   2421 	dm_token_t token;
   2422 	dm_eventset_t events;
   2423 	dm_response_t response;
   2424 
   2425 	do {
   2426 		/* Loop until message received (wait could be interrupted) */
   2427 		do {
   2428 			DMLOG_PRINT(DMLVL_DEBUG, "Waiting for event...\n");
   2429 			dmMsgBufLen = 0;
   2430 
   2431 			rc = dm_get_events(sid, 1, DM_EV_WAIT, sizeof(dmMsgBuf),
   2432 					   dmMsgBuf, &dmMsgBufLen);
   2433 			DMLOG_PRINT(DMLVL_DEBUG,
   2434 				    "... dm_get_events returned %d (errno %d)\n",
   2435 				    rc, errno);
   2436 		} while ((rc == -1) && (errno == EINTR) && (dmMsgBufLen == 0));
   2437 
   2438 		if (rc) {
   2439 			DMLOG_PRINT(DMLVL_ERR,
   2440 				    "dm_get_events failed with rc = %d, errno = %d\n",
   2441 				    rc, errno);
   2442 			dm_destroy_session(sid);
   2443 			DM_EXIT();
   2444 		} else {
   2445 			dmMsg = (dm_eventmsg_t *) dmMsgBuf;
   2446 			token = dmMsg->ev_token;
   2447 			type = dmMsg->ev_type;
   2448 
   2449 			DMLOG_PRINT(DMLVL_DEBUG, "Received message %d\n", type);
   2450 		}
   2451 
   2452 		if (type == DM_EVENT_MOUNT) {
   2453 			/* SPECIAL CASE: need to set disposition, events and response */
   2454 			dm_mount_event_t *me =
   2455 			    DM_GET_VALUE(dmMsg, ev_data, dm_mount_event_t *);
   2456 			void *lhanp = DM_GET_VALUE(me, me_handle1, void *);
   2457 			size_t lhlen = DM_GET_LEN(me, me_handle1);
   2458 
   2459 			DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_MOUNT\n");
   2460 			DMLOG_PRINT(DMLVL_DEBUG, "  Mode: %x\n", me->me_mode);
   2461 			DMLOG_PRINT(DMLVL_DEBUG, "  File system handle: %p\n",
   2462 				    lhanp);
   2463 			DMLOG_PRINT(DMLVL_DEBUG,
   2464 				    "  File system handle length: %d\n", lhlen);
   2465 			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint handle: %p\n",
   2466 				    DM_GET_VALUE(me, me_handle2, void *));
   2467 			DMLOG_PRINT(DMLVL_DEBUG,
   2468 				    "  Mountpoint handle length: %d\n",
   2469 				    DM_GET_LEN(me, me_handle2));
   2470 			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint path: %s\n",
   2471 				    DM_GET_VALUE(me, me_name1, char *));
   2472 			DMLOG_PRINT(DMLVL_DEBUG, "  Media designator: %s\n",
   2473 				    DM_GET_VALUE(me, me_name2, char *));
   2474 			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle: %p\n",
   2475 				    DM_GET_VALUE(me, me_roothandle, void *));
   2476 			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle length: %d\n",
   2477 				    DM_GET_LEN(me, me_roothandle));
   2478 
   2479 			bMounted = dm_handle_is_valid(lhanp, lhlen);
   2480 
   2481 			rc = dm_request_right(sid, lhanp, lhlen, token,
   2482 					      DM_RR_WAIT, DM_RIGHT_EXCL);
   2483 			if (rc == -1) {
   2484 				DMLOG_PRINT(DMLVL_ERR,
   2485 					    "dm_request_right failed! (rc = %d, errno = %d)\n",
   2486 					    rc, errno);
   2487 				dm_destroy_session(sid);
   2488 				DM_EXIT();
   2489 			}
   2490 
   2491 			DMEV_ZERO(events);
   2492 			DMEV_SET(DM_EVENT_PREUNMOUNT, events);
   2493 			DMEV_SET(DM_EVENT_UNMOUNT, events);
   2494 			DMEV_SET(DM_EVENT_CREATE, events);
   2495 			DMEV_SET(DM_EVENT_CLOSE, events);
   2496 			DMEV_SET(DM_EVENT_POSTCREATE, events);
   2497 			DMEV_SET(DM_EVENT_REMOVE, events);
   2498 			DMEV_SET(DM_EVENT_POSTREMOVE, events);
   2499 			DMEV_SET(DM_EVENT_RENAME, events);
   2500 			DMEV_SET(DM_EVENT_POSTRENAME, events);
   2501 			DMEV_SET(DM_EVENT_LINK, events);
   2502 			DMEV_SET(DM_EVENT_POSTLINK, events);
   2503 			DMEV_SET(DM_EVENT_SYMLINK, events);
   2504 			DMEV_SET(DM_EVENT_POSTSYMLINK, events);
   2505 			DMEV_SET(DM_EVENT_READ, events);
   2506 			DMEV_SET(DM_EVENT_WRITE, events);
   2507 			DMEV_SET(DM_EVENT_TRUNCATE, events);
   2508 			DMEV_SET(DM_EVENT_ATTRIBUTE, events);
   2509 			rc = dm_set_disp(sid, lhanp, lhlen, token, &events,
   2510 					 DM_EVENT_MAX);
   2511 			if (rc == -1) {
   2512 				DMLOG_PRINT(DMLVL_ERR,
   2513 					    "dm_set_disp failed! (rc = %d, errno = %d)\n",
   2514 					    rc, errno);
   2515 				dm_destroy_session(sid);
   2516 				DM_EXIT();
   2517 			}
   2518 
   2519 			DMEV_ZERO(events);
   2520 			DMEV_SET(DM_EVENT_PREUNMOUNT, events);
   2521 			DMEV_SET(DM_EVENT_UNMOUNT, events);
   2522 			rc = dm_set_eventlist(sid, lhanp, lhlen, token, &events,
   2523 					      DM_EVENT_MAX);
   2524 			if (rc == -1) {
   2525 				DMLOG_PRINT(DMLVL_ERR,
   2526 					    "dm_set_eventlist failed! (rc = %d, errno = %d)\n",
   2527 					    rc, errno);
   2528 				dm_destroy_session(sid);
   2529 				DM_EXIT();
   2530 			}
   2531 
   2532 			rc = dm_release_right(sid, lhanp, lhlen, token);
   2533 			if (rc == -1) {
   2534 				DMLOG_PRINT(DMLVL_ERR,
   2535 					    "dm_request_right failed! (rc = %d, errno = %d)\n",
   2536 					    rc, errno);
   2537 				dm_destroy_session(sid);
   2538 				DM_EXIT();
   2539 			}
   2540 
   2541 			response = DM_RESP_CONTINUE;
   2542 		} else if (type == DM_EVENT_PREUNMOUNT) {
   2543 			/* SPECIAL CASE: need to set response */
   2544 			dm_namesp_event_t *nse =
   2545 			    DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
   2546 
   2547 			DMLOG_PRINT(DMLVL_DEBUG,
   2548 				    "Message is DM_EVENT_PREUNMOUNT\n");
   2549 			DMLOG_PRINT(DMLVL_DEBUG, "  Unmount mode: %x\n",
   2550 				    nse->ne_mode);
   2551 			DMLOG_PRINT(DMLVL_DEBUG, "  File system handle: %p\n",
   2552 				    DM_GET_VALUE(nse, ne_handle1, void *));
   2553 			DMLOG_PRINT(DMLVL_DEBUG,
   2554 				    "  File system handle length: %d\n",
   2555 				    DM_GET_LEN(nse, ne_handle1));
   2556 			DMLOG_PRINT(DMLVL_DEBUG,
   2557 				    "  Root directory handle: %p\n",
   2558 				    DM_GET_VALUE(nse, ne_handle2, void *));
   2559 			DMLOG_PRINT(DMLVL_DEBUG,
   2560 				    "  Root directory handle length: %d\n",
   2561 				    DM_GET_LEN(nse, ne_handle2));
   2562 
   2563 			response = DM_RESP_CONTINUE;
   2564 		} else if (type == DM_EVENT_UNMOUNT) {
   2565 			/* SPECIAL CASE: need to set response and bMounted */
   2566 			dm_namesp_event_t *nse =
   2567 			    DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
   2568 
   2569 			DMLOG_PRINT(DMLVL_DEBUG,
   2570 				    "Message is DM_EVENT_UNMOUNT\n");
   2571 			DMLOG_PRINT(DMLVL_DEBUG, "  Unmount mode: %x\n",
   2572 				    nse->ne_mode);
   2573 			DMLOG_PRINT(DMLVL_DEBUG, "  File system handle: %p\n",
   2574 				    DM_GET_VALUE(nse, ne_handle1, void *));
   2575 			DMLOG_PRINT(DMLVL_DEBUG,
   2576 				    "  File system handle length: %d\n",
   2577 				    DM_GET_LEN(nse, ne_handle1));
   2578 			DMLOG_PRINT(DMLVL_DEBUG, "  Return code: %x\n",
   2579 				    nse->ne_retcode);
   2580 			if (nse->ne_retcode == 0) {
   2581 				bMounted = DM_FALSE;
   2582 			}
   2583 
   2584 			response = DM_RESP_CONTINUE;
   2585 		} else {
   2586 			eventReceived = type;
   2587 
   2588 			switch (type) {
   2589 			case DM_EVENT_READ:
   2590 				{
   2591 					dm_data_event_t *de =
   2592 					    DM_GET_VALUE(dmMsg, ev_data,
   2593 							 dm_data_event_t *);
   2594 					hanp1 =
   2595 					    DM_GET_VALUE(de, de_handle, void *);
   2596 					hlen1 = DM_GET_LEN(de, de_handle);
   2597 					offset = de->de_offset;
   2598 					length = de->de_length;
   2599 
   2600 					DMLOG_PRINT(DMLVL_DEBUG,
   2601 						    "Message is DM_EVENT_READ\n");
   2602 					DMLOG_PRINT(DMLVL_DEBUG,
   2603 						    "  Handle: %p\n", hanp1);
   2604 					DMLOG_PRINT(DMLVL_DEBUG,
   2605 						    "  Handle length: %d\n",
   2606 						    hlen1);
   2607 					DMLOG_PRINT(DMLVL_DEBUG,
   2608 						    "  Offset: %d\n", offset);
   2609 					DMLOG_PRINT(DMLVL_DEBUG,
   2610 						    "  Length: %d\n", length);
   2611 
   2612 					response = DM_RESP_CONTINUE;
   2613 					break;
   2614 				}
   2615 
   2616 			case DM_EVENT_WRITE:
   2617 				{
   2618 					dm_data_event_t *de =
   2619 					    DM_GET_VALUE(dmMsg, ev_data,
   2620 							 dm_data_event_t *);
   2621 					hanp1 =
   2622 					    DM_GET_VALUE(de, de_handle, void *);
   2623 					hlen1 = DM_GET_LEN(de, de_handle);
   2624 					offset = de->de_offset;
   2625 					length = de->de_length;
   2626 
   2627 					DMLOG_PRINT(DMLVL_DEBUG,
   2628 						    "Message is DM_EVENT_WRITE\n");
   2629 					DMLOG_PRINT(DMLVL_DEBUG,
   2630 						    "  Handle: %p\n", hanp1);
   2631 					DMLOG_PRINT(DMLVL_DEBUG,
   2632 						    "  Handle length: %d\n",
   2633 						    hlen1);
   2634 					DMLOG_PRINT(DMLVL_DEBUG,
   2635 						    "  Offset: %d\n", offset);
   2636 					DMLOG_PRINT(DMLVL_DEBUG,
   2637 						    "  Length: %d\n", length);
   2638 
   2639 					response = DM_RESP_CONTINUE;
   2640 					break;
   2641 				}
   2642 
   2643 			case DM_EVENT_TRUNCATE:
   2644 				{
   2645 					dm_data_event_t *de =
   2646 					    DM_GET_VALUE(dmMsg, ev_data,
   2647 							 dm_data_event_t *);
   2648 					hanp1 =
   2649 					    DM_GET_VALUE(de, de_handle, void *);
   2650 					hlen1 = DM_GET_LEN(de, de_handle);
   2651 					offset = de->de_offset;
   2652 
   2653 					DMLOG_PRINT(DMLVL_DEBUG,
   2654 						    "Message is DM_EVENT_TRUNCATE\n");
   2655 					DMLOG_PRINT(DMLVL_DEBUG,
   2656 						    "  Handle: %p\n", hanp1);
   2657 					DMLOG_PRINT(DMLVL_DEBUG,
   2658 						    "  Handle length: %d\n",
   2659 						    hlen1);
   2660 					DMLOG_PRINT(DMLVL_DEBUG,
   2661 						    "  Offset: %d\n", offset);
   2662 
   2663 					response = DM_RESP_CONTINUE;
   2664 					break;
   2665 				}
   2666 
   2667 			case DM_EVENT_CREATE:
   2668 			case DM_EVENT_REMOVE:
   2669 			case DM_EVENT_RENAME:
   2670 			case DM_EVENT_LINK:
   2671 			case DM_EVENT_SYMLINK:
   2672 				response = DM_RESP_CONTINUE;
   2673 				break;
   2674 
   2675 			case DM_EVENT_POSTCREATE:
   2676 			case DM_EVENT_POSTREMOVE:
   2677 			case DM_EVENT_POSTRENAME:
   2678 			case DM_EVENT_POSTLINK:
   2679 			case DM_EVENT_POSTSYMLINK:
   2680 			case DM_EVENT_ATTRIBUTE:
   2681 			case DM_EVENT_CLOSE:
   2682 				response = DM_RESP_INVALID;
   2683 				break;
   2684 
   2685 			default:
   2686 				{
   2687 					DMLOG_PRINT(DMLVL_ERR,
   2688 						    "Message is unexpected!\n");
   2689 					response = DM_RESP_ABORT;
   2690 					break;
   2691 				}
   2692 			}
   2693 		}
   2694 
   2695 		if (response != DM_RESP_INVALID) {
   2696 			DMLOG_PRINT(DMLVL_DEBUG,
   2697 				    "Responding to message %d with %d\n", type,
   2698 				    response);
   2699 			rc = dm_respond_event(sid, token, response,
   2700 					      response ==
   2701 					      DM_RESP_ABORT ? ABORT_ERRNO : 0,
   2702 					      0, NULL);
   2703 		}
   2704 	} while (bMounted);
   2705 
   2706 	pthread_exit(0);
   2707 }
   2708