Hi Eric, On Tue, Nov 03, 2020 at 09:03:48AM -0600, Eric Sandeen wrote: > On 11/2/20 8:33 PM, Gao Xiang wrote: ... > > + > > + nread = getdents_wrap(fd, (char *)gdp, gdsz); > > + /* > > + * negative count indicates something very bad happened; > > + * try to gracefully end this dir. > > + */ > > + if (nread < 0) { > > + mlog(MLOG_NORMAL | MLOG_WARNING, > > +_("unable to read dirents for directory ino %llu: %s\n"), > > + ino, strerror(errno)); > > + /* !!! curtis looked at this, and pointed out that > > Nobody knows who curtis is, I think we can drop this comment now ;) > If we can't read the directory I think it's fine to simply error out here. This was copied from dump_dir(), ok, I will error out this. > > > + * we could take some recovery action here. if the > > + * errno is appropriate, lseek64 to the value of > > + * doff field of the last dirent successfully > > + * obtained, and contiue the loop. > > + */ > > + nread = 0; /* pretend we are done */ > > + } > > + > > + /* no more directory entries: break; */ > > + if (!nread) > > + break; > > + > > + for (p = gdp; nread > 0; > > + nread -= (int)p->d_reclen, > > + assert(nread >= 0), > > + p = (struct dirent *)((char *)p + p->d_reclen)) { > > + if (!strcmp(p->d_name, "..") && p->d_ino == ino) { > > + mlog(MLOG_DEBUG, "FOUND: name %s d_ino %llu\n", > > + p->d_name, ino); > > + free(gdp); > > + return BOOL_TRUE; > > + } > > I think we can stop as soon as we have found ".." yes? No need to continue > iterating the directory, either ".." is what we wanted, or it's not, but either > way we are done when we have checked it. On the off chance that we have > a very large root dir, stopping early might be good. Yes, that is correct. > > > + } > > + } > > + free(gdp); > > + return BOOL_FALSE; > > +} > > + > > bool_t > > content_init(int argc, > > char *argv[], > > @@ -1393,6 +1448,13 @@ baseuuidbypass: > > mntpnt); > > return BOOL_FALSE; > > } > > + > > + if (!check_rootdir(sc_fsfd, rootstat.st_ino)) { > > + mlog(MLOG_ERROR, > > +"oops, seems to be a bind mount, please use the actual mountpoint instead\n"); > > Could there be any other reason for this failure? Maybe something like: > > mlog(MLOG_ERROR, > _("%s is not the root of the filesystem (bind mount?) - use primary mountpoint\n"), > mntpnt); > > or similar? > > in any case I think it needs the i18n _("...") treatment. Ok, will quickly send the fixed version about this! Thanks for your review! Thanks, Gao Xiang > > Thanks! > > -Eric > > > + return BOOL_FALSE; > > + } > > + > > sc_rootxfsstatp = > > (struct xfs_bstat *)calloc(1, sizeof(struct xfs_bstat)); > > assert(sc_rootxfsstatp); > > >