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