Lines Matching refs:di
92 get_stats_for_obj(differ_info_t *di, const char *dsname, uint64_t obj, in get_stats_for_obj() argument
102 error = ioctl(di->zhp->zfs_hdl->libzfs_fd, ZFS_IOC_OBJ_TO_STATS, &zc); in get_stats_for_obj()
103 di->zerr = errno; in get_stats_for_obj()
108 ASSERT(di->zerr == 0); in get_stats_for_obj()
113 if (di->zerr == EPERM) { in get_stats_for_obj()
114 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
120 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_stats_for_obj()
191 print_cmn(FILE *fp, differ_info_t *di, const char *file) in print_cmn() argument
193 stream_bytes(fp, di->dsmnt); in print_cmn()
198 print_rename(FILE *fp, differ_info_t *di, const char *old, const char *new, in print_rename() argument
201 if (di->timestamped) in print_rename()
206 if (di->classify) { in print_rename()
210 print_cmn(fp, di, old); in print_rename()
211 if (di->scripted) in print_rename()
215 print_cmn(fp, di, new); in print_rename()
220 print_link_change(FILE *fp, differ_info_t *di, int delta, const char *file, in print_link_change() argument
223 if (di->timestamped) in print_link_change()
228 if (di->classify) { in print_link_change()
232 print_cmn(fp, di, file); in print_link_change()
238 print_file(FILE *fp, differ_info_t *di, char type, const char *file, in print_file() argument
241 if (di->timestamped) in print_file()
246 if (di->classify) { in print_file()
250 print_cmn(fp, di, file); in print_file()
255 write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) in write_inuse_diffs_one() argument
264 if (dobj == di->shares) in write_inuse_diffs_one()
273 fobjerr = get_stats_for_obj(di, di->fromsnap, dobj, fobjname, in write_inuse_diffs_one()
275 if (fobjerr && di->zerr != ENOENT && di->zerr != ENOTSUP) in write_inuse_diffs_one()
278 tobjerr = get_stats_for_obj(di, di->tosnap, dobj, tobjname, in write_inuse_diffs_one()
280 if (tobjerr && di->zerr != ENOENT && di->zerr != ENOTSUP) in write_inuse_diffs_one()
287 ASSERT(di->zerr == ENOENT || di->zerr == ENOTSUP); in write_inuse_diffs_one()
288 di->zerr = 0; in write_inuse_diffs_one()
292 di->zerr = 0; /* negate get_stats_for_obj() from side that failed */ in write_inuse_diffs_one()
303 print_link_change(fp, di, change, tobjname, &tsb); in write_inuse_diffs_one()
306 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
310 print_link_change(fp, di, change, fobjname, &fsb); in write_inuse_diffs_one()
313 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
328 print_link_change(fp, di, change, in write_inuse_diffs_one()
331 print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb); in write_inuse_diffs_one()
333 print_rename(fp, di, fobjname, tobjname, &tsb); in write_inuse_diffs_one()
338 print_file(fp, di, ZDIFF_REMOVED, fobjname, &fsb); in write_inuse_diffs_one()
339 print_file(fp, di, ZDIFF_ADDED, tobjname, &tsb); in write_inuse_diffs_one()
345 write_inuse_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_inuse_diffs() argument
351 if (err = write_inuse_diffs_one(fp, di, o)) in write_inuse_diffs()
358 describe_free(FILE *fp, differ_info_t *di, uint64_t object, char *namebuf, in describe_free() argument
363 if (get_stats_for_obj(di, di->fromsnap, object, namebuf, in describe_free()
366 if (di->zerr == ENOENT && sb.zs_links == 0) { in describe_free()
367 di->zerr = 0; in describe_free()
373 print_file(fp, di, ZDIFF_REMOVED, namebuf, &sb); in describe_free()
378 write_free_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) in write_free_diffs() argument
381 libzfs_handle_t *lhdl = di->zhp->zfs_hdl; in write_free_diffs()
384 (void) strlcpy(zc.zc_name, di->fromsnap, sizeof (zc.zc_name)); in write_free_diffs()
387 ASSERT(di->zerr == 0); in write_free_diffs()
394 if (zc.zc_obj == di->shares) { in write_free_diffs()
401 err = describe_free(fp, di, zc.zc_obj, fobjname, in write_free_diffs()
408 (void) snprintf(di->errbuf, sizeof (di->errbuf), in write_free_diffs()
412 di->zerr = errno; in write_free_diffs()
416 if (di->zerr) in write_free_diffs()
424 differ_info_t *di = arg; in differ() local
429 if ((ofp = fdopen(di->outputfd, "w")) == NULL) { in differ()
430 di->zerr = errno; in differ()
431 (void) strerror_r(errno, di->errbuf, sizeof (di->errbuf)); in differ()
432 (void) close(di->datafd); in differ()
442 rv = read(di->datafd, cp, len); in differ()
448 di->zerr = EPIPE; in differ()
457 err = write_free_diffs(ofp, di, &dr); in differ()
460 err = write_inuse_diffs(ofp, di, &dr); in differ()
463 di->zerr = EPIPE; in differ()
467 if (err || di->zerr) in differ()
472 (void) close(di->datafd); in differ()
475 if (di->zerr) { in differ()
476 ASSERT(di->zerr == EINVAL); in differ()
477 (void) snprintf(di->errbuf, sizeof (di->errbuf), in differ()
486 find_shares_object(differ_info_t *di) in find_shares_object() argument
491 (void) strlcpy(fullpath, di->dsmnt, MAXPATHLEN); in find_shares_object()
495 (void) snprintf(di->errbuf, sizeof (di->errbuf), in find_shares_object()
497 return (zfs_error(di->zhp->zfs_hdl, EZFS_DIFF, di->errbuf)); in find_shares_object()
500 di->shares = (uint64_t)sb.st_ino; in find_shares_object()
505 make_temp_snapshot(differ_info_t *di) in make_temp_snapshot() argument
507 libzfs_handle_t *hdl = di->zhp->zfs_hdl; in make_temp_snapshot()
512 (void) strlcpy(zc.zc_name, di->ds, sizeof (zc.zc_name)); in make_temp_snapshot()
513 zc.zc_cleanup_fd = di->cleanupfd; in make_temp_snapshot()
518 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
522 return (zfs_error(hdl, EZFS_DIFF, di->errbuf)); in make_temp_snapshot()
524 (void) snprintf(di->errbuf, sizeof (di->errbuf), in make_temp_snapshot()
527 return (zfs_standard_error(hdl, err, di->errbuf)); in make_temp_snapshot()
531 di->tmpsnap = zfs_strdup(hdl, zc.zc_value); in make_temp_snapshot()
532 di->tosnap = zfs_asprintf(hdl, "%s@%s", di->ds, di->tmpsnap); in make_temp_snapshot()
537 teardown_differ_info(differ_info_t *di) in teardown_differ_info() argument
539 free(di->ds); in teardown_differ_info()
540 free(di->dsmnt); in teardown_differ_info()
541 free(di->fromsnap); in teardown_differ_info()
542 free(di->frommnt); in teardown_differ_info()
543 free(di->tosnap); in teardown_differ_info()
544 free(di->tmpsnap); in teardown_differ_info()
545 free(di->tomnt); in teardown_differ_info()
546 (void) close(di->cleanupfd); in teardown_differ_info()
550 get_snapshot_names(differ_info_t *di, const char *fromsnap, in get_snapshot_names() argument
553 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()
604 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
615 di->ds = zfs_alloc(di->zhp->zfs_hdl, tdslen + 1); in get_snapshot_names()
616 (void) strncpy(di->ds, tosnap, tdslen); in get_snapshot_names()
617 di->ds[tdslen] = '\0'; in get_snapshot_names()
619 zhp = zfs_open(hdl, di->ds, ZFS_TYPE_FILESYSTEM); in get_snapshot_names()
635 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_snapshot_names()
638 return (zfs_error(hdl, EZFS_INVALIDNAME, di->errbuf)); in get_snapshot_names()
643 di->isclone = B_TRUE; in get_snapshot_names()
644 di->fromsnap = zfs_strdup(hdl, fromsnap); in get_snapshot_names()
646 di->tosnap = zfs_strdup(hdl, tosnap); in get_snapshot_names()
648 return (make_temp_snapshot(di)); in get_snapshot_names()
653 di->ds = zfs_alloc(hdl, dslen + 1); in get_snapshot_names()
654 (void) strncpy(di->ds, fdslen ? fromsnap : tosnap, dslen); in get_snapshot_names()
655 di->ds[dslen] = '\0'; in get_snapshot_names()
657 di->fromsnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrf); in get_snapshot_names()
659 di->tosnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrt); in get_snapshot_names()
661 return (make_temp_snapshot(di)); in get_snapshot_names()
668 get_mountpoint(differ_info_t *di, char *dsnm, char **mntpt) in get_mountpoint() argument
672 mounted = is_mounted(di->zhp->zfs_hdl, dsnm, mntpt); in get_mountpoint()
674 (void) snprintf(di->errbuf, sizeof (di->errbuf), in get_mountpoint()
677 return (zfs_error(di->zhp->zfs_hdl, EZFS_BADTYPE, di->errbuf)); in get_mountpoint()
687 get_mountpoints(differ_info_t *di) in get_mountpoints() argument
695 if (get_mountpoint(di, di->ds, &di->dsmnt) != 0) in get_mountpoints()
698 strptr = strchr(di->tosnap, '@'); in get_mountpoints()
700 di->tomnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", di->dsmnt, in get_mountpoints()
703 strptr = strchr(di->fromsnap, '@'); in get_mountpoints()
706 frommntpt = di->dsmnt; in get_mountpoints()
707 if (di->isclone) { in get_mountpoints()
712 err = get_mountpoint(di, di->fromsnap, &mntpt); in get_mountpoints()
719 di->frommnt = zfs_asprintf(di->zhp->zfs_hdl, "%s%s%s", frommntpt, in get_mountpoints()
722 if (di->isclone) in get_mountpoints()
730 const char *tosnap, differ_info_t *di) in setup_differ_info() argument
732 di->zhp = zhp; in setup_differ_info()
734 di->cleanupfd = open(ZFS_DEV, O_RDWR|O_EXCL); in setup_differ_info()
735 VERIFY(di->cleanupfd >= 0); in setup_differ_info()
737 if (get_snapshot_names(di, fromsnap, tosnap) != 0) in setup_differ_info()
740 if (get_mountpoints(di) != 0) in setup_differ_info()
743 if (find_shares_object(di) != 0) in setup_differ_info()
755 differ_info_t di = { 0 }; in zfs_show_diffs() local
763 if (setup_differ_info(zhp, fromsnap, tosnap, &di)) { in zfs_show_diffs()
764 teardown_differ_info(&di); in zfs_show_diffs()
770 teardown_differ_info(&di); in zfs_show_diffs()
774 di.scripted = (flags & ZFS_DIFF_PARSEABLE); in zfs_show_diffs()
775 di.classify = (flags & ZFS_DIFF_CLASSIFY); in zfs_show_diffs()
776 di.timestamped = (flags & ZFS_DIFF_TIMESTAMP); in zfs_show_diffs()
778 di.outputfd = outfd; in zfs_show_diffs()
779 di.datafd = pipefd[0]; in zfs_show_diffs()
781 if (pthread_create(&tid, NULL, differ, &di)) { in zfs_show_diffs()
785 teardown_differ_info(&di); in zfs_show_diffs()
791 (void) strlcpy(zc.zc_value, di.fromsnap, strlen(di.fromsnap) + 1); in zfs_show_diffs()
792 (void) strlcpy(zc.zc_name, di.tosnap, strlen(di.tosnap) + 1); in zfs_show_diffs()
807 } else if (errno != EPIPE || di.zerr == 0) { in zfs_show_diffs()
813 teardown_differ_info(&di); in zfs_show_diffs()
814 if (di.zerr != 0 && di.zerr != EPIPE) { in zfs_show_diffs()
815 zfs_error_aux(zhp->zfs_hdl, strerror(di.zerr)); in zfs_show_diffs()
816 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
825 if (di.zerr != 0) { in zfs_show_diffs()
826 zfs_error_aux(zhp->zfs_hdl, strerror(di.zerr)); in zfs_show_diffs()
827 return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); in zfs_show_diffs()
829 teardown_differ_info(&di); in zfs_show_diffs()