コード例 #1
0
ファイル: nandfs_sufile.c プロジェクト: coyizumi/cs111
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));
}
コード例 #2
0
ファイル: nandfs_cleaner.c プロジェクト: AhmadTux/freebsd
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);
}