Esempio n. 1
0
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));
}
Esempio n. 2
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);
}