int nandfs_get_segment_info(struct nandfs_device *fsdev, struct nandfs_suinfo *nsi, uint32_t nmembs, uint64_t segment) { return (nandfs_get_segment_info_filter(fsdev, nsi, nmembs, segment, NULL, 0, 0)); }
static int nandfs_cleaner_choose_segment(struct nandfs_device *fsdev, uint64_t **segpp, uint64_t nsegs, uint64_t *rseg) { struct nandfs_suinfo *suinfo; uint64_t i, ssegs; int error; suinfo = malloc(sizeof(*suinfo) * nsegs, M_NANDFSTEMP, M_ZERO | M_WAITOK); if (*rseg >= fsdev->nd_fsdata.f_nsegments) *rseg = 0; retry: error = nandfs_get_segment_info_filter(fsdev, suinfo, nsegs, *rseg, &ssegs, NANDFS_SEGMENT_USAGE_DIRTY, NANDFS_SEGMENT_USAGE_ACTIVE | NANDFS_SEGMENT_USAGE_ERROR | NANDFS_SEGMENT_USAGE_GC); if (error) { nandfs_error("%s:%d", __FILE__, __LINE__); goto out; } if (ssegs == 0 && *rseg != 0) { *rseg = 0; goto retry; } print_suinfo(suinfo, ssegs); for (i = 0; i < ssegs; i++) { (**segpp) = suinfo[i].nsi_num; (*segpp)++; } *rseg = suinfo[i - 1].nsi_num + 1; out: free(suinfo, M_NANDFSTEMP); return (error); }