Lines Matching defs:di

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