Lines Matching refs:di

84 get_stats_for_obj(differ_info_t *di, const char *dsname, uint64_t obj,  in get_stats_for_obj()  argument
94 error = ioctl(di->zhp->zfs_hdl->libzfs_fd, ZFS_IOC_OBJ_TO_STATS, &zc); in get_stats_for_obj()
95 di->zerr = errno; in get_stats_for_obj()
100 ASSERT(di->zerr == 0); in get_stats_for_obj()
105 if (di->zerr == EPERM) { in get_stats_for_obj()
106 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
112 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
186 print_cmn(FILE *fp, differ_info_t *di, const char *file) in print_cmn() argument
188 stream_bytes(fp, di->dsmnt); in print_cmn()
193 print_rename(FILE *fp, differ_info_t *di, const char *old, const char *new, in print_rename() argument
196 if (di->timestamped) in print_rename()
201 if (di->classify) { in print_rename()
205 print_cmn(fp, di, old); in print_rename()
206 if (di->scripted) in print_rename()
210 print_cmn(fp, di, new); in print_rename()
215 print_link_change(FILE *fp, differ_info_t *di, int delta, const char *file, in print_link_change() argument
218 if (di->timestamped) in print_link_change()
223 if (di->classify) { in print_link_change()
227 print_cmn(fp, di, file); in print_link_change()
233 print_file(FILE *fp, differ_info_t *di, char type, const char *file, in print_file() argument
236 if (di->timestamped) in print_file()
241 if (di->classify) { in print_file()
245 print_cmn(fp, di, file); in print_file()
250 write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) in write_inuse_diffs_one() argument
258 if (dobj == di->shares) in write_inuse_diffs_one()
267 fobjerr = get_stats_for_obj(di, di->fromsnap, dobj, fobjname, in write_inuse_diffs_one()
269 if (fobjerr && di->zerr != ENOENT && di->zerr != ENOTSUP) in write_inuse_diffs_one()
272 tobjerr = get_stats_for_obj(di, di->tosnap, dobj, tobjname, in write_inuse_diffs_one()
274 if (tobjerr && di->zerr != ENOENT && di->zerr != ENOTSUP) in write_inuse_diffs_one()
281 ASSERT(di->zerr == ENOENT || di->zerr == ENOTSUP); in write_inuse_diffs_one()
282 di->zerr = 0; in write_inuse_diffs_one()
286 di->zerr = 0; /* negate get_stats_for_obj() from side that failed */ in write_inuse_diffs_one()
297 print_link_change(fp, di, change, tobjname, &tsb); in write_inuse_diffs_one()
300 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
304 print_link_change(fp, di, change, fobjname, &fsb); in write_inuse_diffs_one()
307 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
321 print_link_change(fp, di, change, in write_inuse_diffs_one()
324 print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb); in write_inuse_diffs_one()
326 print_rename(fp, di, fobjname, tobjname, &tsb); in write_inuse_diffs_one()
331 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
332 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
338 write_inuse_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_inuse_diffs() argument
344 if (err = write_inuse_diffs_one(fp, di, o)) in write_inuse_diffs()
351 describe_free(FILE *fp, differ_info_t *di, uint64_t object, char *namebuf, in describe_free() argument
356 if (get_stats_for_obj(di, di->fromsnap, object, namebuf, in describe_free()
359 if (di->zerr == ENOENT && sb.zs_links == 0) { in describe_free()
360 di->zerr = 0; in describe_free()
366 print_file(fp, di, ZDIFF_REMOVED, namebuf, &sb); in describe_free()
371 write_free_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_free_diffs() argument
374 libzfs_handle_t *lhdl = di->zhp->zfs_hdl; in write_free_diffs()
377 (void) strlcpy(zc.zc_name, di->fromsnap, sizeof (zc.zc_name)); in write_free_diffs()
380 ASSERT(di->zerr == 0); in write_free_diffs()
387 if (zc.zc_obj == di->shares) { in write_free_diffs()
394 err = describe_free(fp, di, zc.zc_obj, fobjname, in write_free_diffs()
401 (void) snprintf(di->errbuf, sizeof (di->errbuf), in write_free_diffs()
405 di->zerr = errno; in write_free_diffs()
409 if (di->zerr) in write_free_diffs()
417 differ_info_t *di = arg; in differ() local
422 if ((ofp = fdopen(di->outputfd, "w")) == NULL) { in differ()
423 di->zerr = errno; in differ()
424 (void) strerror_r(errno, di->errbuf, sizeof (di->errbuf)); in differ()
425 (void) close(di->datafd); in differ()
435 rv = read(di->datafd, cp, len); in differ()
441 di->zerr = EPIPE; in differ()
450 err = write_free_diffs(ofp, di, &dr); in differ()
453 err = write_inuse_diffs(ofp, di, &dr); in differ()
456 di->zerr = EPIPE; in differ()
460 if (err || di->zerr) in differ()
465 (void) close(di->datafd); in differ()
468 if (di->zerr) { in differ()
469 ASSERT(di->zerr == EINVAL); in differ()
470 (void) snprintf(di->errbuf, sizeof (di->errbuf), in differ()
479 find_shares_object(differ_info_t *di) in find_shares_object() argument
484 (void) strlcpy(fullpath, di->dsmnt, MAXPATHLEN); in find_shares_object()
488 (void) snprintf(di->errbuf, sizeof (di->errbuf), in find_shares_object()
490 return (zfs_error(di->zhp->zfs_hdl, EZFS_DIFF, di->errbuf)); in find_shares_object()
493 di->shares = (uint64_t)sb.st_ino; in find_shares_object()
498 make_temp_snapshot(differ_info_t *di) in make_temp_snapshot() argument
500 libzfs_handle_t *hdl = di->zhp->zfs_hdl; in make_temp_snapshot()
505 (void) strlcpy(zc.zc_name, di->ds, sizeof (zc.zc_name)); in make_temp_snapshot()
506 zc.zc_cleanup_fd = di->cleanupfd; in make_temp_snapshot()
511 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
515 return (zfs_error(hdl, EZFS_DIFF, di->errbuf)); in make_temp_snapshot()
517 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
520 return (zfs_standard_error(hdl, err, di->errbuf)); in make_temp_snapshot()
524 di->tmpsnap = zfs_strdup(hdl, zc.zc_value); in make_temp_snapshot()
525 di->tosnap = zfs_asprintf(hdl, "%s@%s", di->ds, di->tmpsnap); in make_temp_snapshot()
530 teardown_differ_info(differ_info_t *di) in teardown_differ_info() argument
532 free(di->ds); in teardown_differ_info()
533 free(di->dsmnt); in teardown_differ_info()
534 free(di->fromsnap); in teardown_differ_info()
535 free(di->frommnt); in teardown_differ_info()
536 free(di->tosnap); in teardown_differ_info()
537 free(di->tmpsnap); in teardown_differ_info()
538 free(di->tomnt); in teardown_differ_info()
539 (void) close(di->cleanupfd); in teardown_differ_info()
543 get_snapshot_names(differ_info_t *di, const char *fromsnap, in get_snapshot_names() argument
546 libzfs_handle_t *hdl = di->zhp->zfs_hdl; in get_snapshot_names()
562 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
569 di->errbuf)); in get_snapshot_names()
576 di->fromsnap = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
577 di->ds = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
578 di->ds[fdslen] = '\0'; in get_snapshot_names()
581 return (make_temp_snapshot(di)); in get_snapshot_names()
584 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
597 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
608 di->ds = zfs_alloc(di->zhp->zfs_hdl, tdslen + 1); in get_snapshot_names()
609 (void) strncpy(di->ds, tosnap, tdslen); in get_snapshot_names()
610 di->ds[tdslen] = '\0'; in get_snapshot_names()
612 zhp = zfs_open(hdl, di->ds, ZFS_TYPE_FILESYSTEM); in get_snapshot_names()
628 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
631 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
636 di->isclone = B_TRUE; in get_snapshot_names()
637 di->fromsnap = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
639 di->tosnap = zfs_strdup(hdl, tosnap); in get_snapshot_names()
641 return (make_temp_snapshot(di)); in get_snapshot_names()
646 di->ds = zfs_alloc(hdl, dslen + 1); in get_snapshot_names()
647 (void) strncpy(di->ds, fdslen ? fromsnap : tosnap, dslen); in get_snapshot_names()
648 di->ds[dslen] = '\0'; in get_snapshot_names()
650 di->fromsnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrf); in get_snapshot_names()
652 di->tosnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrt); in get_snapshot_names()
654 return (make_temp_snapshot(di)); in get_snapshot_names()
661 get_mountpoint(differ_info_t *di, char *dsnm, char **mntpt) in get_mountpoint() argument
665 mounted = is_mounted(di->zhp->zfs_hdl, dsnm, mntpt); in get_mountpoint()
667 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_mountpoint()
670 return (zfs_error(di->zhp->zfs_hdl, EZFS_BADTYPE, di->errbuf)); in get_mountpoint()
680 get_mountpoints(differ_info_t *di) in get_mountpoints() argument
688 if (get_mountpoint(di, di->ds, &di->dsmnt) != 0) in get_mountpoints()
691 strptr = strchr(di->tosnap, '@'); in get_mountpoints()
693 di->tomnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", di->dsmnt, in get_mountpoints()
696 strptr = strchr(di->fromsnap, '@'); in get_mountpoints()
699 frommntpt = di->dsmnt; in get_mountpoints()
700 if (di->isclone) { in get_mountpoints()
705 err = get_mountpoint(di, di->fromsnap, &mntpt); in get_mountpoints()
712 di->frommnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", frommntpt, in get_mountpoints()
715 if (di->isclone) in get_mountpoints()
723 const char *tosnap, differ_info_t *di) in setup_differ_info() argument
725 di->zhp = zhp; in setup_differ_info()
727 di->cleanupfd = open(ZFS_DEV, O_RDWR|O_EXCL); in setup_differ_info()
728 VERIFY(di->cleanupfd >= 0); in setup_differ_info()
730 if (get_snapshot_names(di, fromsnap, tosnap) != 0) in setup_differ_info()
733 if (get_mountpoints(di) != 0) in setup_differ_info()
736 if (find_shares_object(di) != 0) in setup_differ_info()
748 differ_info_t di = { 0 }; in zfs_show_diffs() local
756 if (setup_differ_info(zhp, fromsnap, tosnap, &di)) { in zfs_show_diffs()
757 teardown_differ_info(&di); in zfs_show_diffs()
763 teardown_differ_info(&di); in zfs_show_diffs()
767 di.scripted = (flags & ZFS_DIFF_PARSEABLE); in zfs_show_diffs()
768 di.classify = (flags & ZFS_DIFF_CLASSIFY); in zfs_show_diffs()
769 di.timestamped = (flags & ZFS_DIFF_TIMESTAMP); in zfs_show_diffs()
771 di.outputfd = outfd; in zfs_show_diffs()
772 di.datafd = pipefd[0]; in zfs_show_diffs()
774 if (pthread_create(&tid, NULL, differ, &di)) { in zfs_show_diffs()
778 teardown_differ_info(&di); in zfs_show_diffs()
784 (void) strlcpy(zc.zc_value, di.fromsnap, strlen(di.fromsnap) + 1); in zfs_show_diffs()
785 (void) strlcpy(zc.zc_name, di.tosnap, strlen(di.tosnap) + 1); in zfs_show_diffs()
800 } else if (errno != EPIPE || di.zerr == 0) { in zfs_show_diffs()
806 teardown_differ_info(&di); in zfs_show_diffs()
807 if (di.zerr != 0 && di.zerr != EPIPE) { in zfs_show_diffs()
808 zfs_error_aux(zhp->zfs_hdl, strerror(di.zerr)); in zfs_show_diffs()
809 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
818 if (di.zerr != 0) { in zfs_show_diffs()
819 zfs_error_aux(zhp->zfs_hdl, strerror(di.zerr)); in zfs_show_diffs()
820 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
822 teardown_differ_info(&di); in zfs_show_diffs()