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 *
cfsd_logelem_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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
cfsd_logelem_destroy(cfsd_logelem_object_t * logelem_object_p)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
logelem_print_cred(dl_cred_t * credp)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
logelem_print_attr(cfs_vattr_t * vp)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
logelem_format_fid(cfsd_logelem_object_t * logelem_object_p,cfs_fid_t * fidp)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
logelem_lostfound(cfsd_logelem_object_t * logelem_object_p,cfs_cid_t * cidp,cfs_cid_t * pcidp,const char * namep,dl_cred_t * cred)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
logelem_problem(cfsd_logelem_object_t * logelem_object_p,char * strp)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
logelem_resolution(cfsd_logelem_object_t * logelem_object_p,char * strp)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
logelem_message_append(char * strp1,char * strp2)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
logelem_message(cfsd_logelem_object_t * logelem_object_p,char * prefix,char * strp)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
logelem_log_opfailed(cfsd_logelem_object_t * logelem_object_p,char * opp,char * info,const char * namep,int xx)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
logelem_log_opskipped(cfsd_logelem_object_t * logelem_object_p,const char * namep)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
logelem_log_timelogmesg(cfsd_logelem_object_t * logelem_object_p,char * opp,const char * namep,char * mesgp,int time_log)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 *
cfsd_logelem_setattr_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_setsecattr_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_create_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_remove_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_rmdir_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_mkdir_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_link_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_symlink_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_rename_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_modified_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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 *
cfsd_logelem_mapfid_create(cfsd_maptbl_object_t * maptbl_object_p,cfsd_logfile_object_t * logfile_object_p,cfsd_kmod_object_t * kmod_object_p)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
logelem_roll(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_setattr(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_setsecattr(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_create(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_remove(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_rmdir(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_mkdir(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_link(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_symlink(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_rename(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_modified(cfsd_logelem_object_t * logelem_object_p,ulong_t * seqp)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
logelem_roll_mapfid(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_setattr(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_setsecattr(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_create(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_remove(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_rmdir(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_mkdir(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_link(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_symlink(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_rename(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_modified(cfsd_logelem_object_t * logelem_object_p)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
logelem_dump_mapfid(cfsd_logelem_object_t * logelem_object_p)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