Lines Matching refs:di

67 get_stats_for_obj(differ_info_t *di, const char *dsname, uint64_t obj,  in get_stats_for_obj()  argument
77 error = zfs_ioctl(di->zhp->zfs_hdl, ZFS_IOC_OBJ_TO_STATS, &zc); in get_stats_for_obj()
78 di->zerr = errno; in get_stats_for_obj()
83 ASSERT(di->zerr == 0); in get_stats_for_obj()
88 if (di->zerr == ESTALE) { in get_stats_for_obj()
91 } else if (di->zerr == EPERM) { in get_stats_for_obj()
92 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
97 } else if (di->zerr == EACCES) { in get_stats_for_obj()
98 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
103 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
187 print_cmn(FILE *fp, differ_info_t *di, const char *file) in print_cmn() argument
189 if (!di->no_mangle) { in print_cmn()
190 stream_bytes(fp, di->dsmnt); in print_cmn()
193 (void) fputs(di->dsmnt, fp); in print_cmn()
199 print_rename(FILE *fp, differ_info_t *di, const char *old, const char *new, in print_rename() argument
204 if (di->timestamped) in print_rename()
209 if (di->classify) in print_rename()
211 print_cmn(fp, di, old); in print_rename()
212 (void) fputs(di->scripted ? "\t" : " -> ", fp); in print_rename()
213 print_cmn(fp, di, new); in print_rename()
221 print_link_change(FILE *fp, differ_info_t *di, int delta, const char *file, in print_link_change() argument
227 if (di->timestamped) in print_link_change()
232 if (di->classify) in print_link_change()
234 print_cmn(fp, di, file); in print_link_change()
241 print_file(FILE *fp, differ_info_t *di, char type, const char *file, in print_file() argument
247 if (di->timestamped) in print_file()
252 if (di->classify) in print_file()
254 print_cmn(fp, di, file); in print_file()
262 write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) in write_inuse_diffs_one() argument
271 if (dobj == di->shares) in write_inuse_diffs_one()
283 fobjerr = get_stats_for_obj(di, di->fromsnap, dobj, fobjname, in write_inuse_diffs_one()
285 if (fobjerr && di->zerr != ENOTSUP && di->zerr != ENOENT) { in write_inuse_diffs_one()
286 zfs_error_aux(di->zhp->zfs_hdl, "%s", zfs_strerror(di->zerr)); in write_inuse_diffs_one()
287 zfs_error(di->zhp->zfs_hdl, di->zerr, di->errbuf); in write_inuse_diffs_one()
295 tobjerr = get_stats_for_obj(di, di->tosnap, dobj, tobjname, in write_inuse_diffs_one()
298 if (tobjerr && di->zerr != ENOTSUP && di->zerr != ENOENT) { in write_inuse_diffs_one()
300 zfs_error_aux(di->zhp->zfs_hdl, in write_inuse_diffs_one()
301 "%s", zfs_strerror(di->zerr)); in write_inuse_diffs_one()
302 zfs_error(di->zhp->zfs_hdl, di->zerr, di->errbuf); in write_inuse_diffs_one()
309 di->zerr = 0; in write_inuse_diffs_one()
313 di->zerr = 0; /* negate get_stats_for_obj() from side that failed */ in write_inuse_diffs_one()
324 print_link_change(fp, di, change, tobjname, &tsb); in write_inuse_diffs_one()
327 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
331 print_link_change(fp, di, change, fobjname, &fsb); in write_inuse_diffs_one()
334 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
348 print_link_change(fp, di, change, in write_inuse_diffs_one()
351 print_file(fp, di, *ZDIFF_MODIFIED, fobjname, &tsb); in write_inuse_diffs_one()
353 print_rename(fp, di, fobjname, tobjname, &tsb); in write_inuse_diffs_one()
358 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
359 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
365 write_inuse_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_inuse_diffs() argument
371 if ((err = write_inuse_diffs_one(fp, di, o)) != 0) in write_inuse_diffs()
378 describe_free(FILE *fp, differ_info_t *di, uint64_t object, char *namebuf, in describe_free() argument
383 (void) get_stats_for_obj(di, di->fromsnap, object, namebuf, in describe_free()
387 if (di->zerr == ESTALE || di->zerr == ENOENT) { in describe_free()
388 di->zerr = 0; in describe_free()
392 print_file(fp, di, ZDIFF_REMOVED, namebuf, &sb); in describe_free()
397 write_free_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_free_diffs() argument
400 libzfs_handle_t *lhdl = di->zhp->zfs_hdl; in write_free_diffs()
403 (void) strlcpy(zc.zc_name, di->fromsnap, sizeof (zc.zc_name)); in write_free_diffs()
406 ASSERT(di->zerr == 0); in write_free_diffs()
413 if (zc.zc_obj == di->shares) { in write_free_diffs()
420 (void) describe_free(fp, di, zc.zc_obj, fobjname, in write_free_diffs()
425 (void) snprintf(di->errbuf, sizeof (di->errbuf), in write_free_diffs()
429 di->zerr = errno; in write_free_diffs()
433 if (di->zerr) in write_free_diffs()
441 differ_info_t *di = arg; in differ() local
446 if ((ofp = fdopen(di->outputfd, "w")) == NULL) { in differ()
447 di->zerr = errno; in differ()
448 strlcpy(di->errbuf, zfs_strerror(errno), sizeof (di->errbuf)); in differ()
449 (void) close(di->datafd); in differ()
459 rv = read(di->datafd, cp, len); in differ()
465 di->zerr = EPIPE; in differ()
474 err = write_free_diffs(ofp, di, &dr); in differ()
477 err = write_inuse_diffs(ofp, di, &dr); in differ()
480 di->zerr = EPIPE; in differ()
484 if (err || di->zerr) in differ()
489 (void) close(di->datafd); in differ()
492 if (di->zerr) { in differ()
493 ASSERT(di->zerr == EPIPE); in differ()
494 (void) snprintf(di->errbuf, sizeof (di->errbuf), in differ()
503 make_temp_snapshot(differ_info_t *di) in make_temp_snapshot() argument
505 libzfs_handle_t *hdl = di->zhp->zfs_hdl; in make_temp_snapshot()
510 (void) strlcpy(zc.zc_name, di->ds, sizeof (zc.zc_name)); in make_temp_snapshot()
511 zc.zc_cleanup_fd = di->cleanupfd; in make_temp_snapshot()
516 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
520 return (zfs_error(hdl, EZFS_DIFF, di->errbuf)); in make_temp_snapshot()
522 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
525 return (zfs_standard_error(hdl, err, di->errbuf)); in make_temp_snapshot()
529 di->tmpsnap = zfs_strdup(hdl, zc.zc_value); in make_temp_snapshot()
530 di->tosnap = zfs_asprintf(hdl, "%s@%s", di->ds, di->tmpsnap); in make_temp_snapshot()
535 teardown_differ_info(differ_info_t *di) in teardown_differ_info() argument
537 free(di->ds); in teardown_differ_info()
538 free(di->dsmnt); in teardown_differ_info()
539 free(di->fromsnap); in teardown_differ_info()
540 free(di->frommnt); in teardown_differ_info()
541 free(di->tosnap); in teardown_differ_info()
542 free(di->tmpsnap); in teardown_differ_info()
543 free(di->tomnt); in teardown_differ_info()
544 (void) close(di->cleanupfd); in teardown_differ_info()
548 get_snapshot_names(differ_info_t *di, const char *fromsnap, in get_snapshot_names() argument
551 libzfs_handle_t *hdl = di->zhp->zfs_hdl; in get_snapshot_names()
569 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
576 di->errbuf)); in get_snapshot_names()
583 di->fromsnap = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
584 di->ds = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
585 di->ds[fdslen] = '\0'; in get_snapshot_names()
588 return (make_temp_snapshot(di)); in get_snapshot_names()
591 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
603 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
614 di->ds = zfs_alloc(di->zhp->zfs_hdl, tdslen + 1); in get_snapshot_names()
615 (void) strlcpy(di->ds, tosnap, tdslen + 1); in get_snapshot_names()
617 zhp = zfs_open(hdl, di->ds, ZFS_TYPE_FILESYSTEM); in get_snapshot_names()
633 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
636 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
641 di->isclone = B_TRUE; in get_snapshot_names()
642 di->fromsnap = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
644 di->tosnap = zfs_strdup(hdl, tosnap); in get_snapshot_names()
646 return (make_temp_snapshot(di)); in get_snapshot_names()
650 di->ds = zfs_alloc(hdl, dslen + 1); in get_snapshot_names()
651 (void) strlcpy(di->ds, fdslen ? fromsnap : tosnap, dslen + 1); in get_snapshot_names()
653 di->fromsnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrf); in get_snapshot_names()
655 di->tosnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrt); in get_snapshot_names()
657 return (make_temp_snapshot(di)); in get_snapshot_names()
664 get_mountpoint(differ_info_t *di, char *dsnm, char **mntpt) in get_mountpoint() argument
668 mounted = is_mounted(di->zhp->zfs_hdl, dsnm, mntpt); in get_mountpoint()
670 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_mountpoint()
673 return (zfs_error(di->zhp->zfs_hdl, EZFS_BADTYPE, di->errbuf)); in get_mountpoint()
683 get_mountpoints(differ_info_t *di) in get_mountpoints() argument
691 if (get_mountpoint(di, di->ds, &di->dsmnt) != 0) in get_mountpoints()
694 strptr = strchr(di->tosnap, '@'); in get_mountpoints()
696 di->tomnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", di->dsmnt, in get_mountpoints()
699 strptr = strchr(di->fromsnap, '@'); in get_mountpoints()
702 frommntpt = di->dsmnt; in get_mountpoints()
703 if (di->isclone) { in get_mountpoints()
708 err = get_mountpoint(di, di->fromsnap, &mntpt); in get_mountpoints()
715 di->frommnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", frommntpt, in get_mountpoints()
718 if (di->isclone) in get_mountpoints()
726 const char *tosnap, differ_info_t *di) in setup_differ_info() argument
728 di->zhp = zhp; in setup_differ_info()
730 di->cleanupfd = open(ZFS_DEV, O_RDWR | O_CLOEXEC); in setup_differ_info()
731 VERIFY(di->cleanupfd >= 0); in setup_differ_info()
733 if (get_snapshot_names(di, fromsnap, tosnap) != 0) in setup_differ_info()
736 if (get_mountpoints(di) != 0) in setup_differ_info()
739 if (find_shares_object(di) != 0) in setup_differ_info()
751 differ_info_t di = { 0 }; in zfs_show_diffs() local
759 if (setup_differ_info(zhp, fromsnap, tosnap, &di)) { in zfs_show_diffs()
760 teardown_differ_info(&di); in zfs_show_diffs()
766 teardown_differ_info(&di); in zfs_show_diffs()
770 di.scripted = (flags & ZFS_DIFF_PARSEABLE); in zfs_show_diffs()
771 di.classify = (flags & ZFS_DIFF_CLASSIFY); in zfs_show_diffs()
772 di.timestamped = (flags & ZFS_DIFF_TIMESTAMP); in zfs_show_diffs()
773 di.no_mangle = (flags & ZFS_DIFF_NO_MANGLE); in zfs_show_diffs()
775 di.outputfd = outfd; in zfs_show_diffs()
776 di.datafd = pipefd[0]; in zfs_show_diffs()
778 if (pthread_create(&tid, NULL, differ, &di)) { in zfs_show_diffs()
782 teardown_differ_info(&di); in zfs_show_diffs()
788 (void) strlcpy(zc.zc_value, di.fromsnap, strlen(di.fromsnap) + 1); in zfs_show_diffs()
789 (void) strlcpy(zc.zc_name, di.tosnap, strlen(di.tosnap) + 1); in zfs_show_diffs()
804 } else if (errno != EPIPE || di.zerr == 0) { in zfs_show_diffs()
810 teardown_differ_info(&di); in zfs_show_diffs()
811 if (di.zerr != 0 && di.zerr != EPIPE) { in zfs_show_diffs()
813 zfs_strerror(di.zerr)); in zfs_show_diffs()
814 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
823 if (di.zerr != 0) { in zfs_show_diffs()
824 zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(di.zerr)); in zfs_show_diffs()
825 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
827 teardown_differ_info(&di); in zfs_show_diffs()