zephyr/subsys/fs/fcb/fcb_walk.c

50 lines
1001 B
C

/*
* Copyright (c) 2017 Nordic Semiconductor ASA
* Copyright (c) 2015 Runtime Inc
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <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;
}