1 /*
2  * Copyright (c) 2017 Nordic Semiconductor ASA
3  * Copyright (c) 2015 Runtime Inc
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <zephyr/fs/fcb.h>
9 #include "fcb_priv.h"
10 
11 int
fcb_rotate(struct fcb * fcb)12 fcb_rotate(struct fcb *fcb)
13 {
14 	struct flash_sector *sector;
15 	int rc = 0;
16 
17 	rc = k_mutex_lock(&fcb->f_mtx, K_FOREVER);
18 	if (rc) {
19 		return -EINVAL;
20 	}
21 
22 	rc = fcb_erase_sector(fcb, fcb->f_oldest);
23 	if (rc) {
24 		rc = -EIO;
25 		goto out;
26 	}
27 	if (fcb->f_oldest == fcb->f_active.fe_sector) {
28 		/*
29 		 * Need to create a new active area, as we're wiping
30 		 * the current.
31 		 */
32 		sector = fcb_getnext_sector(fcb, fcb->f_oldest);
33 		rc = fcb_sector_hdr_init(fcb, sector, fcb->f_active_id + 1);
34 		if (rc) {
35 			goto out;
36 		}
37 		fcb->f_active.fe_sector = sector;
38 		fcb->f_active.fe_elem_off = fcb_len_in_flash(fcb, sizeof(struct fcb_disk_area));
39 		fcb->f_active_id++;
40 	}
41 	fcb->f_oldest = fcb_getnext_sector(fcb, fcb->f_oldest);
42 out:
43 	k_mutex_unlock(&fcb->f_mtx);
44 	return rc;
45 }
46