xref: /titanic_41/usr/src/cmd/fs.d/cachefs/cfsd/cfsd_logelem.c (revision 989f28072d20c73ae0955d6a1e3e2fc74831cb39)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * Methods of the cfsd_logelem* classes.
31  */
32 
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <stddef.h>
36 #include <string.h>
37 #include <synch.h>
38 #include <unistd.h>
39 #include <stdarg.h>
40 #include <string.h>
41 #include <libintl.h>
42 #include <errno.h>
43 #include <locale.h>
44 #include <sys/utsname.h>
45 #include <sys/vfs.h>
46 #include <sys/cred.h>
47 #include <sys/param.h>
48 #include <sys/types.h>
49 #include <sys/fs/cachefs_fs.h>
50 #include <sys/fs/cachefs_dlog.h>
51 #include <sys/fs/cachefs_ioctl.h>
52 #include <mdbug/mdbug.h>
53 
54 #include "cfsd.h"
55 #include "cfsd_maptbl.h"
56 #include "cfsd_logfile.h"
57 #include "cfsd_kmod.h"
58 #include "cfsd_logelem.h"
59 
60 
61 #define	dl_ctime dl_times.tm_ctime
62 #define	dl_mtime dl_times.tm_mtime
63 #define	TIMECHANGE(A, B) (memcmp(&A, &B, sizeof (A)) != 0)
64 #define	X_OPTIMIZED -2
65 #define	X_CONFLICT -3
66 
67 
68 /*
69  * -----------------------------------------------------------------
70  *			cfsd_logelem_create
71  *
72  * Description:
73  *	Constructor for the cfsd_logelem abstract base class.
74  * Arguments:
75  * Returns:
76  * Preconditions:
77  */
78 
79 cfsd_logelem_object_t *
80 cfsd_logelem_create(cfsd_maptbl_object_t *maptbl_object_p,
81 	cfsd_logfile_object_t *logfile_object_p,
82 	cfsd_kmod_object_t *kmod_object_p)
83 {
84 	cfsd_logelem_object_t *logelem_object_p;
85 
86 	dbug_enter("cfsd_logelem_create");
87 
88 	logelem_object_p = cfsd_calloc(sizeof (cfsd_logelem_object_t));
89 	logelem_object_p->i_maptbl_object_p = maptbl_object_p;
90 	logelem_object_p->i_logfile_object_p = logfile_object_p;
91 	logelem_object_p->i_kmod_object_p = kmod_object_p;
92 
93 	logelem_object_p->i_entp = logfile_object_p->i_cur_entry;
94 	logelem_object_p->i_offset = logfile_object_p->i_cur_offset;
95 	dbug_assert(logelem_object_p->i_entp);
96 	logelem_object_p->i_messagep[0] = '\0';
97 	logelem_object_p->i_type = NO_OBJECT_TYPE;
98 
99 	dbug_leave("cfsd_logelem_create");
100 	return (logelem_object_p);
101 }
102 
103 /*
104  * -----------------------------------------------------------------
105  *			cfsd_logelem_destroy
106  *
107  * Description:
108  *	Destructor for the cfsd_logelem abstract base class.
109  * Arguments:
110  * Returns:
111  * Preconditions:
112  */
113 
114 
115 void
116 cfsd_logelem_destroy(cfsd_logelem_object_t *logelem_object_p)
117 {
118 	dbug_enter("cfsd_logelem_destroy");
119 	cfsd_free(logelem_object_p);
120 	dbug_leave("cfsd_logelem_destroy");
121 }
122 /*
123  * -----------------------------------------------------------------
124  *			logelem_print_cred
125  *
126  * Description:
127  * Arguments:
128  *	credp
129  * Returns:
130  * Preconditions:
131  *	precond(credp)
132  */
133 
134 void
135 logelem_print_cred(dl_cred_t *credp)
136 {
137 	char buf[12 * NGROUPS_MAX_DEFAULT];
138 	char format[10];
139 	int xx;
140 
141 	dbug_enter("logelem_print_cred");
142 	dbug_precond(credp);
143 
144 	buf[0] = '\0';
145 	dbug_print(("dump", "credentials"));
146 	dbug_print(("dump", "  uid %d, gid %d",
147 	    credp->cr_uid, credp->cr_gid));
148 	dbug_print(("dump", "  ruid %d, rgid %d, suid %d, sgid %d",
149 	    credp->cr_ruid, credp->cr_rgid,
150 	    credp->cr_suid, credp->cr_sgid));
151 
152 	for (xx = 0; xx < credp->cr_ngroups; xx++) {
153 		sprintf(format, " %d", credp->cr_groups[xx]);
154 		strlcat(buf, format, sizeof (buf));
155 	}
156 	dbug_print(("dump", "  ngroups %d,  %s", credp->cr_ngroups, buf));
157 	dbug_leave("logelem_print_cred");
158 }
159 
160 /*
161  * -----------------------------------------------------------------
162  *			logelem_print_attr
163  *
164  * Description:
165  * Arguments:
166  *	vattrp
167  * Returns:
168  * Preconditions:
169  *	precond(vattrp)
170  */
171 
172 void
173 logelem_print_attr(cfs_vattr_t *vp)
174 {
175 	dbug_enter("logelem_print_attr");
176 	dbug_precond(vp);
177 
178 	dbug_print(("dump", "attributes"));
179 	dbug_print(("dump", "  mask 0x%x", vp->va_mask));
180 	if (vp->va_mask & AT_TYPE)
181 		dbug_print(("dump", "  type %d", vp->va_type));
182 	if (vp->va_mask & AT_MODE)
183 		dbug_print(("dump", "  mode 0%o", vp->va_mode));
184 	if (vp->va_mask & AT_UID)
185 		dbug_print(("dump", "  uid %d", vp->va_uid));
186 	if (vp->va_mask & AT_GID)
187 		dbug_print(("dump", "  gid %d", vp->va_gid));
188 	if (vp->va_mask & AT_FSID)
189 		dbug_print(("dump", "  fsid %08x", vp->va_fsid));
190 	if (vp->va_mask & AT_NODEID)
191 		dbug_print(("dump", "  nodeid %08x", vp->va_nodeid));
192 	if (vp->va_mask & AT_NLINK)
193 		dbug_print(("dump", "  nlink %d", vp->va_nlink));
194 	if (vp->va_mask & AT_SIZE)
195 		dbug_print(("dump", "  size %d", vp->va_size));
196 	if (vp->va_mask & AT_ATIME)
197 		dbug_print(("dump", "  atime %08x %08x",
198 		    vp->va_atime.tv_sec, vp->va_atime.tv_nsec));
199 	if (vp->va_mask & AT_MTIME)
200 		dbug_print(("dump", "  mtime %08x %08x",
201 		    vp->va_mtime.tv_sec, vp->va_mtime.tv_nsec));
202 	if (vp->va_mask & AT_CTIME)
203 		dbug_print(("dump", "  ctime %08x %08x",
204 		    vp->va_ctime.tv_sec, vp->va_ctime.tv_nsec));
205 	if (vp->va_mask & AT_RDEV)
206 		dbug_print(("dump", "  rdev %08x", vp->va_rdev));
207 	if (vp->va_mask & AT_BLKSIZE)
208 		dbug_print(("dump", "  blksize %08x", vp->va_blksize));
209 	if (vp->va_mask & AT_NBLOCKS)
210 		dbug_print(("dump", "  nblocks %d", vp->va_nblocks));
211 	if (vp->va_mask & AT_SEQ)
212 		dbug_print(("dump", "  seq %d", vp->va_seq));
213 	dbug_leave("logelem_print_attr");
214 }
215 
216 /*
217  * -----------------------------------------------------------------
218  *			logelem_format_fid
219  *
220  * Description:
221  * Arguments:
222  *	fidp
223  * Returns:
224  * Preconditions:
225  *	precond(fidp)
226  */
227 
228 void
229 logelem_format_fid(cfsd_logelem_object_t *logelem_object_p, cfs_fid_t *fidp)
230 {
231 	uint_t val;
232 	int index;
233 	char format[10];
234 	logelem_object_p->i_fidbuf[0] = '\0';
235 
236 	for (index = 0; index < (int)fidp->fid_len; index += sizeof (uint_t)) {
237 		memcpy(&val, &fidp->fid_data[index], sizeof (uint_t));
238 		snprintf(format, sizeof (format), "%08x ", val);
239 		strlcat(logelem_object_p->i_fidbuf, format,
240 		    sizeof (logelem_object_p->i_fidbuf));
241 	}
242 }
243 
244 
245 /*
246  * -----------------------------------------------------------------
247  *			logelem_lostfound
248  *
249  * Description:
250  *	Called when there is a conflict on a file.
251  * Arguments:
252  *	cidp	cid of file to move to lost+found
253  *	pcidp	parent cid if known, else null
254  *	namep	name of file if known, else null
255  * Returns:
256  *	Returns 0 for success, EIO if file could not be moved.
257  * Preconditions:
258  *	precond(cidp)
259  */
260 
261 int
262 logelem_lostfound(cfsd_logelem_object_t *logelem_object_p,
263 	cfs_cid_t *cidp,
264 	cfs_cid_t *pcidp,
265 	const char *namep,
266 	dl_cred_t *cred)
267 {
268 	struct cfs_dlog_mapping_space map;
269 	int xx;
270 	cfs_fid_t *fp, dirfid;
271 	cachefsio_getinfo_t ginfo;
272 	char namebuf[MAXNAMELEN];
273 	int gotdirfid = 0;
274 	int wrotefile = 0;
275 	char *np;
276 	char namebuf2[MAXNAMELEN * 3];
277 	int foundname = 0;
278 	int index;
279 	char *machnamep;
280 	struct utsname info;
281 	int len;
282 	cfs_fid_t filefid;
283 	struct cfs_vattr vattr;
284 	char newname[MAXNAMELEN];
285 	char mesgbuf[MAXNAMELEN * 3];
286 #define	MAXTRIES 10
287 
288 	dbug_enter("logelem_lostfound");
289 	dbug_precond(cidp);
290 	dbug_precond(cred);
291 
292 	/* make an alternate name for the file */
293 	if (namep == NULL)
294 		sprintf(namebuf, "fileno_%"PRIx64, cidp->cid_fileno);
295 
296 	/* get info about the file from the cache */
297 	xx = kmod_getinfo(logelem_object_p->i_kmod_object_p, cidp, &ginfo);
298 	if (xx) {
299 		if (namep == NULL) {
300 			namep = namebuf;
301 		}
302 		logelem_log_opskipped(logelem_object_p, namep);
303 		dbug_leave("logelem_lostfound");
304 		return (0);
305 	}
306 
307 	/* determine what we want to call this file */
308 	if (namep == NULL) {
309 		if (ginfo.gi_name[0] == '\0')
310 			namep = namebuf;
311 		else
312 			namep = ginfo.gi_name;
313 	}
314 
315 	/* if not a regular file or not modified */
316 	if ((ginfo.gi_attr.va_type != VREG) || !ginfo.gi_modified) {
317 		logelem_log_opskipped(logelem_object_p, namep);
318 		dbug_leave("logelem_lostfound");
319 		return (0);
320 	}
321 
322 	/* get the fid of the parent directory from the passed in cid */
323 	if (pcidp) {
324 		/* see if we have a valid mapping for the parent cid */
325 		xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
326 		    *pcidp, &map);
327 		if (xx == -1) {
328 			logelem_log_opskipped(logelem_object_p, namep);
329 			dbug_leave("logelem_lostfound");
330 			return (EIO);
331 		}
332 		if ((xx == 0) && (0 < map.ms_fid)) {
333 			xx = logfile_offset(
334 			    logelem_object_p->i_logfile_object_p,
335 			    map.ms_fid, (caddr_t *)&fp);
336 			if (xx) {
337 				logelem_log_opskipped(logelem_object_p, namep);
338 				dbug_leave("logelem_lostfound");
339 				return (EIO);
340 			}
341 			if (fp->fid_len) {
342 				gotdirfid = 1;
343 				dirfid = *fp;
344 			}
345 		}
346 
347 		/* otherwise try to get the fid from the cache */
348 		if (gotdirfid == 0) {
349 			xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
350 			    pcidp, &dirfid);
351 			if (xx == 0)
352 				gotdirfid = 1;
353 		}
354 	}
355 
356 	/* if not parent fid yet, try to get one from the dir in the cache */
357 	if ((gotdirfid == 0) && ginfo.gi_pcid.cid_fileno) {
358 		/* see if we have a valid mapping for the cache parent cid */
359 		xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
360 		    ginfo.gi_pcid, &map);
361 		if (xx == -1) {
362 			logelem_log_opskipped(logelem_object_p, namep);
363 			dbug_leave("logelem_lostfound");
364 			return (EIO);
365 		}
366 		if ((xx == 0) && (0 < map.ms_fid)) {
367 			xx = logfile_offset(
368 			    logelem_object_p->i_logfile_object_p,
369 			    map.ms_fid, (caddr_t *)&fp);
370 			if (xx) {
371 				logelem_log_opskipped(logelem_object_p, namep);
372 				dbug_leave("logelem_lostfound");
373 				return (EIO);
374 			}
375 			if (fp->fid_len) {
376 				gotdirfid = 1;
377 				dirfid = *fp;
378 			}
379 		}
380 
381 		/* otherwise try to get the fid from the cache */
382 		if (gotdirfid == 0) {
383 			xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
384 			    &ginfo.gi_pcid, &dirfid);
385 			if (xx == 0)
386 				gotdirfid = 1;
387 		}
388 	}
389 
390 
391 	/* if we found a parent directory */
392 	if (gotdirfid) {
393 		/* get the host name */
394 		xx = uname(&info);
395 		if (xx == -1)
396 			machnamep = "client";
397 		else
398 			machnamep = info.nodename;
399 
400 		/* find a name we can call this file */
401 		for (index = 0; index < MAXTRIES; index++) {
402 			/* construct the name */
403 			snprintf(namebuf2, sizeof (namebuf2),
404 			    "%s.conflict.%s.%x", machnamep, namep, index);
405 			len = strlen(namebuf2) + 1;
406 			if (len > MAXNAMELEN)
407 				np = &namebuf2[len - MAXNAMELEN];
408 			else
409 				np = namebuf2;
410 
411 			/* see if it exists */
412 			xx = kmod_getattrname(
413 			    logelem_object_p->i_kmod_object_p,
414 			    &dirfid, np, cred, NULL, NULL);
415 
416 			/* timeout error, pass the error back up */
417 			if ((xx == ETIMEDOUT) || (xx == EIO)) {
418 				dbug_leave("logelem_lostfound");
419 				return (ETIMEDOUT);
420 			}
421 			/* file does not exist, so try to use it */
422 			if (xx == ENOENT) {
423 				foundname = 1;
424 				break;
425 			}
426 
427 			/* any other error on the directory, give up */
428 			if (xx)
429 				break;
430 		}
431 
432 		/* if we found a name */
433 		if (foundname) {
434 			/* set up attributes for the file */
435 			vattr.va_type = VREG;
436 			vattr.va_mode = ginfo.gi_attr.va_mode;
437 			vattr.va_mask = AT_TYPE | AT_MODE | AT_SIZE;
438 			vattr.va_size = 0;
439 
440 			/* create the file */
441 			xx = kmod_create(logelem_object_p->i_kmod_object_p,
442 			    &dirfid, np, NULL, &vattr, NONEXCL, VWRITE,
443 			    cred, &filefid, NULL, NULL);
444 			if (xx == 0) {
445 				/* write the file */
446 				xx = kmod_pushback(
447 				    logelem_object_p->i_kmod_object_p,
448 				    cidp, &filefid, cred, NULL, NULL, 0);
449 				if (xx == 0) {
450 					wrotefile = 1;
451 					snprintf(mesgbuf, sizeof (mesgbuf),
452 					    gettext("File %s renamed as %s on "
453 					    "server."),
454 					    namep, np);
455 					logelem_resolution(logelem_object_p,
456 					    mesgbuf);
457 				}
458 			}
459 		}
460 
461 	}
462 
463 	/* if we could not write the file to the server, move to lost+found */
464 	if (wrotefile == 0) {
465 
466 		/* move the file to lost+found */
467 		xx = kmod_lostfound(logelem_object_p->i_kmod_object_p,
468 		    cidp, namep, newname);
469 		if (xx == EINVAL) {
470 			dbug_assert(0);
471 			logelem_log_opskipped(logelem_object_p, namep);
472 			dbug_leave("logelem_lostfound");
473 			return (0);
474 		} else if (xx) {
475 			snprintf(mesgbuf, sizeof (mesgbuf),
476 			    gettext("Cannot move %s to lost+found.  "),
477 			    namep);
478 			strlcat(mesgbuf,
479 			    gettext("Run cachefs fsck on the file system."),
480 			    sizeof (mesgbuf));
481 			logelem_resolution(logelem_object_p, mesgbuf);
482 			return (EIO);
483 		} else {
484 			snprintf(mesgbuf, sizeof (mesgbuf),
485 			    gettext("Moved %s to %s/%s/%s."), namep,
486 			    logelem_object_p->i_kmod_object_p->i_path,
487 			    CACHEFS_LOSTFOUND_NAME, newname);
488 			logelem_resolution(logelem_object_p, mesgbuf);
489 		}
490 	}
491 
492 	/* set the mapping to indicate conflict */
493 	map.ms_cid = *cidp;
494 	map.ms_fid = X_CONFLICT;
495 	map.ms_times = 0;
496 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
497 	if (xx) {
498 		dbug_leave("logelem_lostfound");
499 		return (EIO);
500 	}
501 	dbug_leave("logelem_lostfound");
502 	return (xx);
503 }
504 
505 /*
506  * -----------------------------------------------------------------
507  *			logelem_problem
508  *
509  * Description:
510  *	Specifies the problem string.
511  *	Pass a variable number of strings.
512  *	They are concatinated together to form the message.
513  *	Terminate the argument list with NULL.
514  * Arguments:
515  *	strp
516  * Returns:
517  * Preconditions:
518  *	precond(strp)
519  */
520 
521 void
522 logelem_problem(cfsd_logelem_object_t *logelem_object_p, char *strp)
523 {
524 	dbug_enter("logelem_problem");
525 	dbug_precond(strp);
526 
527 	logelem_message(logelem_object_p, gettext("cachefsd: Problem: "), strp);
528 	dbug_leave("logelem_problem");
529 }
530 
531 /*
532  * -----------------------------------------------------------------
533  *			logelem_resolution
534  *
535  * Description:
536  *	Specifies the resolution string.
537  *	Pass a variable number of strings.
538  *	They are concatinated together to form the message.
539  *	Terminate the argument list with NULL.
540  * Arguments:
541  *	strp
542  * Returns:
543  * Preconditions:
544  *	precond(strp)
545  */
546 
547 void
548 logelem_resolution(cfsd_logelem_object_t *logelem_object_p, char *strp)
549 {
550 	dbug_enter("logelem_resolution");
551 	dbug_precond(strp);
552 
553 	logelem_message(logelem_object_p, gettext("cachefsd: Resolution: "),
554 	    strp);
555 	dbug_leave("logelem_resolution");
556 }
557 /*
558  * -----------------------------------------------------------------
559  *			logelem_message_append
560  *
561  * Description:
562  * Arguments:
563  * Returns:
564  * Preconditions:
565  *	precond(strp1)
566  *	precond(strp1)
567  */
568 
569 void
570 logelem_message_append(char *strp1, char *strp2)
571 {
572 	dbug_enter("logelem_message_append");
573 	if ((strlen(strp1) + strlen(strp2)) < (size_t)CFSDMesgMax)
574 		strcat(strp1, strp2);
575 	else {
576 		fprintf(stderr,
577 		    gettext("cachefsd: log element message truncated\n"));
578 		strncat(strp1, strp2, CFSDMesgMax - (strlen(strp1) + 1));
579 	}
580 	dbug_leave("logelem_message_append");
581 }
582 /*
583  * -----------------------------------------------------------------
584  *			logelem_message
585  *
586  * Description:
587  * Arguments:
588  *	prefix
589  *	strp
590  * Returns:
591  * Preconditions:
592  *	precond(prefix)
593  *	precond(strp)
594  */
595 
596 void
597 logelem_message(cfsd_logelem_object_t *logelem_object_p,
598 	char *prefix,
599 	char *strp)
600 {
601 	dbug_enter("logelem_message");
602 
603 	dbug_precond(prefix);
604 	dbug_precond(strp);
605 
606 	logelem_message_append(logelem_object_p->i_messagep, prefix);
607 	logelem_message_append(logelem_object_p->i_messagep, strp);
608 	logelem_message_append(logelem_object_p->i_messagep, "\n");
609 	dbug_leave("logelem_message");
610 }
611 /*
612  * -----------------------------------------------------------------
613  *			logelem_log_opfailed
614  *
615  * Description:
616  * Arguments:
617  * Returns:
618  * Preconditions:
619  */
620 
621 void
622 logelem_log_opfailed(cfsd_logelem_object_t *logelem_object_p,
623 	char *opp, char *info, const char *namep, int xx)
624 {
625 	char mesgbuf[CFSDStrMax];
626 	char errorbuf[CFSDStrMax];
627 
628 	/*
629 	 * XXX need to change this so we don't assemble the message,
630 	 * this violates localization.
631 	 */
632 	snprintf(mesgbuf, sizeof (mesgbuf), gettext("%s failed"), opp);
633 	if (namep) {
634 		strlcat(mesgbuf, gettext(" on "), sizeof (mesgbuf));
635 		strlcat(mesgbuf, namep, sizeof (mesgbuf));
636 	}
637 	strlcat(mesgbuf, ".", sizeof (mesgbuf));
638 	if (info) {
639 		strlcat(mesgbuf, " ", sizeof (mesgbuf));
640 		strlcat(mesgbuf, info, sizeof (mesgbuf));
641 		strlcat(mesgbuf, ".", sizeof (mesgbuf));
642 	}
643 	if (xx) {
644 		snprintf(errorbuf, sizeof (errorbuf),
645 		    gettext(" Error: %s."), strerror(xx));
646 		strlcat(mesgbuf, errorbuf, sizeof (mesgbuf));
647 	}
648 	logelem_problem(logelem_object_p, mesgbuf);
649 }
650 /*
651  * -----------------------------------------------------------------
652  *			logelem_log_opskipped
653  *
654  * Description:
655  * Arguments:
656  * Returns:
657  * Preconditions:
658  */
659 
660 void
661 logelem_log_opskipped(cfsd_logelem_object_t *logelem_object_p,
662 	const char *namep)
663 {
664 	char mesgbuf[CFSDStrMax];
665 
666 	snprintf(mesgbuf, sizeof (mesgbuf),
667 	    gettext("Operation on %s skipped."), namep);
668 	logelem_resolution(logelem_object_p, mesgbuf);
669 }
670 /*
671  * -----------------------------------------------------------------
672  *			logelem_log_timelogmesg
673  *
674  * Description:
675  * Arguments:
676  * Returns:
677  * Preconditions:
678  */
679 
680 void
681 logelem_log_timelogmesg(cfsd_logelem_object_t *logelem_object_p,
682 	char *opp, const char *namep, char *mesgp, int time_log)
683 {
684 	char mesgbuf[CFSDStrMax];
685 
686 	/*
687 	 * XXX need to change this so we don't assemble the message,
688 	 * this violates localization.
689 	 */
690 	snprintf(mesgbuf, sizeof (mesgbuf), gettext("%s failed"), opp);
691 	if (namep) {
692 		strlcat(mesgbuf, gettext(" on "), sizeof (mesgbuf));
693 		strlcat(mesgbuf, namep, sizeof (mesgbuf));
694 	}
695 	strlcat(mesgbuf, ".", sizeof (mesgbuf));
696 	if (mesgp) {
697 		strlcat(mesgbuf, mesgp, sizeof (mesgbuf));
698 		strlcat(mesgbuf, ".", sizeof (mesgbuf));
699 	}
700 	strlcat(mesgbuf, " ", sizeof (mesgbuf));
701 	switch (time_log) {
702 	case 0:
703 		strlcat(mesgbuf, gettext("while rolling log."),
704 		    sizeof (mesgbuf));
705 		break;
706 	case 1:
707 		strlcat(mesgbuf, gettext("while disconnected."),
708 		    sizeof (mesgbuf));
709 		break;
710 
711 	default:
712 		strlcat(mesgbuf, gettext("while unknown operation."),
713 		    sizeof (mesgbuf));
714 		break;
715 	}
716 
717 	logelem_problem(logelem_object_p, mesgbuf);
718 }
719 
720 /*
721  *			cfsd_logelem_setattr_create
722  *
723  * Description:
724  * Arguments:
725  * Returns:
726  * Preconditions:
727  */
728 
729 
730 cfsd_logelem_object_t *
731 cfsd_logelem_setattr_create(cfsd_maptbl_object_t *maptbl_object_p,
732 	cfsd_logfile_object_t *logfile_object_p,
733 	cfsd_kmod_object_t *kmod_object_p)
734 {
735 	cfsd_logelem_object_t *logelem_object_p;
736 	cfsd_logelem_setattr_object_t *setattr_object_p;
737 
738 	dbug_enter("cfsd_logelem_setattr_create");
739 
740 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
741 	    logfile_object_p, kmod_object_p);
742 	logelem_object_p->i_type = SETATTR_OBJECT_TYPE;
743 
744 	setattr_object_p = SETATTR_OBJECT_PTR(logelem_object_p);
745 	setattr_object_p->i_up =
746 	    &logelem_object_p->i_entp->dl_u.dl_setattr;
747 	dbug_leave("cfsd_logelem_setattr_create");
748 	return (logelem_object_p);
749 }
750 
751 /*
752  *			cfsd_logelem_setsecattr_create
753  *
754  * Description:
755  * Arguments:
756  * Returns:
757  * Preconditions:
758  */
759 cfsd_logelem_object_t *
760 cfsd_logelem_setsecattr_create(cfsd_maptbl_object_t *maptbl_object_p,
761 	cfsd_logfile_object_t *logfile_object_p,
762 	cfsd_kmod_object_t *kmod_object_p)
763 {
764 	cfsd_logelem_object_t *logelem_object_p;
765 	cfsd_logelem_setsecattr_object_t *setsecattr_object_p;
766 
767 	dbug_enter("cfsd_logelem_setsecattr_create");
768 
769 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
770 	    logfile_object_p, kmod_object_p);
771 	logelem_object_p->i_type = SETSECATTR_OBJECT_TYPE;
772 
773 	setsecattr_object_p = SETSECATTR_OBJECT_PTR(logelem_object_p);
774 	setsecattr_object_p->i_up =
775 	    &logelem_object_p->i_entp->dl_u.dl_setsecattr;
776 	setsecattr_object_p->i_acl =
777 	    (const aclent_t *)
778 	    ((caddr_t)setsecattr_object_p->i_up->dl_buffer +
779 	    ((off_t)(setsecattr_object_p->i_up->dl_cred.cr_ngroups - 1)
780 	    * (off_t)sizeof (gid_t)));
781 	dbug_leave("cfsd_logelem_setsecattr_create");
782 	return (logelem_object_p);
783 }
784 /*
785  *			cfsd_logelem_create_create
786  *
787  * Description:
788  * Arguments:
789  * Returns:
790  * Preconditions:
791  */
792 
793 cfsd_logelem_object_t *
794 cfsd_logelem_create_create(cfsd_maptbl_object_t *maptbl_object_p,
795 	cfsd_logfile_object_t *logfile_object_p,
796 	cfsd_kmod_object_t *kmod_object_p)
797 {
798 	cfsd_logelem_object_t *logelem_object_p;
799 	cfsd_logelem_create_object_t *create_object_p;
800 
801 	dbug_enter("cfsd_logelem_create_create");
802 
803 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
804 	    logfile_object_p, kmod_object_p);
805 	logelem_object_p->i_type = CREATE_OBJECT_TYPE;
806 
807 	create_object_p = CREATE_OBJECT_PTR(logelem_object_p);
808 	create_object_p->i_up =
809 	    &logelem_object_p->i_entp->dl_u.dl_create;
810 	create_object_p->i_namep =
811 	    create_object_p->i_up->dl_buffer +
812 	    ((create_object_p->i_up->dl_cred.cr_ngroups - 1) *
813 	    sizeof (gid_t));
814 	dbug_leave("cfsd_logelem_create_create");
815 	return (logelem_object_p);
816 }
817 
818 /*
819  *			cfsd_logelem_remove_create
820  *
821  * Description:
822  * Arguments:
823  * Returns:
824  * Preconditions:
825  */
826 
827 cfsd_logelem_object_t *
828 cfsd_logelem_remove_create(cfsd_maptbl_object_t *maptbl_object_p,
829 	cfsd_logfile_object_t *logfile_object_p,
830 	cfsd_kmod_object_t *kmod_object_p)
831 {
832 	cfsd_logelem_object_t *logelem_object_p;
833 	cfsd_logelem_remove_object_t *remove_object_p;
834 
835 	dbug_enter("cfsd_logelem_remove_create");
836 
837 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
838 	    logfile_object_p, kmod_object_p);
839 	logelem_object_p->i_type = REMOVE_OBJECT_TYPE;
840 
841 	remove_object_p = REMOVE_OBJECT_PTR(logelem_object_p);
842 	remove_object_p->i_up =
843 	    &logelem_object_p->i_entp->dl_u.dl_remove;
844 	remove_object_p->i_namep =
845 	    remove_object_p->i_up->dl_buffer +
846 	    ((remove_object_p->i_up->dl_cred.cr_ngroups - 1) *
847 	    sizeof (gid_t));
848 	dbug_leave("cfsd_logelem_remove_create");
849 	return (logelem_object_p);
850 }
851 /*
852  * -----------------------------------------------------------------
853  *			cfsd_logelem_rmdir_create
854  *
855  * Description:
856  * Arguments:
857  * Returns:
858  * Preconditions:
859  */
860 
861 cfsd_logelem_object_t *
862 cfsd_logelem_rmdir_create(cfsd_maptbl_object_t *maptbl_object_p,
863 	cfsd_logfile_object_t *logfile_object_p,
864 	cfsd_kmod_object_t *kmod_object_p)
865 {
866 	cfsd_logelem_object_t *logelem_object_p;
867 	cfsd_logelem_rmdir_object_t *rmdir_object_p;
868 
869 	dbug_enter("cfsd_logelem_rmdir_create");
870 
871 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
872 	    logfile_object_p, kmod_object_p);
873 	logelem_object_p->i_type = RMDIR_OBJECT_TYPE;
874 
875 	rmdir_object_p = RMDIR_OBJECT_PTR(logelem_object_p);
876 	rmdir_object_p->i_up =
877 	    &logelem_object_p->i_entp->dl_u.dl_rmdir;
878 	rmdir_object_p->i_namep =
879 	    rmdir_object_p->i_up->dl_buffer +
880 	    ((rmdir_object_p->i_up->dl_cred.cr_ngroups - 1)
881 	    * sizeof (gid_t));
882 	dbug_leave("cfsd_logelem_rmdir_create");
883 	return (logelem_object_p);
884 }
885 /*
886  * -----------------------------------------------------------------
887  *			cfsd_logelem_mkdir_create
888  *
889  * Description:
890  * Arguments:
891  * Returns:
892  * Preconditions:
893  */
894 
895 cfsd_logelem_object_t *
896 cfsd_logelem_mkdir_create(cfsd_maptbl_object_t *maptbl_object_p,
897 	cfsd_logfile_object_t *logfile_object_p,
898 	cfsd_kmod_object_t *kmod_object_p)
899 {
900 	cfsd_logelem_object_t *logelem_object_p;
901 	cfsd_logelem_mkdir_object_t *mkdir_object_p;
902 
903 	dbug_enter("cfsd_logelem_mkdir_create");
904 
905 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
906 	    logfile_object_p, kmod_object_p);
907 	logelem_object_p->i_type = MKDIR_OBJECT_TYPE;
908 
909 	mkdir_object_p = MKDIR_OBJECT_PTR(logelem_object_p);
910 	mkdir_object_p->i_up =
911 	    &logelem_object_p->i_entp->dl_u.dl_mkdir;
912 	mkdir_object_p->i_namep =
913 	    mkdir_object_p->i_up->dl_buffer +
914 	    ((mkdir_object_p->i_up->dl_cred.cr_ngroups - 1) *
915 	    sizeof (gid_t));
916 	dbug_leave("cfsd_logelem_mkdir_create");
917 	return (logelem_object_p);
918 }
919 /*
920  * -----------------------------------------------------------------
921  *			cfsd_logelem_link_create
922  *
923  * Description:
924  * Arguments:
925  * Returns:
926  * Preconditions:
927  */
928 
929 cfsd_logelem_object_t *
930 cfsd_logelem_link_create(cfsd_maptbl_object_t *maptbl_object_p,
931 	cfsd_logfile_object_t *logfile_object_p,
932 	cfsd_kmod_object_t *kmod_object_p)
933 {
934 	cfsd_logelem_object_t *logelem_object_p;
935 	cfsd_logelem_link_object_t *link_object_p;
936 
937 	dbug_enter("cfsd_logelem_link_create");
938 
939 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
940 	    logfile_object_p, kmod_object_p);
941 	logelem_object_p->i_type = LINK_OBJECT_TYPE;
942 
943 	link_object_p = LINK_OBJECT_PTR(logelem_object_p);
944 	link_object_p->i_up =
945 	    &logelem_object_p->i_entp->dl_u.dl_link;
946 	link_object_p->i_namep =
947 	    link_object_p->i_up->dl_buffer +
948 	    ((link_object_p->i_up->dl_cred.cr_ngroups - 1)
949 	    * sizeof (gid_t));
950 	dbug_leave("cfsd_logelem_link_create");
951 	return (logelem_object_p);
952 }
953 /*
954  * -----------------------------------------------------------------
955  *			cfsd_logelem_symlink_create
956  *
957  * Description:
958  * Arguments:
959  * Returns:
960  * Preconditions:
961  */
962 
963 cfsd_logelem_object_t *
964 cfsd_logelem_symlink_create(cfsd_maptbl_object_t *maptbl_object_p,
965 	cfsd_logfile_object_t *logfile_object_p,
966 	cfsd_kmod_object_t *kmod_object_p)
967 {
968 	cfsd_logelem_object_t *logelem_object_p;
969 	cfsd_logelem_symlink_object_t *symlink_object_p;
970 
971 	dbug_enter("cfsd_logelem_symlink_create");
972 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
973 	    logfile_object_p, kmod_object_p);
974 	logelem_object_p->i_type = SYMLINK_OBJECT_TYPE;
975 
976 	symlink_object_p = SYMLINK_OBJECT_PTR(logelem_object_p);
977 	symlink_object_p->i_up =
978 	    &logelem_object_p->i_entp->dl_u.dl_symlink;
979 	symlink_object_p->i_namep =
980 	    symlink_object_p->i_up->dl_buffer +
981 	    ((symlink_object_p->i_up->dl_cred.cr_ngroups - 1) *
982 	    sizeof (gid_t));
983 	symlink_object_p->i_contentsp =
984 	    symlink_object_p->i_namep +
985 	    strlen(symlink_object_p->i_namep) + 1;
986 	dbug_leave("cfsd_logelem_symlink_create");
987 	return (logelem_object_p);
988 }
989 /*
990  * -----------------------------------------------------------------
991  *			cfsd_logelem_rename_create
992  *
993  * Description:
994  * Arguments:
995  * Returns:
996  * Preconditions:
997  */
998 
999 cfsd_logelem_object_t *
1000 cfsd_logelem_rename_create(cfsd_maptbl_object_t *maptbl_object_p,
1001 	cfsd_logfile_object_t *logfile_object_p,
1002 	cfsd_kmod_object_t *kmod_object_p)
1003 {
1004 	cfsd_logelem_object_t *logelem_object_p;
1005 	cfsd_logelem_rename_object_t *rename_object_p;
1006 
1007 	dbug_enter("cfsd_logelem_rename_create");
1008 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
1009 	    logfile_object_p, kmod_object_p);
1010 	logelem_object_p->i_type = RENAME_OBJECT_TYPE;
1011 
1012 	rename_object_p = RENAME_OBJECT_PTR(logelem_object_p);
1013 	rename_object_p->i_up =
1014 	    &logelem_object_p->i_entp->dl_u.dl_rename;
1015 	rename_object_p->i_orignamep =
1016 	    rename_object_p->i_up->dl_buffer +
1017 	    ((rename_object_p->i_up->dl_cred.cr_ngroups - 1) *
1018 	    sizeof (gid_t));
1019 	rename_object_p->i_newnamep =
1020 	    rename_object_p->i_orignamep +
1021 	    strlen(rename_object_p->i_orignamep) + 1;
1022 	dbug_leave("cfsd_logelem_rename_create");
1023 	return (logelem_object_p);
1024 }
1025 /*
1026  *			cfsd_logelem_modified_create
1027  *
1028  * Description:
1029  * Arguments:
1030  * Returns:
1031  * Preconditions:
1032  */
1033 
1034 cfsd_logelem_object_t *
1035 cfsd_logelem_modified_create(cfsd_maptbl_object_t *maptbl_object_p,
1036 	cfsd_logfile_object_t *logfile_object_p,
1037 	cfsd_kmod_object_t *kmod_object_p)
1038 {
1039 	cfsd_logelem_object_t *logelem_object_p;
1040 	cfsd_logelem_modified_object_t *modified_object_p;
1041 
1042 	dbug_enter("cfsd_logelem_modified_create");
1043 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
1044 	    logfile_object_p, kmod_object_p);
1045 	logelem_object_p->i_type = MODIFIED_OBJECT_TYPE;
1046 
1047 	modified_object_p = MODIFIED_OBJECT_PTR(logelem_object_p);
1048 	modified_object_p->i_up =
1049 	    &logelem_object_p->i_entp->dl_u.dl_modify;
1050 	dbug_leave("cfsd_logelem_modified_create");
1051 	return (logelem_object_p);
1052 }
1053 /*
1054  *			cfsd_logelem_mapfid
1055  *
1056  * Description:
1057  * Arguments:
1058  * Returns:
1059  * Preconditions:
1060  */
1061 
1062 cfsd_logelem_object_t *
1063 cfsd_logelem_mapfid_create(cfsd_maptbl_object_t *maptbl_object_p,
1064 	cfsd_logfile_object_t *logfile_object_p,
1065 	cfsd_kmod_object_t *kmod_object_p)
1066 {
1067 	cfsd_logelem_object_t *logelem_object_p;
1068 	cfsd_logelem_mapfid_object_t *mapfid_object_p;
1069 
1070 	dbug_enter("cfsd_logelem_mapfid_create");
1071 	logelem_object_p = cfsd_logelem_create(maptbl_object_p,
1072 	    logfile_object_p, kmod_object_p);
1073 	logelem_object_p->i_type = MAPFID_OBJECT_TYPE;
1074 
1075 	mapfid_object_p = MAPFID_OBJECT_PTR(logelem_object_p);
1076 	mapfid_object_p->i_up =
1077 	    &logelem_object_p->i_entp->dl_u.dl_mapfid;
1078 	dbug_leave("cfsd_logelem_mapfid_create");
1079 	return (logelem_object_p);
1080 }
1081 /*
1082  *			logelem_roll
1083  *
1084  * Description:
1085  * Arguments:
1086  * Returns:
1087  * Preconditions:
1088  */
1089 
1090 int
1091 logelem_roll(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1092 {
1093 	int retval = 0;
1094 
1095 	dbug_enter("logelem_roll");
1096 
1097 	switch (logelem_object_p->i_type) {
1098 
1099 	case NO_OBJECT_TYPE:
1100 		dbug_assert(0);
1101 		retval = EIO;
1102 		break;
1103 
1104 	case SETATTR_OBJECT_TYPE:
1105 		retval = logelem_roll_setattr(logelem_object_p, seqp);
1106 		break;
1107 
1108 	case SETSECATTR_OBJECT_TYPE:
1109 		retval = logelem_roll_setsecattr(logelem_object_p, seqp);
1110 		break;
1111 
1112 	case CREATE_OBJECT_TYPE:
1113 		retval = logelem_roll_create(logelem_object_p, seqp);
1114 		break;
1115 
1116 	case REMOVE_OBJECT_TYPE:
1117 		retval = logelem_roll_remove(logelem_object_p, seqp);
1118 		break;
1119 
1120 	case RMDIR_OBJECT_TYPE:
1121 		retval = logelem_roll_rmdir(logelem_object_p, seqp);
1122 		break;
1123 
1124 	case MKDIR_OBJECT_TYPE:
1125 		retval = logelem_roll_mkdir(logelem_object_p, seqp);
1126 		break;
1127 
1128 	case LINK_OBJECT_TYPE:
1129 		retval = logelem_roll_link(logelem_object_p, seqp);
1130 		break;
1131 
1132 	case SYMLINK_OBJECT_TYPE:
1133 		retval = logelem_roll_symlink(logelem_object_p, seqp);
1134 		break;
1135 
1136 	case RENAME_OBJECT_TYPE:
1137 		retval = logelem_roll_rename(logelem_object_p, seqp);
1138 		break;
1139 
1140 	case MODIFIED_OBJECT_TYPE:
1141 		retval = logelem_roll_modified(logelem_object_p, seqp);
1142 		break;
1143 
1144 	case MAPFID_OBJECT_TYPE:
1145 		retval = logelem_roll_mapfid(logelem_object_p);
1146 		break;
1147 
1148 	default:
1149 		dbug_assert(0);
1150 		retval = EIO;
1151 	}
1152 	dbug_leave("logelem_roll");
1153 	return (retval);
1154 }
1155 /*
1156  *			logelem_roll_setattr
1157  *
1158  * Description:
1159  * Arguments:
1160  * Returns:
1161  * Preconditions:
1162  */
1163 
1164 int
1165 logelem_roll_setattr(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1166 {
1167 
1168 	int xx;
1169 	cfs_fid_t filefid, *fp;
1170 	struct cfs_dlog_mapping_space map;
1171 	cfs_dlog_tm_t *tmp;
1172 	cfs_timestruc_t ctime, mtime;
1173 	int time_log;
1174 	cfs_vattr_t va;
1175 	int conflict = 0;
1176 
1177 	dbug_enter("logelem_roll_setattr");
1178 
1179 	/* get the mapping for this cid if it exists */
1180 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1181 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_cid, &map);
1182 	if (xx == -1) {
1183 		logelem_log_opfailed(logelem_object_p, "Setattr",
1184 		    gettext("error mapping cid"), NULL, 0);
1185 		dbug_leave("logelem_roll_setattr");
1186 		return (EIO);
1187 	}
1188 	/* if a mapping was not found */
1189 	if (xx) {
1190 		/* dummy up mapping so we get values from the cache */
1191 		map.ms_cid = SETATTR_OBJECT(logelem_object_p).i_up->dl_cid;
1192 		map.ms_fid = 0;
1193 		map.ms_times = 0;
1194 	}
1195 
1196 	/* done if there was a conflict on the file */
1197 	if (map.ms_fid == X_CONFLICT) {
1198 		logelem_log_opfailed(logelem_object_p, "Setattr",
1199 		    gettext("file conflict"), NULL, 0);
1200 		dbug_leave("logelem_roll_setattr");
1201 		return (0);
1202 	}
1203 	/* done if the file is optimized out */
1204 	if (map.ms_fid == X_OPTIMIZED) {
1205 		dbug_leave("logelem_roll_setattr");
1206 		return (0);
1207 	}
1208 	/* if we have a fid in the mapping */
1209 	if (map.ms_fid) {
1210 		/* get the fid */
1211 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1212 		    map.ms_fid, (caddr_t *)&fp);
1213 		if (xx) {
1214 			logelem_log_opfailed(logelem_object_p, "Setattr",
1215 			    gettext("error getting logfile offset"), NULL, xx);
1216 			dbug_leave("logelem_roll_setattr");
1217 			return (EIO);
1218 		}
1219 		filefid = *fp;
1220 		dbug_assert(filefid.fid_len);
1221 	}
1222 
1223 	/* else get the fid from the cache */
1224 	else {
1225 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
1226 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid, &filefid);
1227 		if (xx == ENOENT) {
1228 			dbug_leave("logelem_roll_setattr");
1229 			return (0);
1230 		}
1231 		if (xx) {
1232 			logelem_log_opfailed(logelem_object_p, "Setattr",
1233 			    gettext("File is no longer in the cache"),
1234 			    NULL, xx);
1235 			xx = logelem_lostfound(logelem_object_p,
1236 			    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1237 			    NULL, NULL,
1238 			    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1239 			dbug_leave("logelem_roll_setattr");
1240 			return (xx);
1241 		}
1242 	}
1243 
1244 	/* if we have timestamps in the mapping */
1245 	if (map.ms_times) {
1246 		/* get the times */
1247 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1248 		    map.ms_times, (caddr_t *)&tmp);
1249 		if (xx) {
1250 			logelem_log_opfailed(logelem_object_p, "Setattr",
1251 			    gettext("error getting logfile offset"), NULL, xx);
1252 			dbug_leave("logelem_roll_setattr");
1253 			return (EIO);
1254 		}
1255 		ctime = tmp->tm_ctime;
1256 		mtime = tmp->tm_mtime;
1257 		time_log = 0;
1258 	}
1259 
1260 	/* else get the timestamps from the log entry */
1261 	else {
1262 		ctime = SETATTR_OBJECT(logelem_object_p).i_up->dl_ctime;
1263 		mtime = SETATTR_OBJECT(logelem_object_p).i_up->dl_mtime;
1264 		time_log = 1;
1265 	}
1266 
1267 	/* get the attributes of the file from the back fs */
1268 	xx = kmod_getattrfid(logelem_object_p->i_kmod_object_p, &filefid,
1269 	    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred, &va);
1270 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1271 		dbug_leave("logelem_roll_setattr");
1272 		return (ETIMEDOUT);
1273 	}
1274 	if (xx) {
1275 		logelem_log_opfailed(logelem_object_p, "Setattr",
1276 		    gettext("error getting attributes"), NULL, xx);
1277 		xx = logelem_lostfound(logelem_object_p,
1278 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1279 		    NULL, NULL,
1280 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1281 		dbug_leave("logelem_roll_setattr");
1282 		return (xx);
1283 	}
1284 
1285 
1286 	/* conflict if mtime changed */
1287 	if (TIMECHANGE(mtime, va.va_mtime)) {
1288 		logelem_log_timelogmesg(logelem_object_p, "Setattr",
1289 		    NULL, gettext("File modified"), time_log);
1290 		conflict = 1;
1291 	}
1292 
1293 	/* conflict if ctime changed */
1294 	else if (TIMECHANGE(ctime, va.va_ctime)) {
1295 		logelem_log_timelogmesg(logelem_object_p, "Setattr",
1296 		    NULL, gettext("File changed"), time_log);
1297 		conflict = 1;
1298 	}
1299 
1300 	/* if a conflict was detected */
1301 	if (conflict) {
1302 		logelem_log_opfailed(logelem_object_p, "Setattr",
1303 		    gettext("file conflict"), NULL, 0);
1304 		xx = logelem_lostfound(logelem_object_p,
1305 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1306 		    NULL, NULL,
1307 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1308 		dbug_leave("logelem_roll_setattr");
1309 		return (xx);
1310 	}
1311 
1312 	/* now do the setattr, get the new times */
1313 	xx = kmod_setattr(logelem_object_p->i_kmod_object_p,
1314 	    &filefid, &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1315 	    &SETATTR_OBJECT(logelem_object_p).i_up->dl_attrs,
1316 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_flags,
1317 	    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred,
1318 	    &SETATTR_OBJECT(logelem_object_p).i_up->dl_ctime,
1319 	    &SETATTR_OBJECT(logelem_object_p).i_up->dl_mtime);
1320 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1321 		dbug_leave("logelem_roll_setattr");
1322 		return (ETIMEDOUT);
1323 	}
1324 	if (xx) {
1325 		logelem_log_opfailed(logelem_object_p, "Setattr", NULL,
1326 		    NULL, xx);
1327 		xx = logelem_lostfound(logelem_object_p,
1328 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1329 		    NULL, NULL,
1330 		    &SETATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1331 		dbug_leave("logelem_roll_setattr");
1332 		return (xx);
1333 	}
1334 
1335 	/* update the mapping to point to the new times */
1336 	map.ms_times = logelem_object_p->i_offset +
1337 	    offsetof(cfs_dlog_entry_t, dl_u.dl_setattr.dl_times);
1338 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
1339 	if (xx) {
1340 		dbug_leave("logelem_roll_setattr");
1341 		return (EIO);
1342 	}
1343 	dbug_leave("logelem_roll_setattr");
1344 	return (0);
1345 }
1346 
1347 /*
1348  *			logelem_roll_setsecattr
1349  *
1350  * Description:
1351  * Arguments:
1352  * Returns:
1353  * Preconditions:
1354  */
1355 
1356 int
1357 logelem_roll_setsecattr(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1358 {
1359 	int xx;
1360 	cfs_fid_t filefid, *fp;
1361 	struct cfs_dlog_mapping_space map;
1362 	cfs_dlog_tm_t *tmp;
1363 	cfs_timestruc_t ctime, mtime;
1364 	int time_log;
1365 	cfs_vattr_t va;
1366 	int conflict = 0;
1367 
1368 	dbug_enter("logelem_roll_setsecattr");
1369 	/* get the mapping for this cid if it exists */
1370 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1371 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid, &map);
1372 	if (xx == -1) {
1373 		logelem_log_opfailed(logelem_object_p, "Setsecattr",
1374 		    gettext("error mapping cid"), NULL, 0);
1375 		dbug_leave("logelem_roll_setsecattr");
1376 		return (EIO);
1377 	}
1378 	/* if a mapping was not found */
1379 	if (xx) {
1380 		/* dummy up mapping so we get values from the cache */
1381 		map.ms_cid = SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid;
1382 		map.ms_fid = 0;
1383 		map.ms_times = 0;
1384 	}
1385 
1386 	/* done if there was a conflict on the file */
1387 	if (map.ms_fid == X_CONFLICT) {
1388 		logelem_log_opfailed(logelem_object_p, "Setsecattr",
1389 		    gettext("file conflict"), NULL, 0);
1390 		dbug_leave("logelem_roll_setsecattr");
1391 		return (0);
1392 	}
1393 	/* done if the file is optimized out */
1394 	if (map.ms_fid == X_OPTIMIZED) {
1395 		dbug_leave("logelem_roll_setsecattr");
1396 		return (0);
1397 	}
1398 	/* if we have a fid in the mapping */
1399 	if (map.ms_fid) {
1400 		/* get the fid */
1401 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1402 		    map.ms_fid, (caddr_t *)&fp);
1403 		if (xx) {
1404 			logelem_log_opfailed(logelem_object_p, "Setsecattr",
1405 			    gettext("error getting logfile offset"), NULL, 0);
1406 			dbug_leave("logelem_roll_setsecattr");
1407 			return (EIO);
1408 		}
1409 		filefid = *fp;
1410 		dbug_assert(filefid.fid_len);
1411 	}
1412 
1413 	/* else get the fid from the cache */
1414 	else {
1415 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
1416 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1417 		    &filefid);
1418 		if (xx == ENOENT) {
1419 			dbug_leave("logelem_roll_setsecattr");
1420 			return (0);
1421 		}
1422 		if (xx) {
1423 			logelem_log_opfailed(logelem_object_p, "Setsecattr",
1424 			    gettext("File is no longer in the cache"),
1425 			    NULL, xx);
1426 			xx = logelem_lostfound(logelem_object_p,
1427 			    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1428 			    NULL, NULL,
1429 			    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1430 			dbug_leave("logelem_roll_setsecattr");
1431 			return (xx);
1432 		}
1433 	}
1434 
1435 	/* if we have timestamps in the mapping */
1436 	if (map.ms_times) {
1437 		/* get the times */
1438 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1439 		    map.ms_times, (caddr_t *)&tmp);
1440 		if (xx) {
1441 			logelem_log_opfailed(logelem_object_p, "Setsecattr",
1442 			    gettext("error getting logfile offset"), NULL, 0);
1443 			dbug_leave("logelem_roll_setsecattr");
1444 			return (EIO);
1445 		}
1446 		ctime = tmp->tm_ctime;
1447 		mtime = tmp->tm_mtime;
1448 		time_log = 0;
1449 	}
1450 
1451 	/* else get the timestamps from the log entry */
1452 	else {
1453 		ctime = SETSECATTR_OBJECT(logelem_object_p).i_up->dl_ctime;
1454 		mtime = SETSECATTR_OBJECT(logelem_object_p).i_up->dl_mtime;
1455 		time_log = 1;
1456 	}
1457 
1458 	/* get the attributes of the file from the back fs */
1459 	xx = kmod_getattrfid(logelem_object_p->i_kmod_object_p, &filefid,
1460 	    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred, &va);
1461 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1462 		dbug_leave("logelem_roll_setsecattr");
1463 		return (ETIMEDOUT);
1464 	}
1465 	if (xx) {
1466 		logelem_log_opfailed(logelem_object_p, "Setsecattr",
1467 		    gettext("error getting attributes"), NULL, 0);
1468 		xx = logelem_lostfound(logelem_object_p,
1469 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1470 		    NULL, NULL,
1471 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1472 		dbug_leave("logelem_roll_setsecattr");
1473 		return (xx);
1474 	}
1475 
1476 	/* conflict if mtime changed */
1477 	if (TIMECHANGE(mtime, va.va_mtime)) {
1478 		logelem_log_timelogmesg(logelem_object_p, "Setsecattr",
1479 		    NULL, gettext("File modified"), time_log);
1480 		conflict = 1;
1481 	}
1482 
1483 	/* conflict if ctime changed */
1484 	else if (TIMECHANGE(ctime, va.va_ctime)) {
1485 		logelem_log_timelogmesg(logelem_object_p, "Setsecattr",
1486 		    NULL, gettext("File changed"), time_log);
1487 		conflict = 1;
1488 	}
1489 
1490 	/* if a conflict was detected */
1491 	if (conflict) {
1492 		logelem_log_opfailed(logelem_object_p, "Setsecattr",
1493 		    gettext("file conflict"), NULL, 0);
1494 		xx = logelem_lostfound(logelem_object_p,
1495 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1496 		    NULL, NULL,
1497 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1498 		dbug_leave("logelem_roll_setsecattr");
1499 		return (xx);
1500 	}
1501 
1502 	/* now do the setsecattr, get the new times */
1503 	xx = kmod_setsecattr(logelem_object_p->i_kmod_object_p, &filefid,
1504 	    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1505 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_mask,
1506 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_aclcnt,
1507 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_dfaclcnt,
1508 	    SETSECATTR_OBJECT(logelem_object_p).i_acl,
1509 	    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred,
1510 	    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_ctime,
1511 	    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_mtime);
1512 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1513 		dbug_leave("logelem_roll_setsecattr");
1514 		return (ETIMEDOUT);
1515 	}
1516 	if (xx) {
1517 		logelem_log_opfailed(logelem_object_p, "Setsecattr", NULL,
1518 		    NULL, xx);
1519 		xx = logelem_lostfound(logelem_object_p,
1520 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid,
1521 		    NULL, NULL,
1522 		    &SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred);
1523 		dbug_leave("logelem_roll_setsecattr");
1524 		return (xx);
1525 	}
1526 
1527 	/* update the mapping to point to the new times */
1528 	map.ms_times = logelem_object_p->i_offset +
1529 	    offsetof(cfs_dlog_entry_t, dl_u.dl_setsecattr.dl_times);
1530 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
1531 	if (xx) {
1532 		dbug_leave("logelem_roll_setsecattr");
1533 		return (EIO);
1534 	}
1535 	dbug_leave("logelem_roll_setsecattr");
1536 	return (0);
1537 }
1538 
1539 /*
1540  *			logelem_roll_create
1541  *
1542  * Description:
1543  * Arguments:
1544  * Returns:
1545  * Preconditions:
1546  */
1547 
1548 int
1549 logelem_roll_create(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1550 {
1551 	int xx;
1552 	cfs_fid_t *fp;
1553 	cfs_fid_t dirfid;
1554 	struct cfs_dlog_mapping_space map;
1555 	cfs_fid_t filefid2;
1556 	cfs_vattr_t va;
1557 
1558 	dbug_enter("logelem_roll_create");
1559 	/* if the file existed at the time of this operation */
1560 	dbug_assert(CREATE_OBJECT(logelem_object_p).i_up->dl_exists == 0);
1561 
1562 	/* see if the file no longer exists in the cache */
1563 #if 0
1564 	xx = kmod_exists(logelem_object_p->i_kmod_object_p,
1565 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid);
1566 	if (xx) {
1567 		dbug_assert(xx == ENOENT);
1568 
1569 		/* indicate ignore future operations on file */
1570 		map.ms_cid = CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid;
1571 		map.ms_fid = X_OPTIMIZED;
1572 		map.ms_times = 0;
1573 		xx = maptbl_set(maptbl_object_p, &map, 1);
1574 		dbug_leave("logelem_roll_create");
1575 		if (xx) {
1576 			dbug_leave("logelem_roll_create");
1577 			return (EIO);
1578 		}
1579 		dbug_leave("logelem_roll_create");
1580 		return (0);
1581 	}
1582 #endif
1583 
1584 	/* get the fid of the parent directory */
1585 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1586 	    CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid, &map);
1587 	if (xx == -1) {
1588 		logelem_log_opfailed(logelem_object_p, "Create",
1589 		    gettext("error mapping fid"), NULL, 0);
1590 		dbug_leave("logelem_roll_create");
1591 		return (EIO);
1592 	}
1593 	/* if error from getting map or no fid in map (ms_fid == 0) */
1594 	if (xx || (map.ms_fid <= 0)) {
1595 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
1596 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1597 		    &dirfid);
1598 		if (xx) {
1599 			logelem_log_opfailed(logelem_object_p, "Create",
1600 			    gettext("Parent directory no longer exists"),
1601 			    CREATE_OBJECT(logelem_object_p).i_namep, xx);
1602 			xx = logelem_lostfound(logelem_object_p,
1603 			    &CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid,
1604 			    &
1605 			    CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1606 			    CREATE_OBJECT(logelem_object_p).i_namep,
1607 			    &CREATE_OBJECT(logelem_object_p).i_up->dl_cred);
1608 			dbug_leave("logelem_roll_create");
1609 			return (xx);
1610 		}
1611 	} else {
1612 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1613 		    map.ms_fid, (caddr_t *)&fp);
1614 		if (xx) {
1615 			logelem_log_opfailed(logelem_object_p, "Create",
1616 			    gettext("error getting logfile offset"), NULL, 0);
1617 			dbug_leave("logelem_roll_create");
1618 			return (EIO);
1619 		}
1620 		dirfid = *fp;
1621 		dbug_assert(dirfid.fid_len);
1622 	}
1623 
1624 	/* if the file exists on the back fs */
1625 	xx = kmod_getattrname(logelem_object_p->i_kmod_object_p, &dirfid,
1626 	    CREATE_OBJECT(logelem_object_p).i_namep,
1627 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_cred, &va, &filefid2);
1628 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1629 		dbug_leave("logelem_roll_create");
1630 		return (ETIMEDOUT);
1631 	}
1632 
1633 	/* if the file exists on the back file system */
1634 	if (xx == 0) {
1635 		logelem_log_opfailed(logelem_object_p, "Create",
1636 		    gettext("File created while disconnected"),
1637 		    CREATE_OBJECT(logelem_object_p).i_namep, xx);
1638 		xx = logelem_lostfound(logelem_object_p,
1639 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid,
1640 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1641 		    CREATE_OBJECT(logelem_object_p).i_namep,
1642 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_cred);
1643 		dbug_leave("logelem_roll_create");
1644 		return (xx);
1645 	}
1646 
1647 	/* do the create */
1648 	xx = kmod_create(logelem_object_p->i_kmod_object_p, &dirfid,
1649 	    CREATE_OBJECT(logelem_object_p).i_namep,
1650 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid,
1651 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_attrs, NONEXCL,
1652 	    CREATE_OBJECT(logelem_object_p).i_up->dl_mode,
1653 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_cred,
1654 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_fid,
1655 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_ctime,
1656 	    &CREATE_OBJECT(logelem_object_p).i_up->dl_mtime);
1657 	if (xx) {
1658 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
1659 			dbug_leave("logelem_roll_create");
1660 			return (ETIMEDOUT);
1661 		}
1662 		/* create failed move to lost and found */
1663 		logelem_log_opfailed(logelem_object_p, "Create", NULL,
1664 		    CREATE_OBJECT(logelem_object_p).i_namep, xx);
1665 		xx = logelem_lostfound(logelem_object_p,
1666 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid,
1667 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1668 		    CREATE_OBJECT(logelem_object_p).i_namep,
1669 		    &CREATE_OBJECT(logelem_object_p).i_up->dl_cred);
1670 		dbug_leave("logelem_roll_create");
1671 		return (xx);
1672 	}
1673 
1674 	/* update the mapping to point to the new fid and times */
1675 	map.ms_cid = CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid;
1676 	map.ms_fid = logelem_object_p->i_offset +
1677 	    offsetof(cfs_dlog_entry_t, dl_u.dl_create.dl_fid);
1678 	map.ms_times = logelem_object_p->i_offset +
1679 	    offsetof(cfs_dlog_entry_t, dl_u.dl_create.dl_times);
1680 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
1681 	if (xx) {
1682 		dbug_leave("logelem_roll_create");
1683 		return (EIO);
1684 	}
1685 	dbug_leave("logelem_roll_create");
1686 	return (0);
1687 }
1688 /*
1689  * -----------------------------------------------------------------
1690  *			logelem_roll_remove
1691  *
1692  * Description:
1693  * Arguments:
1694  * Returns:
1695  * Preconditions:
1696  */
1697 
1698 
1699 int
1700 logelem_roll_remove(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1701 {
1702 
1703 	int xx;
1704 	cfs_fid_t *fp;
1705 	cfs_fid_t dirfid;
1706 	struct cfs_dlog_mapping_space map, dirmap;
1707 	cfs_timestruc_t ctime, mtime;
1708 	int time_log;
1709 	cfs_dlog_tm_t *tmp;
1710 	cfs_fid_t filefid2;
1711 	cfs_vattr_t va;
1712 	cfs_timestruc_t *ctimep;
1713 
1714 	dbug_enter("logelem_roll_remove");
1715 	/* get the mapping for this cid if it exists */
1716 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1717 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_child_cid, &map);
1718 	if (xx == -1) {
1719 		logelem_log_opfailed(logelem_object_p, "Remove",
1720 		    gettext("error mapping cid"), NULL, 0);
1721 		dbug_leave("logelem_roll_remove");
1722 		return (EIO);
1723 	}
1724 
1725 	/* done if there was a conflict on the file */
1726 	if (map.ms_fid == X_CONFLICT) {
1727 		logelem_log_opfailed(logelem_object_p, "Remove",
1728 		    gettext("file conflict"), NULL, 0);
1729 		dbug_leave("logelem_roll_remove");
1730 		return (0);
1731 	}
1732 
1733 	/* done if the file is optimized out */
1734 	if (map.ms_fid == X_OPTIMIZED) {
1735 		dbug_leave("logelem_roll_remove");
1736 		return (0);
1737 	}
1738 
1739 	/* if a mapping was not found */
1740 	if (xx) {
1741 		/* dummy up mapping so we get values from the cache */
1742 		map.ms_cid = REMOVE_OBJECT(logelem_object_p).i_up->dl_child_cid;
1743 		map.ms_fid = 0;
1744 		map.ms_times = 0;
1745 	}
1746 
1747 	/* if we have timestamps in the mapping */
1748 	if (map.ms_times) {
1749 		/* get the times */
1750 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1751 		    map.ms_times, (caddr_t *)&tmp);
1752 		if (xx) {
1753 			logelem_log_opfailed(logelem_object_p, "Remove",
1754 			    gettext("error getting logfile offset"), NULL, 0);
1755 			dbug_leave("logelem_roll_remove");
1756 			return (EIO);
1757 		}
1758 		ctime = tmp->tm_ctime;
1759 		mtime = tmp->tm_mtime;
1760 		time_log = 0;
1761 	}
1762 
1763 	/* else get the timestamps from the log entry */
1764 	else {
1765 		ctime = REMOVE_OBJECT(logelem_object_p).i_up->dl_ctime;
1766 		mtime = REMOVE_OBJECT(logelem_object_p).i_up->dl_mtime;
1767 		time_log = 1;
1768 	}
1769 
1770 	/* get the fid of the parent directory */
1771 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1772 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_parent_cid, &dirmap);
1773 	if (xx == -1) {
1774 		logelem_log_opfailed(logelem_object_p, "Remove",
1775 		    gettext("error mapping fid"), NULL, 0);
1776 		dbug_leave("logelem_roll_remove");
1777 		return (EIO);
1778 	}
1779 	/* if error from getting map or no fid in map (ms_fid == 0) */
1780 	if (xx || (dirmap.ms_fid <= 0)) {
1781 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
1782 		    &REMOVE_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1783 		    &dirfid);
1784 		if (xx) {
1785 			logelem_log_opfailed(logelem_object_p, "Remove",
1786 			    gettext("Parent directory no longer exists"),
1787 			    REMOVE_OBJECT(logelem_object_p).i_namep, xx);
1788 			logelem_log_opskipped(logelem_object_p,
1789 			    REMOVE_OBJECT(logelem_object_p).i_namep);
1790 			dbug_leave("logelem_roll_remove");
1791 			return (0);
1792 		}
1793 	} else {
1794 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1795 		    dirmap.ms_fid, (caddr_t *)&fp);
1796 		if (xx) {
1797 			logelem_log_opfailed(logelem_object_p, "Remove",
1798 			    gettext("error getting logfile offset"), NULL, 0);
1799 			dbug_leave("logelem_roll_remove");
1800 			return (EIO);
1801 		}
1802 		dirfid = *fp;
1803 		dbug_assert(dirfid.fid_len);
1804 	}
1805 
1806 	/* get file attributes */
1807 	xx = kmod_getattrname(logelem_object_p->i_kmod_object_p, &dirfid,
1808 	    REMOVE_OBJECT(logelem_object_p).i_namep,
1809 	    &REMOVE_OBJECT(logelem_object_p).i_up->dl_cred,
1810 	    &va, &filefid2);
1811 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
1812 		dbug_leave("logelem_roll_remove");
1813 		return (ETIMEDOUT);
1814 	}
1815 
1816 	/* if the file no longer exists on the back fs */
1817 	if (xx == ENOENT) {
1818 		logelem_log_opfailed(logelem_object_p, "Remove",
1819 		    gettext("File no longer exists."),
1820 		    REMOVE_OBJECT(logelem_object_p).i_namep, xx);
1821 		logelem_log_opskipped(logelem_object_p,
1822 		    REMOVE_OBJECT(logelem_object_p).i_namep);
1823 		dbug_leave("logelem_roll_remove");
1824 		return (0);
1825 	} else if (xx) {
1826 		logelem_log_opfailed(logelem_object_p, "Remove",
1827 		    gettext("Cannot get file attributes from server"),
1828 		    REMOVE_OBJECT(logelem_object_p).i_namep, xx);
1829 		logelem_log_opskipped(logelem_object_p,
1830 		    REMOVE_OBJECT(logelem_object_p).i_namep);
1831 		dbug_leave("logelem_roll_remove");
1832 		return (0);
1833 	}
1834 
1835 	/* conflict if mtime changed */
1836 	if (TIMECHANGE(mtime, va.va_mtime)) {
1837 		logelem_log_timelogmesg(logelem_object_p, "Remove",
1838 		    REMOVE_OBJECT(logelem_object_p).i_namep,
1839 		    gettext("File modified"), time_log);
1840 		logelem_log_opskipped(logelem_object_p,
1841 		    REMOVE_OBJECT(logelem_object_p).i_namep);
1842 		dbug_leave("logelem_roll_remove");
1843 		return (0);
1844 	}
1845 
1846 	/* conflict if ctime changed */
1847 	else if (TIMECHANGE(ctime, va.va_ctime)) {
1848 		logelem_log_timelogmesg(logelem_object_p, "Remove",
1849 		    REMOVE_OBJECT(logelem_object_p).i_namep,
1850 		    gettext("File changed"), time_log);
1851 		logelem_log_opskipped(logelem_object_p,
1852 		    REMOVE_OBJECT(logelem_object_p).i_namep);
1853 		dbug_leave("logelem_roll_remove");
1854 		return (0);
1855 	}
1856 
1857 	ctimep = (va.va_nlink > 1) ?
1858 	    &REMOVE_OBJECT(logelem_object_p).i_up->dl_ctime : NULL;
1859 
1860 	/* do the remove */
1861 	xx = kmod_remove(logelem_object_p->i_kmod_object_p, &dirfid,
1862 	    &REMOVE_OBJECT(logelem_object_p).i_up->dl_child_cid,
1863 	    REMOVE_OBJECT(logelem_object_p).i_namep,
1864 	    &REMOVE_OBJECT(logelem_object_p).i_up->dl_cred, ctimep);
1865 	if (xx) {
1866 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
1867 			dbug_leave("logelem_roll_remove");
1868 			return (ETIMEDOUT);
1869 		}
1870 
1871 		/* remove failed */
1872 		logelem_log_opfailed(logelem_object_p, "Remove", NULL,
1873 		    REMOVE_OBJECT(logelem_object_p).i_namep, xx);
1874 		logelem_log_opskipped(logelem_object_p,
1875 		    REMOVE_OBJECT(logelem_object_p).i_namep);
1876 		dbug_leave("logelem_roll_remove");
1877 		return (0);
1878 	}
1879 
1880 	/* record new ctime if multiple links to file */
1881 	if (ctimep) {
1882 		REMOVE_OBJECT(logelem_object_p).i_up->dl_mtime = mtime;
1883 		map.ms_times = logelem_object_p->i_offset +
1884 		    offsetof(cfs_dlog_entry_t, dl_u.dl_remove.dl_times);
1885 		xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
1886 		if (xx) {
1887 			dbug_leave("logelem_roll_remove");
1888 			return (EIO);
1889 		}
1890 	}
1891 
1892 	dbug_leave("logelem_roll_remove");
1893 	return (0);
1894 }
1895 /*
1896  * -----------------------------------------------------------------
1897  *			logelem_roll_rmdir
1898  *
1899  * Description:
1900  * Arguments:
1901  * Returns:
1902  * Preconditions:
1903  */
1904 
1905 int
1906 logelem_roll_rmdir(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1907 {
1908 	int xx;
1909 	cfs_fid_t *fp;
1910 	cfs_fid_t dirfid;
1911 	struct cfs_dlog_mapping_space map;
1912 
1913 	dbug_enter("logelem_roll_rmdir");
1914 
1915 	/* get the fid of the parent directory */
1916 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1917 	    RMDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid, &map);
1918 	if (xx == -1) {
1919 		logelem_log_opfailed(logelem_object_p, "Remove Directory",
1920 		    gettext("error mapping fid"), NULL, 0);
1921 		dbug_leave("logelem_roll_rmdir");
1922 		return (EIO);
1923 	}
1924 	/* if error from getting map or no fid in map (ms_fid == 0) */
1925 	if (xx || (map.ms_fid <= 0)) {
1926 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
1927 		    &RMDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid,
1928 		    &dirfid);
1929 		if (xx) {
1930 			logelem_log_opfailed(logelem_object_p,
1931 			    gettext("Remove Directory"),
1932 			    gettext("Parent directory no longer exists"),
1933 			    RMDIR_OBJECT(logelem_object_p).i_namep, xx);
1934 			logelem_log_opskipped(logelem_object_p,
1935 			    RMDIR_OBJECT(logelem_object_p).i_namep);
1936 			dbug_leave("logelem_roll_rmdir");
1937 			return (0);
1938 		}
1939 	} else {
1940 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
1941 		    map.ms_fid, (caddr_t *)&fp);
1942 		if (xx) {
1943 			logelem_log_opfailed(logelem_object_p,
1944 			    "Remove Directory",
1945 			    gettext("error getting logfile offset"), NULL, 0);
1946 			dbug_leave("logelem_roll_rmdir");
1947 			return (EIO);
1948 		}
1949 		dirfid = *fp;
1950 		dbug_assert(dirfid.fid_len);
1951 	}
1952 
1953 	/* perform the rmdir */
1954 	xx = kmod_rmdir(logelem_object_p->i_kmod_object_p, &dirfid,
1955 	    RMDIR_OBJECT(logelem_object_p).i_namep,
1956 	    &RMDIR_OBJECT(logelem_object_p).i_up->dl_cred);
1957 	if (xx) {
1958 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
1959 			dbug_leave("logelem_roll_rmdir");
1960 			return (ETIMEDOUT);
1961 		}
1962 
1963 		logelem_log_opfailed(logelem_object_p, "Remove Directory", NULL,
1964 		    RMDIR_OBJECT(logelem_object_p).i_namep, xx);
1965 		logelem_log_opskipped(logelem_object_p,
1966 		    RMDIR_OBJECT(logelem_object_p).i_namep);
1967 		dbug_leave("logelem_roll_rmdir");
1968 		return (0);
1969 	}
1970 	dbug_leave("logelem_roll_rmdir");
1971 	return (0);
1972 }
1973 /*
1974  * -----------------------------------------------------------------
1975  *			logelem_roll_mkdir
1976  *
1977  * Description:
1978  * Arguments:
1979  * Returns:
1980  * Preconditions:
1981  */
1982 
1983 int
1984 logelem_roll_mkdir(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
1985 {
1986 	int xx;
1987 	cfs_fid_t *fp;
1988 	cfs_fid_t dirfid;
1989 	struct cfs_dlog_mapping_space map;
1990 
1991 	dbug_enter("logelem_roll_mkdir");
1992 
1993 	/* get the fid of the parent directory */
1994 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
1995 	    MKDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid, &map);
1996 	if (xx == -1) {
1997 		logelem_log_opfailed(logelem_object_p, "Create Directory",
1998 		    gettext("error mapping fid"), NULL, 0);
1999 		dbug_leave("logelem_roll_mkdir");
2000 		return (EIO);
2001 	}
2002 	/* if error from getting map or no fid in map (ms_fid == 0) */
2003 	if (xx || (map.ms_fid <= 0)) {
2004 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2005 		    &MKDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid,
2006 		    &dirfid);
2007 		if (xx) {
2008 			logelem_log_opfailed(logelem_object_p,
2009 			    "Create Directory",
2010 			    gettext("Parent directory no longer exists"),
2011 			    MKDIR_OBJECT(logelem_object_p).i_namep, xx);
2012 			logelem_log_opskipped(logelem_object_p,
2013 			    MKDIR_OBJECT(logelem_object_p).i_namep);
2014 			dbug_leave("logelem_roll_mkdir");
2015 			return (0);
2016 		}
2017 	} else {
2018 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2019 		    map.ms_fid, (caddr_t *)&fp);
2020 		if (xx) {
2021 			logelem_log_opfailed(logelem_object_p,
2022 			    "Create Directory",
2023 			    gettext("error getting logfile offset"), NULL, 0);
2024 			dbug_leave("logelem_roll_mkdir");
2025 			return (EIO);
2026 		}
2027 		dirfid = *fp;
2028 		dbug_assert(dirfid.fid_len);
2029 	}
2030 
2031 	/* perform the mkdir */
2032 	xx = kmod_mkdir(logelem_object_p->i_kmod_object_p, &dirfid,
2033 	    MKDIR_OBJECT(logelem_object_p).i_namep,
2034 	    &MKDIR_OBJECT(logelem_object_p).i_up->dl_child_cid,
2035 	    &MKDIR_OBJECT(logelem_object_p).i_up->dl_attrs,
2036 	    &MKDIR_OBJECT(logelem_object_p).i_up->dl_cred,
2037 	    &MKDIR_OBJECT(logelem_object_p).i_up->dl_fid);
2038 	if (xx) {
2039 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
2040 			dbug_leave("logelem_roll_mkdir");
2041 			return (ETIMEDOUT);
2042 		}
2043 
2044 		logelem_log_opfailed(logelem_object_p, "Create Directory", NULL,
2045 		    MKDIR_OBJECT(logelem_object_p).i_namep, xx);
2046 		logelem_log_opskipped(logelem_object_p,
2047 		    MKDIR_OBJECT(logelem_object_p).i_namep);
2048 		dbug_leave("logelem_roll_mkdir");
2049 		return (0);
2050 	}
2051 
2052 	/* update the mapping to point to the new fid */
2053 	map.ms_cid = MKDIR_OBJECT(logelem_object_p).i_up->dl_child_cid;
2054 	map.ms_fid = logelem_object_p->i_offset +
2055 	    offsetof(cfs_dlog_entry_t, dl_u.dl_mkdir.dl_fid);
2056 	map.ms_times = 0;
2057 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2058 	if (xx) {
2059 		dbug_leave("logelem_roll_mkdir");
2060 		return (EIO);
2061 	}
2062 
2063 	dbug_leave("logelem_roll_mkdir");
2064 	return (0);
2065 }
2066 
2067 /*
2068  * -----------------------------------------------------------------
2069  *			logelem_roll_link
2070  *
2071  * Description:
2072  * Arguments:
2073  * Returns:
2074  * Preconditions:
2075  */
2076 
2077 int
2078 logelem_roll_link(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
2079 {
2080 	int xx;
2081 	cfs_fid_t *fp;
2082 	cfs_fid_t dirfid, linkfid;
2083 	struct cfs_dlog_mapping_space map, dirmap;
2084 	cfs_timestruc_t ctime, mtime;
2085 	cfs_dlog_tm_t *tmp;
2086 	int time_log;
2087 	cfs_vattr_t va;
2088 
2089 	dbug_enter("logelem_roll_link");
2090 
2091 	/* get the mapping for the child cid if it exists */
2092 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2093 	    LINK_OBJECT(logelem_object_p).i_up->dl_child_cid, &map);
2094 	if (xx == -1) {
2095 		logelem_log_opfailed(logelem_object_p, "Link",
2096 		    gettext("error mapping cid"), NULL, 0);
2097 		dbug_leave("logelem_roll_link");
2098 		return (EIO);
2099 	}
2100 	/* if a mapping was not found */
2101 	if (xx) {
2102 		/* dummy up mapping so we get values from the cache */
2103 		map.ms_cid = LINK_OBJECT(logelem_object_p).i_up->dl_child_cid;
2104 		map.ms_fid = 0;
2105 		map.ms_times = 0;
2106 	}
2107 
2108 	/* done if there was a conflict on the file */
2109 	if (map.ms_fid == X_CONFLICT) {
2110 		logelem_log_opfailed(logelem_object_p, "Link",
2111 		    gettext("file conflict"), NULL, 0);
2112 		dbug_leave("logelem_roll_link");
2113 		return (0);
2114 	}
2115 	/* done if the file is optimized out */
2116 	if (map.ms_fid == X_OPTIMIZED) {
2117 		dbug_leave("logelem_roll_link");
2118 		return (0);
2119 	}
2120 	/* if we have a fid in the mapping */
2121 	if (map.ms_fid) {
2122 		/* get the fid */
2123 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2124 		    map.ms_fid, (caddr_t *)&fp);
2125 		if (xx) {
2126 			logelem_log_opfailed(logelem_object_p, "Link",
2127 			    gettext("error getting logfile offset"), NULL, 0);
2128 			dbug_leave("logelem_roll_link");
2129 			return (EIO);
2130 		}
2131 		linkfid = *fp;
2132 		dbug_assert(linkfid.fid_len);
2133 	}
2134 
2135 	/* else get the fid from the cache */
2136 	else {
2137 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2138 		    &LINK_OBJECT(logelem_object_p).i_up->dl_child_cid,
2139 		    &linkfid);
2140 		if (xx == ENOENT) {
2141 			dbug_leave("logelem_roll_link");
2142 			return (0);
2143 		}
2144 		if (xx) {
2145 			logelem_log_opfailed(logelem_object_p, "Link",
2146 			    gettext("File is no longer in the cache"),
2147 			    LINK_OBJECT(logelem_object_p).i_namep, xx);
2148 			logelem_log_opskipped(logelem_object_p,
2149 			    LINK_OBJECT(logelem_object_p).i_namep);
2150 			dbug_leave("logelem_roll_link");
2151 			return (0);
2152 		}
2153 	}
2154 
2155 	/* if we have timestamps in the mapping */
2156 	if (map.ms_times) {
2157 		/* get the times */
2158 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2159 		    map.ms_times, (caddr_t *)&tmp);
2160 		if (xx) {
2161 			logelem_log_opfailed(logelem_object_p, "Link",
2162 			    gettext("error getting logfile offset"), NULL, 0);
2163 			dbug_leave("logelem_roll_link");
2164 			return (EIO);
2165 		}
2166 		ctime = tmp->tm_ctime;
2167 		mtime = tmp->tm_mtime;
2168 		time_log = 0;
2169 	}
2170 
2171 	/* else get the timestamps from the log entry */
2172 	else {
2173 		ctime = LINK_OBJECT(logelem_object_p).i_up->dl_ctime;
2174 		mtime = LINK_OBJECT(logelem_object_p).i_up->dl_mtime;
2175 		time_log = 1;
2176 	}
2177 
2178 	/* get the attributes of the file from the back fs */
2179 	xx = kmod_getattrfid(logelem_object_p->i_kmod_object_p, &linkfid,
2180 	    &LINK_OBJECT(logelem_object_p).i_up->dl_cred, &va);
2181 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
2182 		dbug_leave("logelem_roll_link");
2183 		return (ETIMEDOUT);
2184 	}
2185 	if (xx) {
2186 		logelem_log_opfailed(logelem_object_p, "Link",
2187 		    gettext("error getting attributes"), NULL, xx);
2188 		logelem_log_opskipped(logelem_object_p,
2189 		    LINK_OBJECT(logelem_object_p).i_namep);
2190 		dbug_leave("logelem_roll_link");
2191 		return (0);
2192 	}
2193 
2194 	/* conflict if mtime changed */
2195 	if (TIMECHANGE(mtime, va.va_mtime)) {
2196 		logelem_log_timelogmesg(logelem_object_p, "Link",
2197 		    LINK_OBJECT(logelem_object_p).i_namep,
2198 		    gettext("File modified"), time_log);
2199 		logelem_log_opskipped(logelem_object_p,
2200 		    LINK_OBJECT(logelem_object_p).i_namep);
2201 		dbug_leave("logelem_roll_link");
2202 		return (0);
2203 	}
2204 
2205 	/* conflict if ctime changed */
2206 	else if (TIMECHANGE(ctime, va.va_ctime)) {
2207 		logelem_log_timelogmesg(logelem_object_p, "Link",
2208 		    LINK_OBJECT(logelem_object_p).i_namep,
2209 		    gettext("File changed"), time_log);
2210 		logelem_log_opskipped(logelem_object_p,
2211 		    LINK_OBJECT(logelem_object_p).i_namep);
2212 		dbug_leave("logelem_roll_link");
2213 		return (0);
2214 	}
2215 
2216 	/* get the fid of the parent directory */
2217 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2218 	    LINK_OBJECT(logelem_object_p).i_up->dl_parent_cid, &dirmap);
2219 	if (xx == -1) {
2220 		logelem_log_opfailed(logelem_object_p, "Link",
2221 		    gettext("error mapping fid"), NULL, 0);
2222 		dbug_leave("logelem_roll_link");
2223 		return (EIO);
2224 	}
2225 	/* if error from getting map or no fid in map (ms_fid == 0) */
2226 	if (xx || (dirmap.ms_fid <= 0)) {
2227 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2228 		    &LINK_OBJECT(logelem_object_p).i_up->dl_parent_cid,
2229 		    &dirfid);
2230 		if (xx) {
2231 			logelem_log_opfailed(logelem_object_p, "Link",
2232 			    gettext("Parent directory no longer exists"),
2233 			    LINK_OBJECT(logelem_object_p).i_namep, xx);
2234 			logelem_log_opskipped(logelem_object_p,
2235 			    LINK_OBJECT(logelem_object_p).i_namep);
2236 			dbug_leave("logelem_roll_link");
2237 			return (0);
2238 		}
2239 	} else {
2240 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2241 		    dirmap.ms_fid, (caddr_t *)&fp);
2242 		if (xx) {
2243 			logelem_log_opfailed(logelem_object_p, "Link",
2244 			    gettext("error getting logfile offset"), NULL, 0);
2245 			dbug_leave("logelem_roll_link");
2246 			return (EIO);
2247 		}
2248 		dirfid = *fp;
2249 		dbug_assert(dirfid.fid_len);
2250 	}
2251 
2252 	/* do the link */
2253 	xx = kmod_link(logelem_object_p->i_kmod_object_p, &dirfid,
2254 	    LINK_OBJECT(logelem_object_p).i_namep, &linkfid,
2255 	    &LINK_OBJECT(logelem_object_p).i_up->dl_child_cid,
2256 	    &LINK_OBJECT(logelem_object_p).i_up->dl_cred,
2257 	    &LINK_OBJECT(logelem_object_p).i_up->dl_ctime);
2258 	if (xx) {
2259 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
2260 			dbug_leave("logelem_roll_link");
2261 			return (ETIMEDOUT);
2262 		}
2263 
2264 		logelem_log_opfailed(logelem_object_p, "Link", NULL,
2265 		    LINK_OBJECT(logelem_object_p).i_namep, xx);
2266 		logelem_log_opskipped(logelem_object_p,
2267 		    LINK_OBJECT(logelem_object_p).i_namep);
2268 		dbug_leave("logelem_roll_link");
2269 		return (0);
2270 	}
2271 
2272 	/* update the mapping with the new time */
2273 	LINK_OBJECT(logelem_object_p).i_up->dl_mtime = mtime;
2274 	map.ms_times = logelem_object_p->i_offset +
2275 	    offsetof(cfs_dlog_entry_t, dl_u.dl_link.dl_times);
2276 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2277 	if (xx) {
2278 		dbug_leave("logelem_roll_link");
2279 		return (EIO);
2280 	}
2281 	dbug_leave("logelem_roll_link");
2282 	return (0);
2283 }
2284 /*
2285  * -----------------------------------------------------------------
2286  *			logelem_roll_symlink
2287  *
2288  * Description:
2289  * Arguments:
2290  * Returns:
2291  * Preconditions:
2292  */
2293 
2294 int
2295 logelem_roll_symlink(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
2296 {
2297 	int xx;
2298 	cfs_fid_t *fp;
2299 	cfs_fid_t dirfid;
2300 	struct cfs_dlog_mapping_space map;
2301 
2302 	dbug_enter("logelem_roll_symlink");
2303 
2304 	/* see if the symlink no longer exists in the cache */
2305 #if 0
2306 	xx = kmod_exists(logelem_object_p->i_kmod_object_p,
2307 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_child_cid);
2308 	if (xx) {
2309 		dbug_assert(xx == ENOENT);
2310 
2311 		/* indicate ignore future operations on symlink */
2312 		map.ms_cid =
2313 		    SYMLINK_OBJECT(logelem_object_p).i_up->dl_child_cid;
2314 		map.ms_fid = X_OPTIMIZED;
2315 		map.ms_times = 0;
2316 		xx = maptbl_set(maptbl_object_p, &map, 1);
2317 		if (xx) {
2318 			dbug_leave("logelem_roll_symlink");
2319 			return (EIO);
2320 		}
2321 		dbug_leave("logelem_roll_symlink");
2322 		return (0);
2323 	}
2324 #endif
2325 
2326 	/* get the fid of the parent directory */
2327 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2328 	    SYMLINK_OBJECT(logelem_object_p).i_up->dl_parent_cid, &map);
2329 	if (xx == -1) {
2330 		logelem_log_opfailed(logelem_object_p, "Symink",
2331 		    gettext("error mapping fid"), NULL, 0);
2332 		dbug_leave("logelem_roll_symlink");
2333 		return (EIO);
2334 	}
2335 	/* if error from getting map or no fid in map (ms_fid == 0) */
2336 	if (xx || (map.ms_fid <= 0)) {
2337 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2338 		    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_parent_cid,
2339 		    &dirfid);
2340 		if (xx) {
2341 			logelem_log_opfailed(logelem_object_p, "Symlink",
2342 			    gettext("Parent directory no longer exists"),
2343 			    SYMLINK_OBJECT(logelem_object_p).i_namep, xx);
2344 			logelem_log_opskipped(logelem_object_p,
2345 			    SYMLINK_OBJECT(logelem_object_p).i_namep);
2346 			dbug_leave("logelem_roll_symlink");
2347 			return (0);
2348 		}
2349 	} else {
2350 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2351 		    map.ms_fid, (caddr_t *)&fp);
2352 		if (xx) {
2353 			logelem_log_opfailed(logelem_object_p, "Symlink",
2354 			    gettext("error getting logfile offset"), NULL, 0);
2355 			dbug_leave("logelem_roll_symlink");
2356 			return (EIO);
2357 		}
2358 		dirfid = *fp;
2359 		dbug_assert(dirfid.fid_len);
2360 	}
2361 
2362 	/* if the file exists on the back fs */
2363 	xx = kmod_getattrname(logelem_object_p->i_kmod_object_p, &dirfid,
2364 	    SYMLINK_OBJECT(logelem_object_p).i_namep,
2365 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_cred,
2366 	    NULL, NULL);
2367 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
2368 		dbug_leave("logelem_roll_symlink");
2369 		return (ETIMEDOUT);
2370 	}
2371 	/* if the file exists on the back file system */
2372 	if (xx == 0) {
2373 		logelem_log_opfailed(logelem_object_p, "Symlink",
2374 		    gettext("File created while disconnected"),
2375 		    SYMLINK_OBJECT(logelem_object_p).i_namep, xx);
2376 		logelem_log_opskipped(logelem_object_p,
2377 		    SYMLINK_OBJECT(logelem_object_p).i_namep);
2378 		dbug_leave("logelem_roll_symlink");
2379 		return (0);
2380 	}
2381 
2382 	/* do the symlink */
2383 	xx = kmod_symlink(logelem_object_p->i_kmod_object_p, &dirfid,
2384 	    SYMLINK_OBJECT(logelem_object_p).i_namep,
2385 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_child_cid,
2386 	    SYMLINK_OBJECT(logelem_object_p).i_contentsp,
2387 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_attrs,
2388 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_cred,
2389 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_fid,
2390 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_ctime,
2391 	    &SYMLINK_OBJECT(logelem_object_p).i_up->dl_mtime);
2392 	if (xx) {
2393 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
2394 			dbug_leave("logelem_roll_symlink");
2395 			return (ETIMEDOUT);
2396 		}
2397 		logelem_log_opfailed(logelem_object_p, "Symlink", NULL,
2398 		    SYMLINK_OBJECT(logelem_object_p).i_namep, xx);
2399 		logelem_log_opskipped(logelem_object_p,
2400 		    SYMLINK_OBJECT(logelem_object_p).i_namep);
2401 		dbug_leave("logelem_roll_symlink");
2402 		return (0);
2403 	}
2404 
2405 	/* update the mapping to point to the new fid and times */
2406 	map.ms_cid = SYMLINK_OBJECT(logelem_object_p).i_up->dl_child_cid;
2407 	map.ms_fid = logelem_object_p->i_offset +
2408 	    offsetof(cfs_dlog_entry_t, dl_u.dl_symlink.dl_fid);
2409 	map.ms_times = logelem_object_p->i_offset +
2410 	    offsetof(cfs_dlog_entry_t, dl_u.dl_symlink.dl_times);
2411 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2412 	if (xx) {
2413 		dbug_leave("logelem_roll_symlink");
2414 		return (EIO);
2415 	}
2416 	dbug_leave("logelem_roll_symlink");
2417 	return (0);
2418 }
2419 /*
2420  * -----------------------------------------------------------------
2421  *			logelem_roll_rename
2422  *
2423  * Description:
2424  * Arguments:
2425  * Returns:
2426  * Preconditions:
2427  */
2428 
2429 int
2430 logelem_roll_rename(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
2431 {
2432 	int xx;
2433 	cfs_fid_t *fp;
2434 	cfs_fid_t odirfid, ndirfid;
2435 	struct cfs_dlog_mapping_space map, dirmap, delmap;
2436 	cfs_dlog_tm_t *tmp;
2437 	cfs_vattr_t va;
2438 	cfs_timestruc_t mtime, ctime;
2439 	cfs_timestruc_t delmtime, delctime;
2440 	cfs_timestruc_t *delctimep = NULL;
2441 	int time_log;
2442 
2443 	dbug_enter("logelem_roll_rename");
2444 
2445 	/* get the mapping for the child cid if it exists */
2446 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2447 	    RENAME_OBJECT(logelem_object_p).i_up->dl_child_cid, &map);
2448 	if (xx == -1) {
2449 		logelem_log_opfailed(logelem_object_p, "Rename",
2450 		    gettext("error mapping cid"), NULL, 0);
2451 		dbug_leave("logelem_roll_rename");
2452 		return (EIO);
2453 	}
2454 	/* if a mapping was not found */
2455 	if (xx) {
2456 		/* dummy up mapping so we get values from the cache */
2457 		map.ms_cid = RENAME_OBJECT(logelem_object_p).i_up->dl_child_cid;
2458 		map.ms_fid = 0;
2459 		map.ms_times = 0;
2460 	}
2461 
2462 	/* done if there was a conflict on the file */
2463 	if (map.ms_fid == X_CONFLICT) {
2464 		logelem_log_opfailed(logelem_object_p, "Rename",
2465 		    gettext("file conflict"), NULL, 0);
2466 		dbug_leave("logelem_roll_rename");
2467 		return (0);
2468 	}
2469 	/* done if the file is optimized out */
2470 	if (map.ms_fid == X_OPTIMIZED) {
2471 		dbug_leave("logelem_roll_rename");
2472 		return (0);
2473 	}
2474 	/* if we have timestamps in the mapping */
2475 	if (map.ms_times) {
2476 		/* get the times */
2477 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2478 		    map.ms_times, (caddr_t *)&tmp);
2479 		if (xx) {
2480 			logelem_log_opfailed(logelem_object_p, "Rename",
2481 			    gettext("error getting logfile offset"), NULL, 0);
2482 			dbug_leave("logelem_roll_rename");
2483 			return (EIO);
2484 		}
2485 		ctime = tmp->tm_ctime;
2486 		mtime = tmp->tm_mtime;
2487 		time_log = 0;
2488 	}
2489 
2490 	/* else get the timestamps from the log entry */
2491 	else {
2492 		ctime = RENAME_OBJECT(logelem_object_p).i_up->dl_ctime;
2493 		mtime = RENAME_OBJECT(logelem_object_p).i_up->dl_mtime;
2494 		time_log = 1;
2495 	}
2496 
2497 	/* get the fid of the old parent directory */
2498 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2499 	    RENAME_OBJECT(logelem_object_p).i_up->dl_oparent_cid, &dirmap);
2500 	if (xx == -1) {
2501 		logelem_log_opfailed(logelem_object_p, "Rename",
2502 		    gettext("error mapping fid"), NULL, 0);
2503 		dbug_leave("logelem_roll_rename");
2504 		return (EIO);
2505 	}
2506 	/* if error from getting map or no fid in map (ms_fid == 0) */
2507 	if (xx || (dirmap.ms_fid <= 0)) {
2508 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2509 		    &RENAME_OBJECT(logelem_object_p).i_up->dl_oparent_cid,
2510 		    &odirfid);
2511 		if (xx) {
2512 			logelem_log_opfailed(logelem_object_p, "Rename",
2513 			    gettext("Original directory no longer exists"),
2514 			    RENAME_OBJECT(logelem_object_p).i_orignamep, xx);
2515 			logelem_log_opskipped(logelem_object_p,
2516 			    RENAME_OBJECT(logelem_object_p).i_orignamep);
2517 			dbug_leave("logelem_roll_rename");
2518 			return (0);
2519 		}
2520 	} else {
2521 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2522 		    dirmap.ms_fid, (caddr_t *)&fp);
2523 		if (xx) {
2524 			logelem_log_opfailed(logelem_object_p, "Rename",
2525 			    gettext("error getting logfile offset"), NULL, 0);
2526 			dbug_leave("logelem_roll_rename");
2527 			return (EIO);
2528 		}
2529 		odirfid = *fp;
2530 		dbug_assert(odirfid.fid_len);
2531 	}
2532 
2533 	/* get the fid of the new parent directory */
2534 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2535 	    RENAME_OBJECT(logelem_object_p).i_up->dl_nparent_cid, &dirmap);
2536 	if (xx == -1) {
2537 		logelem_log_opfailed(logelem_object_p, "Rename",
2538 		    gettext("error mapping fid"), NULL, 0);
2539 		dbug_leave("logelem_roll_rename");
2540 		return (EIO);
2541 	}
2542 	/* if error from getting map or no fid in map (ms_fid == 0) */
2543 	if (xx || (dirmap.ms_fid <= 0)) {
2544 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2545 		    &RENAME_OBJECT(logelem_object_p).i_up->dl_nparent_cid,
2546 		    &ndirfid);
2547 		if (xx) {
2548 			logelem_log_opfailed(logelem_object_p, "Rename",
2549 			    gettext("Target directory no longer exists"),
2550 			    RENAME_OBJECT(logelem_object_p).i_orignamep, xx);
2551 			logelem_log_opskipped(logelem_object_p,
2552 			    RENAME_OBJECT(logelem_object_p).i_orignamep);
2553 			dbug_leave("logelem_roll_rename");
2554 			return (0);
2555 		}
2556 	} else {
2557 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2558 		    dirmap.ms_fid, (caddr_t *)&fp);
2559 		if (xx) {
2560 			logelem_log_opfailed(logelem_object_p, "Rename",
2561 			    gettext("error getting logfile offset"), NULL, 0);
2562 			dbug_leave("logelem_roll_rename");
2563 			return (EIO);
2564 		}
2565 		ndirfid = *fp;
2566 		dbug_assert(ndirfid.fid_len);
2567 	}
2568 
2569 	/* get the attributes of the file from the back fs */
2570 	xx = kmod_getattrname(logelem_object_p->i_kmod_object_p, &odirfid,
2571 	    RENAME_OBJECT(logelem_object_p).i_orignamep,
2572 	    &RENAME_OBJECT(logelem_object_p).i_up->dl_cred,
2573 	    &va, NULL);
2574 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
2575 		dbug_leave("logelem_roll_rename");
2576 		return (ETIMEDOUT);
2577 	}
2578 	if (xx) {
2579 		logelem_log_opfailed(logelem_object_p, "Rename",
2580 		    gettext("Cannot get attributes on file"),
2581 		    RENAME_OBJECT(logelem_object_p).i_orignamep, xx);
2582 		logelem_log_opskipped(logelem_object_p,
2583 		    RENAME_OBJECT(logelem_object_p).i_orignamep);
2584 		dbug_leave("logelem_roll_rename");
2585 		return (0);
2586 	}
2587 
2588 	/* conflict if mtime changed */
2589 	if (TIMECHANGE(mtime, va.va_mtime)) {
2590 		logelem_log_timelogmesg(logelem_object_p, "Rename",
2591 		    RENAME_OBJECT(logelem_object_p).i_orignamep,
2592 		    gettext("File modified"), time_log);
2593 		logelem_log_opskipped(logelem_object_p,
2594 		    RENAME_OBJECT(logelem_object_p).i_orignamep);
2595 		dbug_leave("logelem_roll_rename");
2596 		return (0);
2597 	}
2598 
2599 	/* conflict if ctime changed */
2600 	else if (TIMECHANGE(ctime, va.va_ctime)) {
2601 		logelem_log_timelogmesg(logelem_object_p, "Rename",
2602 		    RENAME_OBJECT(logelem_object_p).i_orignamep,
2603 		    gettext("File changed"), time_log);
2604 		logelem_log_opskipped(logelem_object_p,
2605 		    RENAME_OBJECT(logelem_object_p).i_orignamep);
2606 		dbug_leave("logelem_roll_rename");
2607 		return (0);
2608 	}
2609 
2610 	/* if we are also deleting a file */
2611 	if (RENAME_OBJECT(logelem_object_p).i_up->dl_del_cid.cid_fileno != 0) {
2612 		/* get the mapping for the deleted cid if it exists */
2613 		xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2614 		    RENAME_OBJECT(logelem_object_p).i_up->dl_del_cid, &delmap);
2615 		if (xx == -1) {
2616 			logelem_log_opfailed(logelem_object_p, "Rename",
2617 			    gettext("error mapping cid"), NULL, 0);
2618 			dbug_leave("logelem_roll_rename");
2619 			return (EIO);
2620 		}
2621 		/* if a mapping was not found */
2622 		if (xx) {
2623 			/* dummy up mapping so we get values from the cache */
2624 			delmap.ms_cid =
2625 			    RENAME_OBJECT(logelem_object_p).i_up->dl_del_cid;
2626 			delmap.ms_fid = 0;
2627 			delmap.ms_times = 0;
2628 		}
2629 
2630 		/* if we have timestamps in the mapping */
2631 		if (delmap.ms_times) {
2632 			/* get the times */
2633 			xx = logfile_offset(
2634 			    logelem_object_p->i_logfile_object_p,
2635 			    delmap.ms_times, (caddr_t *)&tmp);
2636 			if (xx) {
2637 				logelem_log_opfailed(logelem_object_p, "Rename",
2638 				    gettext("error getting logfile offset"),
2639 				    NULL, 0);
2640 				dbug_leave("logelem_roll_rename");
2641 				return (EIO);
2642 			}
2643 			delctime = tmp->tm_ctime;
2644 			delmtime = tmp->tm_mtime;
2645 			time_log = 0;
2646 		}
2647 
2648 		/* else get the timestamps from the log entry */
2649 		else {
2650 			delctime = RENAME_OBJECT(logelem_object_p).
2651 			    i_up->dl_del_times.tm_ctime;
2652 			delmtime = RENAME_OBJECT(logelem_object_p).
2653 			    i_up->dl_del_times.tm_mtime;
2654 			time_log = 1;
2655 		}
2656 
2657 		/* get the attributes of the target file from the back fs */
2658 		xx = kmod_getattrname(logelem_object_p->i_kmod_object_p,
2659 		    &ndirfid,
2660 		    RENAME_OBJECT(logelem_object_p).i_newnamep,
2661 		    &RENAME_OBJECT(logelem_object_p).i_up->dl_cred,
2662 		    &va, NULL);
2663 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
2664 			dbug_leave("logelem_roll_rename");
2665 			return (ETIMEDOUT);
2666 		}
2667 		if (xx) {
2668 			logelem_log_opfailed(logelem_object_p, "Rename",
2669 			    gettext("Cannot get attributes on file"),
2670 			    RENAME_OBJECT(logelem_object_p).i_orignamep, xx);
2671 			logelem_log_opskipped(logelem_object_p,
2672 			    RENAME_OBJECT(logelem_object_p).i_orignamep);
2673 			dbug_leave("logelem_roll_rename");
2674 			return (0);
2675 		}
2676 
2677 		/* conflict if mtime changed */
2678 		if (TIMECHANGE(delmtime, va.va_mtime)) {
2679 			logelem_log_timelogmesg(logelem_object_p, "Rename",
2680 			    RENAME_OBJECT(logelem_object_p).i_orignamep,
2681 			    gettext("Target modified"), time_log);
2682 			logelem_log_opskipped(logelem_object_p,
2683 			    RENAME_OBJECT(logelem_object_p).i_orignamep);
2684 			dbug_leave("logelem_roll_rename");
2685 			return (0);
2686 
2687 		}
2688 
2689 		/* conflict if ctime changed */
2690 		else if (TIMECHANGE(delctime, va.va_ctime)) {
2691 			logelem_log_timelogmesg(logelem_object_p, "Rename",
2692 			    RENAME_OBJECT(logelem_object_p).i_orignamep,
2693 			    gettext("Target changed"), time_log);
2694 			logelem_log_opskipped(logelem_object_p,
2695 			    RENAME_OBJECT(logelem_object_p).i_orignamep);
2696 			dbug_leave("logelem_roll_rename");
2697 			return (0);
2698 		}
2699 
2700 		delctimep = (va.va_nlink > 1) ?
2701 		    &RENAME_OBJECT(logelem_object_p).
2702 		    i_up->dl_del_times.tm_ctime : NULL;
2703 	}
2704 
2705 	/* perform the rename */
2706 	xx = kmod_rename(logelem_object_p->i_kmod_object_p, &odirfid,
2707 	    RENAME_OBJECT(logelem_object_p).i_orignamep, &ndirfid,
2708 	    RENAME_OBJECT(logelem_object_p).i_newnamep,
2709 	    &RENAME_OBJECT(logelem_object_p).i_up->dl_child_cid,
2710 	    &RENAME_OBJECT(logelem_object_p).i_up->dl_cred,
2711 	    &RENAME_OBJECT(logelem_object_p).i_up->dl_ctime, delctimep,
2712 	    &RENAME_OBJECT(logelem_object_p).i_up->dl_del_cid);
2713 	if (xx) {
2714 		if ((xx == ETIMEDOUT) || (xx == EIO)) {
2715 			dbug_leave("logelem_roll_rename");
2716 			return (ETIMEDOUT);
2717 		}
2718 		logelem_log_opfailed(logelem_object_p, "Rename", NULL,
2719 		    RENAME_OBJECT(logelem_object_p).i_orignamep, xx);
2720 		logelem_log_opskipped(logelem_object_p,
2721 		    RENAME_OBJECT(logelem_object_p).i_orignamep);
2722 		dbug_leave("logelem_roll_rename");
2723 		return (0);
2724 	}
2725 
2726 	/* update the mapping to point to the new times for the file */
2727 	RENAME_OBJECT(logelem_object_p).i_up->dl_mtime = mtime;
2728 	map.ms_times = logelem_object_p->i_offset +
2729 	    offsetof(cfs_dlog_entry_t, dl_u.dl_rename.dl_times);
2730 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2731 	if (xx) {
2732 		dbug_leave("logelem_roll_rename");
2733 		return (EIO);
2734 	}
2735 	/* if we deleted a file with links left */
2736 	if (delctimep) {
2737 		/* update the mapping  to the new times for the deleted file */
2738 		RENAME_OBJECT(logelem_object_p).i_up->dl_del_times.tm_mtime =
2739 		    delmtime;
2740 		delmap.ms_times = logelem_object_p->i_offset +
2741 		    offsetof(cfs_dlog_entry_t, dl_u.dl_rename.dl_del_times);
2742 		xx = maptbl_set(logelem_object_p->i_maptbl_object_p,
2743 		    &delmap, 1);
2744 		if (xx) {
2745 			dbug_leave("logelem_roll_rename");
2746 			return (EIO);
2747 		}
2748 	}
2749 
2750 	dbug_leave("logelem_roll_rename");
2751 	return (0);
2752 }
2753 /*
2754  *			logelem_roll_modified
2755  *
2756  * Description:
2757  * Arguments:
2758  * Returns:
2759  * Preconditions:
2760  */
2761 
2762 int
2763 logelem_roll_modified(cfsd_logelem_object_t *logelem_object_p, ulong_t *seqp)
2764 {
2765 	int xx;
2766 	cfs_fid_t filefid, *fp;
2767 	struct cfs_dlog_mapping_space map;
2768 	cfs_dlog_tm_t *tmp;
2769 	cfs_timestruc_t ctime, mtime;
2770 	int time_log;
2771 	cachefsio_getinfo_t ginfo;
2772 	cfs_vattr_t va;
2773 	int conflict = 0;
2774 
2775 	dbug_enter("logelem_roll_modified");
2776 
2777 	dbug_precond(seqp);
2778 
2779 	/* get the mapping for this cid if it exists */
2780 	xx = maptbl_get(logelem_object_p->i_maptbl_object_p,
2781 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid, &map);
2782 	if (xx == -1) {
2783 		logelem_log_opfailed(logelem_object_p, "Modified",
2784 		    gettext("error mapping cid"), NULL, 0);
2785 		dbug_leave("logelem_roll_modified");
2786 		return (EIO);
2787 	}
2788 	/* if a mapping was not found */
2789 	if (xx) {
2790 		/* dummy up mapping so we get values from the cache */
2791 		map.ms_cid = MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid;
2792 		map.ms_fid = 0;
2793 		map.ms_times = 0;
2794 	}
2795 
2796 	/* done if there was a conflict on the file */
2797 	if (map.ms_fid == X_CONFLICT) {
2798 		logelem_log_opfailed(logelem_object_p, "Modified",
2799 		    gettext("file conflict"), NULL, 0);
2800 		dbug_leave("logelem_roll_modified");
2801 		return (0);
2802 	}
2803 	/* done if the file is optimized out */
2804 	if (map.ms_fid == X_OPTIMIZED) {
2805 		dbug_leave("logelem_roll_modified");
2806 		return (0);
2807 	}
2808 	/* if we have a fid in the mapping */
2809 	if (map.ms_fid) {
2810 		/* get the fid */
2811 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2812 		    map.ms_fid, (caddr_t *)&fp);
2813 		if (xx) {
2814 			logelem_log_opfailed(logelem_object_p, "Modified",
2815 			    gettext("error getting logfile offset"), NULL, 0);
2816 			dbug_leave("logelem_roll_modified");
2817 			return (EIO);
2818 		}
2819 		filefid = *fp;
2820 		dbug_assert(filefid.fid_len);
2821 	}
2822 
2823 	/* else get the fid from the cache */
2824 	else {
2825 		xx = kmod_cidtofid(logelem_object_p->i_kmod_object_p,
2826 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid, &filefid);
2827 		if (xx == ENOENT) {
2828 			dbug_leave("logelem_roll_modified");
2829 			return (0);
2830 		}
2831 		if (xx) {
2832 			logelem_log_opfailed(logelem_object_p, "Write",
2833 			    gettext("File is no longer in the cache"),
2834 			    NULL, xx);
2835 			xx = logelem_lostfound(logelem_object_p,
2836 			    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid,
2837 			    NULL, NULL,
2838 			    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
2839 			dbug_leave("logelem_roll_modified");
2840 			return (xx);
2841 		}
2842 	}
2843 
2844 	/* get info about the file from the cache */
2845 	xx = kmod_getinfo(logelem_object_p->i_kmod_object_p,
2846 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid, &ginfo);
2847 	if (xx) {
2848 		logelem_log_opfailed(logelem_object_p, "Write",
2849 		    gettext("File is no longer in the cache"), NULL, xx);
2850 		xx = logelem_lostfound(logelem_object_p,
2851 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid,
2852 		    NULL, NULL,
2853 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
2854 		dbug_leave("logelem_roll_modified");
2855 		return (xx);
2856 	}
2857 
2858 	/* if we are not ready to process this write yet */
2859 	if (*seqp < ginfo.gi_seq) {
2860 		dbug_print(("info", "Defering writing of file '%s' "
2861 		    "current seq %d, metadata seq %d",
2862 		    ginfo.gi_name, *seqp, ginfo.gi_seq));
2863 		*seqp = ginfo.gi_seq;
2864 		dbug_leave("logelem_roll_modified");
2865 		return (EAGAIN);
2866 	} else {
2867 		dbug_print(("info", "Continue writing of file '%s' "
2868 		    "current seq %d, metadata seq %d",
2869 		    ginfo.gi_name, *seqp, ginfo.gi_seq));
2870 	}
2871 
2872 	/* if we have timestamps in the mapping */
2873 	if (map.ms_times) {
2874 		/* get the times */
2875 		xx = logfile_offset(logelem_object_p->i_logfile_object_p,
2876 		    map.ms_times, (caddr_t *)&tmp);
2877 		if (xx) {
2878 			logelem_log_opfailed(logelem_object_p, "Modified",
2879 			    gettext("error getting logfile offset"), NULL, 0);
2880 			dbug_leave("logelem_roll_modified");
2881 			return (EIO);
2882 		}
2883 		ctime = tmp->tm_ctime;
2884 		mtime = tmp->tm_mtime;
2885 		time_log = 0;
2886 	}
2887 
2888 	/* else get the timestamps from the log entry */
2889 	else {
2890 		ctime = MODIFIED_OBJECT(logelem_object_p).i_up->dl_ctime;
2891 		mtime = MODIFIED_OBJECT(logelem_object_p).i_up->dl_mtime;
2892 		time_log = 1;
2893 	}
2894 
2895 	/* get the attributes of the file from the back fs */
2896 	xx = kmod_getattrfid(logelem_object_p->i_kmod_object_p, &filefid,
2897 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred, &va);
2898 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
2899 		dbug_leave("logelem_roll_modified");
2900 		return (ETIMEDOUT);
2901 	}
2902 	if (xx) {
2903 		logelem_log_opfailed(logelem_object_p, "Modified",
2904 		    gettext("error getting attributes"), NULL, xx);
2905 		xx = logelem_lostfound(logelem_object_p,
2906 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid,
2907 		    NULL, NULL,
2908 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
2909 		dbug_leave("logelem_roll_modified");
2910 		return (xx);
2911 	}
2912 
2913 
2914 	/* conflict if mtime changed */
2915 	if (TIMECHANGE(mtime, va.va_mtime)) {
2916 		logelem_log_timelogmesg(logelem_object_p, "Write", NULL,
2917 		    gettext("File modified"), time_log);
2918 		conflict = 1;
2919 	}
2920 
2921 	/* conflict if ctime changed */
2922 	else if (TIMECHANGE(ctime, va.va_ctime)) {
2923 		logelem_log_timelogmesg(logelem_object_p, "Write", NULL,
2924 		    gettext("File changed"), time_log);
2925 		conflict = 1;
2926 	}
2927 
2928 	/* if a conflict was detected */
2929 	if (conflict) {
2930 		logelem_log_opfailed(logelem_object_p, "Modified",
2931 		    gettext("file conflict"), NULL, 0);
2932 		xx = logelem_lostfound(logelem_object_p,
2933 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid,
2934 		    NULL, NULL,
2935 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
2936 		dbug_leave("logelem_roll_modified");
2937 		return (xx);
2938 	}
2939 
2940 	/* now do the write, get the new times */
2941 	xx = kmod_pushback(logelem_object_p->i_kmod_object_p,
2942 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid, &filefid,
2943 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred,
2944 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_ctime,
2945 	    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_mtime, 1);
2946 	if ((xx == ETIMEDOUT) || (xx == EIO)) {
2947 		dbug_leave("logelem_roll_modified");
2948 		return (ETIMEDOUT);
2949 	}
2950 	if (xx) {
2951 		logelem_log_opfailed(logelem_object_p, "Write", NULL, NULL, xx);
2952 		xx = logelem_lostfound(logelem_object_p,
2953 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid,
2954 		    NULL, NULL,
2955 		    &MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
2956 		dbug_leave("logelem_roll_modified");
2957 		return (xx);
2958 	}
2959 
2960 	/* update the mapping to point to the new times */
2961 	map.ms_times = logelem_object_p->i_offset +
2962 	    offsetof(cfs_dlog_entry_t, dl_u.dl_modify.dl_times);
2963 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2964 	if (xx) {
2965 		dbug_leave("logelem_roll_modified");
2966 		return (EIO);
2967 	}
2968 	dbug_leave("logelem_roll_modified");
2969 	return (0);
2970 }
2971 /*
2972  *			logelem_roll_mapfid
2973  *
2974  * Description:
2975  * Arguments:
2976  * Returns:
2977  * Preconditions:
2978  */
2979 
2980 int
2981 logelem_roll_mapfid(cfsd_logelem_object_t *logelem_object_p)
2982 {
2983 	int xx;
2984 	struct cfs_dlog_mapping_space map;
2985 
2986 	dbug_enter("logelem_roll_mapfid");
2987 
2988 	/* map the cid to the fid */
2989 	dbug_assert(MAPFID_OBJECT(logelem_object_p).i_up->dl_fid.fid_len);
2990 	map.ms_cid = MAPFID_OBJECT(logelem_object_p).i_up->dl_cid;
2991 	map.ms_fid = logelem_object_p->i_offset +
2992 	    offsetof(cfs_dlog_entry_t, dl_u.dl_mapfid.dl_fid);
2993 	map.ms_times = 0;
2994 
2995 	xx = maptbl_set(logelem_object_p->i_maptbl_object_p, &map, 1);
2996 	if (xx) {
2997 		dbug_leave("logelem_roll_mapfid");
2998 		return (EIO);
2999 	}
3000 	dbug_leave("logelem_roll_mapfid");
3001 	return (0);
3002 }
3003 /*
3004  *			logelem_dump
3005  *
3006  * Description:
3007  * Arguments:
3008  * Returns:
3009  * Preconditions:
3010  */
3011 
3012 void
3013 logelem_dump(cfsd_logelem_object_t *logelem_object_p)
3014 {
3015 	dbug_enter("logelem_dump");
3016 
3017 	switch (logelem_object_p->i_type) {
3018 
3019 	case NO_OBJECT_TYPE:
3020 		dbug_assert(0);
3021 		break;
3022 
3023 	case SETATTR_OBJECT_TYPE:
3024 		logelem_dump_setattr(logelem_object_p);
3025 		break;
3026 
3027 	case SETSECATTR_OBJECT_TYPE:
3028 		logelem_dump_setsecattr(logelem_object_p);
3029 		break;
3030 
3031 	case CREATE_OBJECT_TYPE:
3032 		logelem_dump_create(logelem_object_p);
3033 		break;
3034 
3035 	case REMOVE_OBJECT_TYPE:
3036 		logelem_dump_remove(logelem_object_p);
3037 		break;
3038 
3039 	case RMDIR_OBJECT_TYPE:
3040 		logelem_dump_rmdir(logelem_object_p);
3041 		break;
3042 
3043 	case MKDIR_OBJECT_TYPE:
3044 		logelem_dump_mkdir(logelem_object_p);
3045 		break;
3046 
3047 	case LINK_OBJECT_TYPE:
3048 		logelem_dump_link(logelem_object_p);
3049 		break;
3050 
3051 	case SYMLINK_OBJECT_TYPE:
3052 		logelem_dump_symlink(logelem_object_p);
3053 		break;
3054 
3055 	case RENAME_OBJECT_TYPE:
3056 		logelem_dump_rename(logelem_object_p);
3057 		break;
3058 
3059 	case MODIFIED_OBJECT_TYPE:
3060 		logelem_dump_modified(logelem_object_p);
3061 		break;
3062 
3063 	case MAPFID_OBJECT_TYPE:
3064 		logelem_dump_mapfid(logelem_object_p);
3065 		break;
3066 
3067 	default:
3068 		dbug_assert(0);
3069 	}
3070 	dbug_leave("logelem_dump");
3071 }
3072 /*
3073  *			logelem_dump_setattr
3074  *
3075  * Description:
3076  * Arguments:
3077  * Returns:
3078  * Preconditions:
3079  */
3080 
3081 void
3082 logelem_dump_setattr(cfsd_logelem_object_t *logelem_object_p)
3083 {
3084 	dbug_enter("logelem_dump_setattr");
3085 
3086 	dbug_print(("dump", "SETATTR"));
3087 	dbug_print(("dump", "len %d, valid %d, seq %d",
3088 	    logelem_object_p->i_entp->dl_len,
3089 	    logelem_object_p->i_entp->dl_valid,
3090 	    logelem_object_p->i_entp->dl_seq));
3091 	dbug_print(("dump", "file  cid %"PRIx64", flags 0x%x",
3092 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_cid.cid_fileno,
3093 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_flags));
3094 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3095 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3096 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3097 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3098 	    SETATTR_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3099 	logelem_print_attr(&SETATTR_OBJECT(logelem_object_p).i_up->dl_attrs);
3100 	logelem_print_cred(&SETATTR_OBJECT(logelem_object_p).i_up->dl_cred);
3101 	dbug_leave("logelem_dump_setattr");
3102 }
3103 
3104 /*
3105  *			logelem_dump_setsecattr
3106  *
3107  * Description:
3108  * Arguments:
3109  * Returns:
3110  * Preconditions:
3111  */
3112 
3113 void
3114 logelem_dump_setsecattr(cfsd_logelem_object_t *logelem_object_p)
3115 {
3116 	dbug_enter("logelem_dump_setsecattr");
3117 
3118 	dbug_print(("dump", "SETSECATTR"));
3119 	dbug_print(("dump", "len %d, valid %d, seq %d",
3120 	    logelem_object_p->i_entp->dl_len,
3121 	    logelem_object_p->i_entp->dl_valid,
3122 	    logelem_object_p->i_entp->dl_seq));
3123 	dbug_print(("dump", "file  cid %"PRIx64,
3124 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cid.cid_fileno));
3125 	dbug_print(("dump", "aclcnt %d dfaclcnt %d",
3126 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_aclcnt,
3127 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_dfaclcnt));
3128 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3129 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3130 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3131 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3132 	    SETSECATTR_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3133 	logelem_print_cred(&SETSECATTR_OBJECT(logelem_object_p).i_up->dl_cred);
3134 	dbug_leave("logelem_dump_setsecattr");
3135 }
3136 
3137 
3138 /*
3139  *			logelem_dump_create
3140  *
3141  * Description:
3142  * Arguments:
3143  * Returns:
3144  * Preconditions:
3145  */
3146 
3147 void
3148 logelem_dump_create(cfsd_logelem_object_t *logelem_object_p)
3149 {
3150 	dbug_enter("logelem_dump_create");
3151 
3152 	dbug_print(("dump", "CREATE"));
3153 	dbug_print(("dump", "len %d, valid %d, seq %d",
3154 	    logelem_object_p->i_entp->dl_len,
3155 	    logelem_object_p->i_entp->dl_valid,
3156 	    logelem_object_p->i_entp->dl_seq));
3157 	dbug_print(("dump", "directory cid %"PRIx64,
3158 	    CREATE_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3159 	dbug_print(("dump", "file	  cid %"PRIx64,
3160 	    CREATE_OBJECT(logelem_object_p).i_up->dl_new_cid.cid_fileno));
3161 	dbug_print(("dump", "name \"%s\"",
3162 	    CREATE_OBJECT(logelem_object_p).i_namep));
3163 	dbug_print(("dump", "exclusive %d, mode 0%o, destexists %d",
3164 	    CREATE_OBJECT(logelem_object_p).i_up->dl_excl,
3165 	    CREATE_OBJECT(logelem_object_p).i_up->dl_mode,
3166 	    CREATE_OBJECT(logelem_object_p).i_up->dl_exists));
3167 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3168 	    CREATE_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3169 	    CREATE_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3170 	    CREATE_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3171 	    CREATE_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3172 	logelem_print_attr(&CREATE_OBJECT(logelem_object_p).i_up->dl_attrs);
3173 	logelem_print_cred(&CREATE_OBJECT(logelem_object_p).i_up->dl_cred);
3174 	dbug_leave("logelem_dump_create");
3175 }
3176 
3177 
3178 /*
3179  * -----------------------------------------------------------------
3180  *			logelem_dump_remove
3181  *
3182  * Description:
3183  * Arguments:
3184  * Returns:
3185  * Preconditions:
3186  */
3187 
3188 void
3189 logelem_dump_remove(cfsd_logelem_object_t *logelem_object_p)
3190 {
3191 	dbug_enter("logelem_dump_remove");
3192 
3193 	dbug_print(("dump", "REMOVE"));
3194 	dbug_print(("dump", "len %d, valid %d, seq %d",
3195 	    logelem_object_p->i_entp->dl_len,
3196 	    logelem_object_p->i_entp->dl_valid,
3197 	    logelem_object_p->i_entp->dl_seq));
3198 	dbug_print(("dump", "file %s cid %"PRIx64", dir cid %"PRIx64,
3199 	    REMOVE_OBJECT(logelem_object_p).i_namep,
3200 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_child_cid.cid_fileno,
3201 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3202 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3203 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3204 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3205 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3206 	    REMOVE_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3207 	logelem_print_cred(&REMOVE_OBJECT(logelem_object_p).i_up->dl_cred);
3208 	dbug_leave("logelem_dump_remove");
3209 }
3210 
3211 /*
3212  * -----------------------------------------------------------------
3213  *			logelem_dump_rmdir
3214  *
3215  * Description:
3216  * Arguments:
3217  * Returns:
3218  * Preconditions:
3219  */
3220 
3221 void
3222 logelem_dump_rmdir(cfsd_logelem_object_t *logelem_object_p)
3223 {
3224 	dbug_enter("logelem_dump_rmdir");
3225 
3226 	dbug_print(("dump", "RMDIR"));
3227 	dbug_print(("dump", "len %d, valid %d, seq %d",
3228 	    logelem_object_p->i_entp->dl_len,
3229 	    logelem_object_p->i_entp->dl_valid,
3230 	    logelem_object_p->i_entp->dl_seq));
3231 	dbug_print(("dump", "dir name %s, dir cid %"PRIx64,
3232 	    RMDIR_OBJECT(logelem_object_p).i_namep,
3233 	    RMDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3234 	logelem_print_cred(&RMDIR_OBJECT(logelem_object_p).i_up->dl_cred);
3235 	dbug_leave("logelem_dump_rmdir");
3236 }
3237 
3238 /*
3239  * -----------------------------------------------------------------
3240  *			logelem_dump_mkdir
3241  *
3242  * Description:
3243  * Arguments:
3244  * Returns:
3245  * Preconditions:
3246  */
3247 
3248 void
3249 logelem_dump_mkdir(cfsd_logelem_object_t *logelem_object_p)
3250 {
3251 	dbug_enter("logelem_dump_mkdir");
3252 
3253 	dbug_print(("dump", "MKDIR"));
3254 	dbug_print(("dump", "len %d, valid %d, seq %d",
3255 	    logelem_object_p->i_entp->dl_len,
3256 	    logelem_object_p->i_entp->dl_valid,
3257 	    logelem_object_p->i_entp->dl_seq));
3258 	dbug_print(("dump", "file %s cid %"PRIx64", dir cid %"PRIx64,
3259 	    MKDIR_OBJECT(logelem_object_p).i_namep,
3260 	    MKDIR_OBJECT(logelem_object_p).i_up->dl_child_cid.cid_fileno,
3261 	    MKDIR_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3262 	logelem_print_attr(&MKDIR_OBJECT(logelem_object_p).i_up->dl_attrs);
3263 	logelem_print_cred(&MKDIR_OBJECT(logelem_object_p).i_up->dl_cred);
3264 	dbug_leave("logelem_dump_mkdir");
3265 }
3266 
3267 /*
3268  * -----------------------------------------------------------------
3269  *			logelem_dump_link
3270  *
3271  * Description:
3272  * Arguments:
3273  * Returns:
3274  * Preconditions:
3275  */
3276 
3277 void
3278 logelem_dump_link(cfsd_logelem_object_t *logelem_object_p)
3279 {
3280 	dbug_enter("logelem_dump_link");
3281 
3282 	dbug_print(("dump", "LINK"));
3283 	dbug_print(("dump", "len %d, valid %d, seq %d",
3284 	    logelem_object_p->i_entp->dl_len,
3285 	    logelem_object_p->i_entp->dl_valid,
3286 	    logelem_object_p->i_entp->dl_seq));
3287 	dbug_print(("dump", "name %s, cid to link %"PRIx64", dir cid %"PRIx64,
3288 	    LINK_OBJECT(logelem_object_p).i_namep,
3289 	    LINK_OBJECT(logelem_object_p).i_up->dl_child_cid.cid_fileno,
3290 	    LINK_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3291 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3292 	    LINK_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3293 	    LINK_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3294 	    LINK_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3295 	    LINK_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3296 	logelem_print_cred(&LINK_OBJECT(logelem_object_p).i_up->dl_cred);
3297 	dbug_leave("logelem_dump_link");
3298 }
3299 /*
3300  * -----------------------------------------------------------------
3301  *			logelem_dump_symlink
3302  *
3303  * Description:
3304  * Arguments:
3305  * Returns:
3306  * Preconditions:
3307  */
3308 
3309 void
3310 logelem_dump_symlink(cfsd_logelem_object_t *logelem_object_p)
3311 {
3312 	dbug_enter("logelem_dump_symlink");
3313 
3314 	dbug_print(("dump", "SYMLINK"));
3315 	dbug_print(("dump", "len %d, valid %d, seq %d",
3316 	    logelem_object_p->i_entp->dl_len,
3317 	    logelem_object_p->i_entp->dl_valid,
3318 	    logelem_object_p->i_entp->dl_seq));
3319 	dbug_print(("dump", "dir cid %"PRIx64,
3320 	    SYMLINK_OBJECT(logelem_object_p).i_up->dl_parent_cid.cid_fileno));
3321 	dbug_print(("dump", "name %s, contents %s, file cid %"PRIx64,
3322 	    SYMLINK_OBJECT(logelem_object_p).i_namep,
3323 	    SYMLINK_OBJECT(logelem_object_p).i_contentsp,
3324 	    SYMLINK_OBJECT(logelem_object_p).i_up->dl_child_cid.cid_fileno));
3325 	logelem_print_attr(&SYMLINK_OBJECT(logelem_object_p).i_up->dl_attrs);
3326 	logelem_print_cred(&SYMLINK_OBJECT(logelem_object_p).i_up->dl_cred);
3327 	dbug_leave("logelem_dump_symlink");
3328 }
3329 /*
3330  * -----------------------------------------------------------------
3331  *			logelem_dump_rename
3332  *
3333  * Description:
3334  * Arguments:
3335  * Returns:
3336  * Preconditions:
3337  */
3338 
3339 void
3340 logelem_dump_rename(cfsd_logelem_object_t *logelem_object_p)
3341 {
3342 	dbug_enter("logelem_dump_rename");
3343 
3344 	dbug_print(("dump", "RENAME"));
3345 	dbug_print(("dump", "len %d, valid %d, seq %d",
3346 	    logelem_object_p->i_entp->dl_len,
3347 	    logelem_object_p->i_entp->dl_valid,
3348 	    logelem_object_p->i_entp->dl_seq));
3349 	dbug_print(("dump", "orig dir cid %"PRIx64", new dir cid %"PRIx64,
3350 	    RENAME_OBJECT(logelem_object_p).i_up->dl_oparent_cid.cid_fileno,
3351 	    RENAME_OBJECT(logelem_object_p).i_up->dl_nparent_cid.cid_fileno));
3352 	dbug_print(("dump", "file cid %"PRIx64,
3353 	    RENAME_OBJECT(logelem_object_p).i_up->dl_child_cid.cid_fileno));
3354 	dbug_print(("dump", "orig name '%s', new name '%s'",
3355 	    RENAME_OBJECT(logelem_object_p).i_orignamep,
3356 	    RENAME_OBJECT(logelem_object_p).i_newnamep));
3357 	dbug_print(("dump", "file ctime %x %x, mtime %x %x",
3358 	    RENAME_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3359 	    RENAME_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3360 	    RENAME_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3361 	    RENAME_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3362 	dbug_print(("dump", "deleted cid %"PRIx64,
3363 	    RENAME_OBJECT(logelem_object_p).i_up->dl_del_cid.cid_fileno));
3364 	dbug_print(("dump", "deleted ctime %x %x, mtime %x %x",
3365 	    RENAME_OBJECT(logelem_object_p).i_up->dl_del_times.tm_ctime.tv_sec,
3366 	    RENAME_OBJECT(logelem_object_p).i_up->dl_del_times.tm_ctime.tv_nsec,
3367 	    RENAME_OBJECT(logelem_object_p).i_up->dl_del_times.tm_mtime.tv_sec,
3368 	    RENAME_OBJECT(logelem_object_p).i_up->dl_del_times.tm_mtime.
3369 	    tv_nsec));
3370 	logelem_print_cred(&RENAME_OBJECT(logelem_object_p).i_up->dl_cred);
3371 	dbug_leave("logelem_dump_rename");
3372 }
3373 /*
3374  *			logelem_dump_modified
3375  *
3376  * Description:
3377  * Arguments:
3378  * Returns:
3379  * Preconditions:
3380  */
3381 
3382 void
3383 logelem_dump_modified(cfsd_logelem_object_t *logelem_object_p)
3384 {
3385 	dbug_enter("logelem_dump_modified");
3386 
3387 	dbug_print(("dump", "MODIFIED"));
3388 	dbug_print(("dump", "len %d, valid %d, seq %d",
3389 	    logelem_object_p->i_entp->dl_len,
3390 	    logelem_object_p->i_entp->dl_valid,
3391 	    logelem_object_p->i_entp->dl_seq));
3392 	dbug_print(("dump", "file	  cid %"PRIx64,
3393 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_cid.cid_fileno));
3394 	dbug_print(("dump", "ctime %x %x, mtime %x %x",
3395 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_ctime.tv_sec,
3396 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_ctime.tv_nsec,
3397 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_mtime.tv_sec,
3398 	    MODIFIED_OBJECT(logelem_object_p).i_up->dl_mtime.tv_nsec));
3399 	logelem_print_cred(&MODIFIED_OBJECT(logelem_object_p).i_up->dl_cred);
3400 	dbug_leave("logelem_dump_modified");
3401 }
3402 /*
3403  *			logelem_dump_mapfid
3404  *
3405  * Description:
3406  * Arguments:
3407  * Returns:
3408  * Preconditions:
3409  */
3410 
3411 void
3412 logelem_dump_mapfid(cfsd_logelem_object_t *logelem_object_p)
3413 {
3414 	dbug_enter("logelem_dump_mapfid");
3415 	dbug_print(("dump", "MAPFID"));
3416 	dbug_print(("dump", "file	  cid %"PRIx64,
3417 	    MAPFID_OBJECT(logelem_object_p).i_up->dl_cid.cid_fileno));
3418 	logelem_format_fid(logelem_object_p,
3419 	    &MAPFID_OBJECT(logelem_object_p).i_up->dl_fid);
3420 	dbug_print(("dump", "fid '%s'", logelem_object_p->i_fidbuf));
3421 	dbug_enter("logelem_dump_mapfid");
3422 }
3423