+static int lfs_changelog(int argc, char **argv)
+{
+ void *changelog_priv;
+ struct changelog_rec *rec;
+ long long startrec = 0, endrec = 0;
+ char *mdd;
+ struct option long_opts[] = {
+ {"follow", no_argument, 0, 'f'},
+ {0, 0, 0, 0}
+ };
+ char short_opts[] = "f";
+ int rc, follow = 0;
+
+ optind = 0;
+ while ((rc = getopt_long(argc, argv, short_opts,
+ long_opts, NULL)) != -1) {
+ switch (rc) {
+ case 'f':
+ follow++;
+ break;
+ case '?':
+ return CMD_HELP;
+ default:
+ fprintf(stderr, "error: %s: option '%s' unrecognized\n",
+ argv[0], argv[optind - 1]);
+ return CMD_HELP;
+ }
+ }
+ if (optind >= argc)
+ return CMD_HELP;
+
+ mdd = argv[optind++];
+ if (argc > optind)
+ startrec = strtoll(argv[optind++], NULL, 10);
+ if (argc > optind)
+ endrec = strtoll(argv[optind++], NULL, 10);
+
+ rc = llapi_changelog_start(&changelog_priv,
+ CHANGELOG_FLAG_BLOCK |
+ (follow ? CHANGELOG_FLAG_FOLLOW : 0),
+ mdd, startrec);
+ if (rc < 0) {
+ fprintf(stderr, "Can't start changelog: %s\n",
+ strerror(errno = -rc));
+ return rc;
+ }
+
+ while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) {
+ time_t secs;
+ struct tm ts;
+
+ if (endrec && rec->cr_index > endrec) {
+ llapi_changelog_free(&rec);
+ break;
+ }
+ if (rec->cr_index < startrec) {
+ llapi_changelog_free(&rec);
+ continue;
+ }
+
+ secs = rec->cr_time >> 30;
+ gmtime_r(&secs, &ts);
+ printf(LPU64" %02d%-5s %02d:%02d:%02d.%06d %04d.%02d.%02d "
+ "0x%x t="DFID, rec->cr_index, rec->cr_type,
+ changelog_type2str(rec->cr_type),
+ ts.tm_hour, ts.tm_min, ts.tm_sec,
+ (int)(rec->cr_time & ((1<<30) - 1)),
+ ts.tm_year+1900, ts.tm_mon+1, ts.tm_mday,
+ rec->cr_flags & CLF_FLAGMASK, PFID(&rec->cr_tfid));
+ if (rec->cr_namelen)
+ /* namespace rec includes parent and filename */
+ printf(" p="DFID" %.*s\n", PFID(&rec->cr_pfid),
+ rec->cr_namelen, rec->cr_name);
+ else
+ printf("\n");
+
+ llapi_changelog_free(&rec);
+ }
+
+ llapi_changelog_fini(&changelog_priv);
+
+ if (rc < 0)
+ fprintf(stderr, "Changelog: %s\n", strerror(errno = -rc));
+
+ return (rc == 1 ? 0 : rc);
+}
+
+static int lfs_changelog_clear(int argc, char **argv)
+{
+ long long endrec;
+ int rc;
+
+ if (argc != 4)
+ return CMD_HELP;
+
+ endrec = strtoll(argv[3], NULL, 10);
+
+ rc = llapi_changelog_clear(argv[1], argv[2], endrec);
+ if (rc)
+ fprintf(stderr, "%s error: %s\n", argv[0],
+ strerror(errno = -rc));
+ return rc;
+}
+
+static int lfs_fid2path(int argc, char **argv)
+{
+ struct option long_opts[] = {
+ {"cur", no_argument, 0, 'c'},
+ {"link", required_argument, 0, 'l'},
+ {"rec", required_argument, 0, 'r'},
+ {0, 0, 0, 0}
+ };
+ char short_opts[] = "cl:r:";
+ char *device, *fid, *path;
+ long long recno = -1;
+ int linkno = -1;
+ int lnktmp;
+ int printcur = 0;
+ int rc;
+
+ optind = 0;
+
+ while ((rc = getopt_long(argc, argv, short_opts,
+ long_opts, NULL)) != -1) {
+ switch (rc) {
+ case 'c':
+ printcur++;
+ break;
+ case 'l':
+ linkno = strtol(optarg, NULL, 10);
+ break;
+ case 'r':
+ recno = strtoll(optarg, NULL, 10);
+ break;
+ case '?':
+ return CMD_HELP;
+ default:
+ fprintf(stderr, "error: %s: option '%s' unrecognized\n",
+ argv[0], argv[optind - 1]);
+ return CMD_HELP;
+ }
+ }
+ device = argv[optind++];
+ fid = argv[optind++];
+ if (optind != argc)
+ return CMD_HELP;
+
+ path = calloc(1, PATH_MAX);
+
+ lnktmp = (linkno >= 0) ? linkno : 0;
+ while (1) {
+ int oldtmp = lnktmp;
+ long long rectmp = recno;
+ rc = llapi_fid2path(device, fid, path, PATH_MAX, &rectmp,
+ &lnktmp);
+ if (rc < 0) {
+ fprintf(stderr, "%s error: %s\n", argv[0],
+ strerror(errno = -rc));
+ break;
+ }
+
+ if (printcur)
+ fprintf(stdout, "%lld ", rectmp);
+ if (device[0] == '/') {
+ fprintf(stdout, "%s", device);
+ if (device[strlen(device) - 1] != '/')
+ fprintf(stdout, "/");
+ } else if (path[0] == '\0') {
+ fprintf(stdout, "/");
+ }
+ fprintf(stdout, "%s\n", path);
+
+ if (linkno >= 0)
+ /* specified linkno */
+ break;
+ if (oldtmp == lnktmp)
+ /* no more links */
+ break;
+ }
+
+ free(path);
+ return rc;
+}
+
+static int lfs_path2fid(int argc, char **argv)
+{
+ char *path;
+ lustre_fid fid;
+ int rc;
+
+ if (argc != 2)
+ return CMD_HELP;
+
+ path = argv[1];
+ rc = llapi_path2fid(path, &fid);
+ if (rc) {
+ fprintf(stderr, "can't get fid for %s: %s\n", path,
+ strerror(errno = -rc));
+ return rc;
+ }
+
+ printf(DFID"\n", PFID(&fid));
+
+ return 0;
+}
+