/*
 * Copyright (c) 2017 Nordic Semiconductor ASA
 * Copyright (c) 2015 Runtime Inc
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/fs/fcb.h>
#include "fcb_priv.h"

/*
 * Call 'cb' for every element in flash circular buffer. If sector is specified,
 * only elements with that flash_sector are reported.
 */
int
fcb_walk(struct fcb *fcb, struct flash_sector *sector, fcb_walk_cb cb,
	 void *cb_arg)
{
	struct fcb_entry_ctx entry_ctx;
	int rc;

	entry_ctx.loc.fe_sector = sector;
	entry_ctx.loc.fe_elem_off = 0U;

	rc = k_mutex_lock(&fcb->f_mtx, K_FOREVER);
	if (rc < 0) {
		return -EINVAL;
	}
	while ((rc = fcb_getnext_nolock(fcb, &entry_ctx.loc)) !=
	       -ENOTSUP) {
		k_mutex_unlock(&fcb->f_mtx);
		if (sector && entry_ctx.loc.fe_sector != sector) {
			return 0;
		}

		entry_ctx.fap = fcb->fap;

		rc = cb(&entry_ctx, cb_arg);
		if (rc) {
			return rc;
		}
		rc = k_mutex_lock(&fcb->f_mtx, K_FOREVER);
		if (rc < 0) {
			return -EINVAL;
		}
	}
	k_mutex_unlock(&fcb->f_mtx);
	return 0;
}
