This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 9d8b92c481 fs/mnemofs: Autoformat
9d8b92c481 is described below
commit 9d8b92c4812f3299291527932e7acaf644816976
Author: Saurav Pal <[email protected]>
AuthorDate: Sat Aug 17 20:21:32 2024 +0000
fs/mnemofs: Autoformat
Mnemofs autoformat feature
Signed-off-by: Saurav Pal <[email protected]>
---
drivers/mtd/Kconfig | 22 +--
drivers/mtd/mtd_nandram.c | 8 +-
fs/mnemofs/mnemofs.c | 32 ++++-
fs/mnemofs/mnemofs.h | 22 +++
fs/mnemofs/mnemofs_blkalloc.c | 8 +-
fs/mnemofs/mnemofs_fsobj.c | 2 +-
fs/mnemofs/mnemofs_journal.c | 321 +++++++++++++-----------------------------
fs/mnemofs/mnemofs_lru.c | 4 +-
fs/mnemofs/mnemofs_master.c | 52 +++++--
9 files changed, 219 insertions(+), 252 deletions(-)
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index aa6f18eecf..7ed1aae7d5 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -313,16 +313,18 @@ config MTD_NAND_RAM_STATUS
int "Log status of virtual NAND Flash."
depends on MTD_NAND_RAM_DEBUG
default 3
- range 1 8
- ---help---
- 1 - Log every instruction.
- 2 - Log every 5 instructions.
- 3 - Log every 10 instructions.
- 4 - Log every 50 instructions.
- 5 - Log every 100 instructions.
- 6 - Log every 500 instructions.
- 7 - Log every 1000 instructions.
- 8 - Log every 5000 instructions.
+ range 1 10
+ ---help---
+ 1 - Log every instruction.
+ 2 - Log every 5 instructions.
+ 3 - Log every 10 instructions.
+ 4 - Log every 50 instructions.
+ 5 - Log every 100 instructions.
+ 6 - Log every 500 instructions.
+ 7 - Log every 1000 instructions.
+ 8 - Log every 5000 instructions.
+ 9 - Log every 10000 instructions.
+ 10 - Log every 50000 instructions.
endif #MTD_NAND_RAM
diff --git a/drivers/mtd/mtd_nandram.c b/drivers/mtd/mtd_nandram.c
index eeb1a477b2..1f4f4f2a8f 100644
--- a/drivers/mtd/mtd_nandram.c
+++ b/drivers/mtd/mtd_nandram.c
@@ -50,6 +50,8 @@
#define NAND_RAM_STATUS_6 500
#define NAND_RAM_STATUS_7 1000
#define NAND_RAM_STATUS_8 5000
+#define NAND_RAM_STATUS_9 10000
+#define NAND_RAM_STATUS_10 50000
#if CONFIG_MTD_NAND_RAM_DEBUG_LEVEL == 1
#define NAND_RAM_DEBUG_LEVEL NAND_RAM_DEBUG_1
@@ -75,6 +77,10 @@
#define NAND_RAM_STATUS_LEVEL NAND_RAM_STATUS_7
#elif CONFIG_MTD_NAND_RAM_STATUS == 8
#define NAND_RAM_STATUS_LEVEL NAND_RAM_STATUS_8
+#elif CONFIG_MTD_NAND_RAM_STATUS == 9
+#define NAND_RAM_STATUS_LEVEL NAND_RAM_STATUS_9
+#elif CONFIG_MTD_NAND_RAM_STATUS == 10
+#define NAND_RAM_STATUS_LEVEL NAND_RAM_STATUS_10
#endif /* CONFIG_MTD_NAND_RAM_STATUS */
#define NAND_RAM_LOG(str, ...) \
@@ -101,7 +107,7 @@
struct nand_ram_data_s
{
- uint8_t page[NAND_RAM_PAGE_SIZE / 8];
+ uint8_t page[NAND_RAM_PAGE_SIZE];
};
/* 512 B page spare scheme */
diff --git a/fs/mnemofs/mnemofs.c b/fs/mnemofs/mnemofs.c
index 2c022c85c8..bc4a609a3a 100644
--- a/fs/mnemofs/mnemofs.c
+++ b/fs/mnemofs/mnemofs.c
@@ -1578,21 +1578,39 @@ static int mnemofs_bind(FAR struct inode *driver, FAR
const void *data,
{
/* Found journal first block. */
- mfs_jrnl_init(sb, i);
+ ret = mfs_jrnl_init(sb, i);
+ if (predict_false(ret < 0))
+ {
+ goto errout_with_rwbuf;
+ }
+
+ finfo("Journal initialized.");
+
+ ret = mfs_mn_init(sb, i);
+ if (predict_false(ret < 0))
+ {
+ goto errout_with_rwbuf;
+ }
+
+ finfo("Master Node initialized.");
+
+ break;
}
}
if (predict_false(sb->mn.pg == 0))
{
format = true;
+ memset(&MFS_JRNL(sb), 0, sizeof(struct mfs_jrnl_state_s));
+ memset(&MFS_MN(sb), 0, sizeof(struct mfs_mn_s));
finfo("Device needs to formatted.\n");
}
else
{
finfo("Device already formatted.\n");
- mfs_ba_init(sb);
mfs_lru_init(sb);
+ mfs_ba_init(sb);
}
}
@@ -1613,13 +1631,13 @@ static int mnemofs_bind(FAR struct inode *driver, FAR
const void *data,
ret = mfs_jrnl_fmt(sb, &mnblk1, &mnblk2, &jrnl_blk);
if (predict_false(ret < 0))
{
- goto errout_with_sb;
+ goto errout_with_rwbuf;
}
ret = mfs_mn_fmt(sb, mnblk1, mnblk2, jrnl_blk);
if (predict_false(ret < 0))
{
- goto errout_with_sb;
+ goto errout_with_rwbuf;
}
finfo("Device formatted.\n");
@@ -1632,6 +1650,9 @@ static int mnemofs_bind(FAR struct inode *driver, FAR
const void *data,
finfo("Lock released.");
return ret;
+errout_with_rwbuf:
+ kmm_free(sb->rw_buf);
+
errout_with_lock:
nxmutex_unlock(&MFS_LOCK(sb));
finfo("Lock released.");
@@ -1677,6 +1698,7 @@ static int mnemofs_unbind(FAR void *handle, FAR struct
inode **driver,
mfs_jrnl_free(sb);
mfs_ba_free(sb);
+ kmm_free(sb->rw_buf);
kmm_free(sb);
finfo("Successfully unmounted mnemofs!");
@@ -2216,7 +2238,7 @@ errout_with_path:
nxmutex_unlock(&MFS_LOCK(sb));
errout:
- finfo("Ret %d", ret);
+ finfo("Ret %d.", ret);
return ret;
}
diff --git a/fs/mnemofs/mnemofs.h b/fs/mnemofs/mnemofs.h
index b977317595..3415c74ac1 100644
--- a/fs/mnemofs/mnemofs.h
+++ b/fs/mnemofs/mnemofs.h
@@ -164,6 +164,7 @@ struct mfs_mn_s
struct mfs_jrnl_state_s
{
+ mfs_t jrnl_start;
mfs_t mblk1;
mfs_t mblk2;
mfs_t n_logs;
@@ -595,6 +596,27 @@ int mfs_jrnl_flush(FAR struct mfs_sb_s * const sb);
bool mfs_jrnl_isempty(FAR const struct mfs_sb_s * const sb);
+struct mfs_jrnl_log_s
+{
+ /* A field denoting the size of the below elements is added here on-flash.
+ */
+
+ mfs_t depth;
+ mfs_t sz_new;
+ struct mfs_ctz_s loc_new;
+ struct timespec st_mtim_new;
+ struct timespec st_atim_new;
+ struct timespec st_ctim_new;
+ FAR struct mfs_path_s *path;
+ uint16_t hash;
+};
+
+int mfs_jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
+ FAR mfs_t *blkidx, FAR mfs_t *pg_in_blk,
+ FAR struct mfs_jrnl_log_s *log);
+
+void mfs_jrnl_log_free(FAR const struct mfs_jrnl_log_s * const log);
+
/* mnemofs_blkalloc.c */
/****************************************************************************
diff --git a/fs/mnemofs/mnemofs_blkalloc.c b/fs/mnemofs/mnemofs_blkalloc.c
index 7c127b4853..ff2cf80807 100644
--- a/fs/mnemofs/mnemofs_blkalloc.c
+++ b/fs/mnemofs/mnemofs_blkalloc.c
@@ -311,7 +311,7 @@ int mfs_ba_fmt(FAR struct mfs_sb_s * const sb)
/* MFS_BA(sb).k_del_elemsz = ((log + 7) & (-8)) / 8; */
MFS_BA(sb).k_del = kmm_zalloc(sizeof(size_t) * MFS_NBLKS(sb));
- if (!MFS_BA(sb).k_del)
+ if (predict_false(MFS_BA(sb).k_del == NULL))
{
ret = -ENOMEM;
goto errout;
@@ -320,12 +320,14 @@ int mfs_ba_fmt(FAR struct mfs_sb_s * const sb)
MFS_BA(sb).n_bmap_upgs = MFS_UPPER8(MFS_NPGS(sb));
MFS_BA(sb).bmap_upgs = kmm_zalloc(MFS_BA(sb).n_bmap_upgs);
- if (!MFS_BA(sb).bmap_upgs)
+ if (predict_false(MFS_BA(sb).bmap_upgs == NULL))
{
ret = -ENOMEM;
goto errout_with_k_del;
}
+ /* TODO: Do not start from journal blocks. */
+
finfo("mnemofs: Block Allocator initialized, starting at page %d.\n",
MFS_BLK2PG(sb, MFS_BA(sb).s_blk));
return ret;
@@ -357,6 +359,8 @@ int mfs_ba_init(FAR struct mfs_sb_s * const sb)
goto errout_with_ba;
}
+ return ret;
+
errout_with_ba:
mfs_ba_free(sb);
diff --git a/fs/mnemofs/mnemofs_fsobj.c b/fs/mnemofs/mnemofs_fsobj.c
index 121c15aa41..60153e2810 100644
--- a/fs/mnemofs/mnemofs_fsobj.c
+++ b/fs/mnemofs/mnemofs_fsobj.c
@@ -1054,7 +1054,7 @@ int mfs_pitr_traversefs(FAR struct mfs_sb_s * sb, const
struct mfs_ctz_s ctz,
path[0].ctz = MFS_MN(sb).root_ctz;
path[0].sz = MFS_MN(sb).root_sz;
- ret = pitr_traverse(sb, path, 0, &capacity);
+ ret = pitr_traverse(sb, path, 1, &capacity);
mfs_free_patharr(path);
diff --git a/fs/mnemofs/mnemofs_journal.c b/fs/mnemofs/mnemofs_journal.c
index a62214a82f..242cbd1a39 100644
--- a/fs/mnemofs/mnemofs_journal.c
+++ b/fs/mnemofs/mnemofs_journal.c
@@ -102,34 +102,13 @@
* search methods of higher functions.
*/
-/* New journal log structure being phased in. */
-
-struct jrnl_log_s
-{
- /* A field denoting the size of the below elements is added here on-flash.
- */
-
- mfs_t depth;
- mfs_t sz_new;
- struct mfs_ctz_s loc_new;
- struct timespec st_mtim_new;
- struct timespec st_atim_new;
- struct timespec st_ctim_new;
- FAR struct mfs_path_s *path;
- uint16_t hash;
-};
-
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
-static int jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
- FAR mfs_t *blkidx, FAR mfs_t *pg_in_blk,
- FAR struct jrnl_log_s *log);
-
FAR static const char *deser_log(FAR const char * const in,
- FAR struct jrnl_log_s * const x);
-FAR static char *ser_log(FAR const struct jrnl_log_s * const x,
+ FAR struct mfs_jrnl_log_s * const x);
+FAR static char *ser_log(FAR const struct mfs_jrnl_log_s * const x,
FAR char * const out);
/****************************************************************************
@@ -145,7 +124,7 @@ FAR static char *ser_log(FAR const struct jrnl_log_s
* const x,
****************************************************************************/
/****************************************************************************
- * Name: jrnl_rdlog
+ * Name: mfs_jrnl_rdlog
*
* Description:
* Read a log to the journal from given location, and update location to
@@ -175,21 +154,16 @@ FAR static char *ser_log(FAR const struct
jrnl_log_s * const x,
*
****************************************************************************/
-static int jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
+int mfs_jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
FAR mfs_t *blkidx, FAR mfs_t *pg_in_blk,
- FAR struct jrnl_log_s *log)
+ FAR struct mfs_jrnl_log_s *log)
{
int ret = OK;
char tmp[4];
- mfs_t i;
- mfs_t len;
- mfs_t n_pgs;
- mfs_t rd_sz;
mfs_t log_sz;
mfs_t jrnl_pg;
mfs_t jrnl_blk;
FAR char *buf = NULL;
- FAR char *buftmp = NULL;
DEBUGASSERT(*pg_in_blk % MFS_PGSZ(sb) == 0);
@@ -205,7 +179,11 @@ static int jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
}
mfs_deser_mfs(tmp, &log_sz);
- n_pgs = MFS_CEILDIVIDE(log_sz, MFS_PGSZ(sb));
+ if (log_sz == 0)
+ {
+ ret = -ENOSPC;
+ goto errout;
+ }
buf = kmm_zalloc(log_sz);
if (predict_false(buf == NULL))
@@ -214,74 +192,27 @@ static int jrnl_rdlog(FAR const struct mfs_sb_s *const sb,
goto errout;
}
- buftmp = buf;
- rd_sz = 0;
- for (i = 0; i < n_pgs && rd_sz < log_sz; i++)
+ ret = mfs_read_page(sb, buf, log_sz, jrnl_pg, 4);
+ if (predict_false(ret < 0))
{
- /* This if-statement exists to remove calculation behind
- * MIN(MFS_PGSZ(sb), log_sz - rd_sz)
- */
-
- if (i == 0 && i != n_pgs - 1)
- {
- ret = mfs_read_page(sb, buftmp, MFS_PGSZ(sb), jrnl_pg,
- sizeof(mfs_t));
- len = MFS_PGSZ(sb);
- }
- else if (i == 0)
- {
- ret = mfs_read_page(sb, buftmp, log_sz, jrnl_pg, sizeof(mfs_t));
- len = log_sz;
- }
- else if (i == n_pgs - 1)
- {
- ret = mfs_read_page(sb, buftmp, log_sz - rd_sz, jrnl_pg, 0);
- len = log_sz - rd_sz;
- }
- else
- {
- ret = mfs_read_page(sb, buftmp, MFS_PGSZ(sb), jrnl_pg, 0);
- len = MFS_PGSZ(sb);
- }
-
- buftmp += len;
- rd_sz += len;
-
- if (predict_false(ret == 0))
- {
- ret = -EINVAL; /* TODO: Need to check when this occurs. */
- goto errout_with_buf;
- }
-
- /* Move to next block if needed. */
-
- jrnl_pg++;
- if (jrnl_pg - MFS_BLK2PG(sb, jrnl_blk) >= MFS_PGINBLK(sb))
- {
- (*blkidx)++;
-
- if (*blkidx >= MFS_JRNL(sb).n_blks)
- {
- /* Not finished reading log yet, and the journal is over. */
-
- ret = -ENOSPC;
- goto errout_with_buf;
- }
-
- jrnl_blk = mfs_jrnl_blkidx2blk(sb, *blkidx);
- jrnl_pg = MFS_BLK2PG(sb, jrnl_blk);
- }
+ goto errout_with_buf;
}
+ ret = OK;
+
if (predict_false(deser_log(buf, log) == NULL))
{
ret = -ENOMEM;
goto errout_with_buf;
}
- /* blkidx has been up to date throughout the program. */
+ (*pg_in_blk)++;
- *pg_in_blk = jrnl_pg - MFS_BLK2PG(sb, jrnl_blk);
+ if (*pg_in_blk >= MFS_PGINBLK(sb))
+ {
+ *pg_in_blk = 0;
+ (*blkidx)++;
+ }
errout_with_buf:
kmm_free(buf);
@@ -310,7 +241,7 @@ errout:
*
****************************************************************************/
-FAR static char *ser_log(FAR const struct jrnl_log_s * const x,
+FAR static char *ser_log(FAR const struct mfs_jrnl_log_s * const x,
FAR char * const out)
{
char *o = out;
@@ -352,7 +283,7 @@ FAR static char *ser_log(FAR const struct jrnl_log_s *
const x,
****************************************************************************/
FAR static const char *deser_log(FAR const char * const in,
- FAR struct jrnl_log_s * const x)
+ FAR struct mfs_jrnl_log_s * const x)
{
mfs_t k = 0;
const char *i = in;
@@ -366,7 +297,7 @@ FAR static const char *deser_log(FAR const char * const in,
/* Allocates path. Deallocate using mfs_jrnl_log_free. */
- x->path = kmm_zalloc(sizeof(struct jrnl_log_s) * x->depth);
+ x->path = kmm_zalloc(sizeof(struct mfs_jrnl_log_s) * x->depth);
if (predict_false(x->path == NULL))
{
return NULL;
@@ -382,7 +313,7 @@ FAR static const char *deser_log(FAR const char * const in,
}
/****************************************************************************
- * Name: jrnl_log_free
+ * Name: mfs_jrnl_log_free
*
* Description:
* Free the log.
@@ -395,7 +326,7 @@ FAR static const char *deser_log(FAR const char * const in,
*
****************************************************************************/
-static void jrnl_log_free(FAR const struct jrnl_log_s * const log)
+void mfs_jrnl_log_free(FAR const struct mfs_jrnl_log_s * const log)
{
free(log->path);
}
@@ -406,18 +337,17 @@ static void jrnl_log_free(FAR const struct jrnl_log_s *
const log)
int mfs_jrnl_init(FAR struct mfs_sb_s * const sb, mfs_t blk)
{
- char buftmp[2];
- int ret = OK;
- mfs_t sz;
- mfs_t blkidx;
- mfs_t pg_in_blk;
- FAR char *buf = NULL;
- FAR struct jrnl_log_s *log = NULL;
+ char buftmp[2];
+ int ret = OK;
+ mfs_t sz;
+ mfs_t blkidx;
+ mfs_t pg_in_blk;
+ struct mfs_jrnl_log_s log;
/* Magic sequence is already used to find the block, so not required. */
mfs_read_page(sb, buftmp, 2, MFS_BLK2PG(sb, blk), 8);
- mfs_deser_16(buf, &MFS_JRNL(sb).n_blks);
+ mfs_deser_16(buftmp, &MFS_JRNL(sb).n_blks);
if (MFS_JRNL(sb).n_blks == 0)
{
@@ -427,11 +357,12 @@ int mfs_jrnl_init(FAR struct mfs_sb_s * const sb, mfs_t
blk)
sz = MFS_JRNL_SUFFIXSZ + ((CONFIG_MNEMOFS_JOURNAL_NBLKS + 2) * 4);
+ MFS_JRNL(sb).jrnl_start = blk;
MFS_JRNL(sb).log_cpg = (sz + (MFS_PGSZ(sb) - 1)) / MFS_PGSZ(sb);
MFS_JRNL(sb).log_spg = MFS_JRNL(sb).log_cpg;
MFS_JRNL(sb).log_cblkidx = 0;
MFS_JRNL(sb).log_sblkidx = MFS_JRNL(sb).log_cblkidx;
- MFS_JRNL(sb).jrnlarr_pg = 0;
+ MFS_JRNL(sb).jrnlarr_pg = MFS_BLK2PG(sb, blk); /* Assuming pgsz > 10 */
MFS_JRNL(sb).jrnlarr_pgoff = MFS_JRNL_SUFFIXSZ;
/* Number of logs */
@@ -442,9 +373,7 @@ int mfs_jrnl_init(FAR struct mfs_sb_s * const sb, mfs_t blk)
while (true)
{
- /* TODO: Update this to new read log. */
-
- ret = jrnl_rdlog(sb, &blkidx, &pg_in_blk, log);
+ ret = mfs_jrnl_rdlog(sb, &blkidx, &pg_in_blk, &log);
if (predict_false(ret < 0 && ret != -ENOSPC))
{
goto errout;
@@ -460,14 +389,14 @@ int mfs_jrnl_init(FAR struct mfs_sb_s * const sb, mfs_t
blk)
* depth of 1.
*/
- if (!log || log->depth == 0)
+ if (log.depth == 0)
{
- DEBUGASSERT(!log || log->path == NULL);
+ DEBUGASSERT(log.path == NULL);
break;
}
MFS_JRNL(sb).n_logs++;
- jrnl_log_free(log);
+ mfs_jrnl_log_free(&log);
}
/* Master node */
@@ -486,21 +415,20 @@ errout:
int mfs_jrnl_fmt(FAR struct mfs_sb_s * const sb, FAR mfs_t *blk1,
FAR mfs_t *blk2, FAR mfs_t *jrnl_blk)
{
- int i;
- int ret = OK;
- mfs_t sz;
- mfs_t pg;
- mfs_t blk;
- mfs_t n_pgs;
- mfs_t rem_sz;
- mfs_t alloc_blk;
+ int i;
+ int ret = OK;
+ mfs_t sz;
+ mfs_t pg;
+ mfs_t blk;
+ mfs_t alloc_blk;
FAR char *tmp;
FAR char *buf = NULL;
+ /* TODO: Replace jrnl_blk with MFS_JRNL(sb).jrnl_start if possible. */
+
/* Write magic sequence, size of jrnlarr, and then the jrnlarr. */
sz = MFS_JRNL_SUFFIXSZ + ((CONFIG_MNEMOFS_JOURNAL_NBLKS + 2) * 4);
- n_pgs = (sz + (MFS_PGSZ(sb) - 1)) / MFS_PGSZ(sb);
buf = kmm_zalloc(sz);
if (predict_false(buf == NULL))
@@ -542,7 +470,9 @@ int mfs_jrnl_fmt(FAR struct mfs_sb_s * const sb, FAR mfs_t
*blk1,
if (predict_false(i == 0))
{
- blk = alloc_blk;
+ blk = alloc_blk;
+ *jrnl_blk = alloc_blk;
+ MFS_JRNL(sb).jrnl_start = alloc_blk;
}
finfo("Allocated Journal Block %d at Block %d.", i, alloc_blk);
@@ -553,22 +483,13 @@ int mfs_jrnl_fmt(FAR struct mfs_sb_s * const sb, FAR
mfs_t *blk1,
finfo("All Journal Blocks allocated.");
- tmp = buf;
pg = MFS_BLK2PG(sb, blk);
- for (i = 0; i < n_pgs; i++)
+ ret = mfs_write_page(sb, buf, sz, pg, 0); /* Assuming array fits in a
+ * single page.
+ */
+ if (predict_false(ret < 0))
{
- rem_sz = MIN(MFS_PGSZ(sb), buf + sz - tmp);
- ret = mfs_write_page(sb, tmp, rem_sz, pg, 0);
- if (predict_false(ret < 0))
- {
- goto errout_with_buf;
- }
-
- pg++;
-
- DEBUGASSERT(pg < MFS_BLK2PG(sb, blk) + MFS_PGINBLK(sb));
-
- tmp += rem_sz;
+ goto errout_with_buf;
}
ret = OK; /* We reach here, we OK. */
@@ -577,7 +498,7 @@ int mfs_jrnl_fmt(FAR struct mfs_sb_s * const sb, FAR mfs_t
*blk1,
MFS_JRNL(sb).n_logs = 0;
MFS_JRNL(sb).n_blks = CONFIG_MNEMOFS_JOURNAL_NBLKS;
- MFS_JRNL(sb).log_cpg = pg;
+ MFS_JRNL(sb).log_cpg = pg + 1; /* Assumes 1 page for jrnl_arr. */
MFS_JRNL(sb).log_cblkidx = 0;
MFS_JRNL(sb).log_spg = MFS_JRNL(sb).log_cpg;
MFS_JRNL(sb).log_sblkidx = MFS_JRNL(sb).log_cblkidx;
@@ -595,7 +516,12 @@ errout:
void mfs_jrnl_free(FAR struct mfs_sb_s * const sb)
{
- mfs_jrnl_flush(sb);
+ if (!mfs_jrnl_isempty(sb) &&
+ MFS_JRNL(sb).log_cblkidx >= MFS_JRNL_LIM(sb))
+ {
+ mfs_jrnl_flush(sb);
+ }
+
finfo("Journal Freed.");
}
@@ -609,10 +535,9 @@ mfs_t mfs_jrnl_blkidx2blk(FAR const struct mfs_sb_s *
const sb,
mfs_t pgoff;
char buf[4];
- pg = MFS_JRNL(sb).jrnlarr_pg;
- pgoff = MFS_JRNL(sb).jrnlarr_pgoff;
- blk = MFS_PG2BLK(sb, pg);
-
+ pg = MFS_JRNL(sb).jrnlarr_pg;
+ pgoff = MFS_JRNL(sb).jrnlarr_pgoff;
+ blk = MFS_PG2BLK(sb, pg);
pgoff += blk_idx * 4;
if (pgoff > MFS_PGSZ(sb))
@@ -644,11 +569,11 @@ int mfs_jrnl_updatedinfo(FAR const struct mfs_sb_s *
const sb,
FAR struct mfs_path_s * const path,
const mfs_t depth)
{
- int ret = OK;
- mfs_t blkidx;
- mfs_t counter = 0;
- mfs_t pg_in_block;
- struct jrnl_log_s tmplog;
+ int ret = OK;
+ mfs_t blkidx;
+ mfs_t counter = 0;
+ mfs_t pg_in_block;
+ struct mfs_jrnl_log_s tmplog;
/* TODO: Allow optional filling of updated timestamps, etc. */
@@ -659,7 +584,7 @@ int mfs_jrnl_updatedinfo(FAR const struct mfs_sb_s * const
sb,
while (blkidx < MFS_JRNL(sb).n_blks && counter < MFS_JRNL(sb).n_logs)
{
- ret = jrnl_rdlog(sb, &blkidx, &pg_in_block, &tmplog);
+ ret = mfs_jrnl_rdlog(sb, &blkidx, &pg_in_block, &tmplog);
if (predict_false(ret < 0 && ret != -ENOSPC))
{
goto errout;
@@ -687,7 +612,7 @@ int mfs_jrnl_updatedinfo(FAR const struct mfs_sb_s * const
sb,
}
}
- jrnl_log_free(&tmplog);
+ mfs_jrnl_log_free(&tmplog);
counter++;
}
@@ -699,16 +624,13 @@ int mfs_jrnl_wrlog(FAR struct mfs_sb_s * const sb,
FAR const struct mfs_node_s *node,
const struct mfs_ctz_s loc_new, const mfs_t sz_new)
{
- int ret = OK;
- mfs_t i;
- mfs_t n_pgs;
- mfs_t wr_sz;
- mfs_t jrnl_pg;
- mfs_t jrnl_blk;
- FAR char *buf = NULL;
- FAR char *tmp = NULL;
- const mfs_t log_sz = sizeof(mfs_t) + MFS_LOGSZ(node->depth);
- struct jrnl_log_s log;
+ int ret = OK;
+ mfs_t jrnl_pg;
+ mfs_t jrnl_blk;
+ FAR char *buf = NULL;
+ FAR char *tmp = NULL;
+ const mfs_t log_sz = sizeof(mfs_t) + MFS_LOGSZ(node->depth);
+ struct mfs_jrnl_log_s log;
buf = kmm_zalloc(log_sz); /* For size before log. */
if (predict_false(buf == NULL))
@@ -733,70 +655,26 @@ int mfs_jrnl_wrlog(FAR struct mfs_sb_s * const sb,
/* Store */
- n_pgs = MFS_CEILDIVIDE(log_sz, MFS_PGSZ(sb));
jrnl_blk = mfs_jrnl_blkidx2blk(sb, MFS_JRNL(sb).log_cblkidx);
jrnl_pg = MFS_JRNL(sb).log_cpg;
- tmp = buf;
- wr_sz = 0;
- for (i = 0; i < n_pgs && wr_sz < log_sz; i++)
- {
- /* This if-statement exists to remove calculation behind
- * MIN(MFS_PGSZ(sb), log_sz - wr_sz)
- */
- if (i == 0 && i == n_pgs - 1)
- {
- ret = mfs_write_page(sb, tmp, log_sz, jrnl_pg, 0);
- wr_sz += log_sz;
- tmp += log_sz;
- }
- else if (i == 0)
- {
- ret = mfs_write_page(sb, tmp, MFS_PGSZ(sb), jrnl_pg, 0);
- wr_sz += MFS_PGSZ(sb);
- tmp += MFS_PGSZ(sb);
- }
- else if (i == n_pgs - 1)
- {
- ret = mfs_write_page(sb, tmp, log_sz - wr_sz, jrnl_pg, 0);
- wr_sz += MFS_PGSZ(sb);
- tmp += MFS_PGSZ(sb);
- }
- else
- {
- ret = mfs_write_page(sb, tmp, MFS_PGSZ(sb), jrnl_pg, 0);
- wr_sz += MFS_PGSZ(sb);
- tmp += MFS_PGSZ(sb);
- }
-
- if (predict_false(ret == 0))
- {
- ret = -EINVAL;
- goto errout_with_buf;
- }
+ /* TODO: It assumes it takes only one page per log. */
- /* Move to next block if needed. */
-
- jrnl_pg++;
- if (jrnl_pg - MFS_BLK2PG(sb, jrnl_blk) == MFS_PGINBLK(sb))
- {
- MFS_JRNL(sb).log_cblkidx++;
+ ret = mfs_write_page(sb, buf, log_sz, jrnl_pg, 0);
+ if (predict_false(ret < 0))
+ {
+ goto errout_with_buf;
+ }
- if (MFS_JRNL(sb).log_cblkidx == MFS_JRNL(sb).n_blks)
- {
- /* Not finished reading log yet, and the journal is over. */
+ ret = OK;
- ret = -ENOSPC;
- goto errout_with_buf;
- }
+ jrnl_pg++;
- jrnl_blk = mfs_jrnl_blkidx2blk(sb, MFS_JRNL(sb).log_cblkidx);
- jrnl_pg = MFS_BLK2PG(sb, jrnl_blk);
- }
+ if (jrnl_pg % MFS_PGINBLK(sb) == 0)
+ {
+ MFS_JRNL(sb).log_cblkidx++;
}
- /* MFS_JRNL(sb).log_cblkidx is up to date */
-
MFS_JRNL(sb).log_cpg = jrnl_pg;
MFS_JRNL(sb).n_logs++;
@@ -852,15 +730,15 @@ int mfs_jrnl_flush(FAR struct mfs_sb_s * const sb)
mfs_t i;
mfs_t jrnl_blk;
mfs_t blk;
- struct jrnl_log_s log;
- struct jrnl_log_s tmp_log;
+ struct mfs_jrnl_log_s log;
+ struct mfs_jrnl_log_s tmp_log;
FAR struct mfs_path_s *path = NULL;
struct mfs_jrnl_state_s j_state;
struct mfs_mn_s mn_state;
while (log_itr < MFS_JRNL(sb).n_logs)
{
- ret = jrnl_rdlog(sb, &blkidx, &pg_in_blk, &log);
+ ret = mfs_jrnl_rdlog(sb, &blkidx, &pg_in_blk, &log);
if (predict_false(ret < 0))
{
DEBUGASSERT(ret != -ENOSPC); /* While condition is sufficient. */
@@ -888,27 +766,28 @@ int mfs_jrnl_flush(FAR struct mfs_sb_s * const sb)
for (; ; )
{
- ret = jrnl_rdlog(sb, &tmp_blkidx, &tmp_pg_in_blk, &tmp_log);
+ ret = mfs_jrnl_rdlog(sb, &tmp_blkidx, &tmp_pg_in_blk, &tmp_log);
if (ret == -ENOSPC)
{
break;
}
else if (predict_false(ret < 0))
{
- jrnl_log_free(&log);
+ mfs_jrnl_log_free(&log);
+ mfs_free_patharr(path);
goto errout;
}
if (tmp_log.depth > log.depth)
{
- jrnl_log_free(&tmp_log);
+ mfs_jrnl_log_free(&tmp_log);
continue;
}
if (!mfs_path_eq(&path[tmp_log.depth - 1],
&tmp_log.path[tmp_log.depth - 1]))
{
- jrnl_log_free(&tmp_log);
+ mfs_jrnl_log_free(&tmp_log);
continue;
}
@@ -937,13 +816,13 @@ int mfs_jrnl_flush(FAR struct mfs_sb_s * const sb)
if (predict_false(ret < 0))
{
mfs_free_patharr(path);
- jrnl_log_free(&log);
+ mfs_jrnl_log_free(&log);
goto errout;
}
}
mfs_free_patharr(path);
- jrnl_log_free(&log);
+ mfs_jrnl_log_free(&log);
}
if (MFS_MN(sb).mblk_idx == MFS_PGINBLK(sb))
diff --git a/fs/mnemofs/mnemofs_lru.c b/fs/mnemofs/mnemofs_lru.c
index bfd310ce01..cda3cee5c1 100644
--- a/fs/mnemofs/mnemofs_lru.c
+++ b/fs/mnemofs/mnemofs_lru.c
@@ -286,8 +286,8 @@ static void lru_free_delta(FAR struct mfs_delta_s *delta)
* (false).
*
* Returned Value:
- * 0 - OK
- * < 0 - Error
+ * 0 - OK
+ * < 0 - Error
*
****************************************************************************/
diff --git a/fs/mnemofs/mnemofs_master.c b/fs/mnemofs/mnemofs_master.c
index 517df69a6f..d2a69c42a0 100644
--- a/fs/mnemofs/mnemofs_master.c
+++ b/fs/mnemofs/mnemofs_master.c
@@ -195,16 +195,19 @@ int mfs_mn_init(FAR struct mfs_sb_s * const sb, const
mfs_t jrnl_blk)
mfs_t mblk1;
mfs_t mblk2;
mfs_t jrnl_blk_tmp;
+ mfs_t blkidx;
+ mfs_t pg_in_blk;
bool found = false;
uint16_t hash;
struct mfs_mn_s mn;
const mfs_t sz = sizeof(struct mfs_mn_s) - sizeof(mn.pg);
char buftmp[4];
char buf[sz + 1];
+ struct mfs_jrnl_log_s log;
mblk1 = mfs_jrnl_blkidx2blk(sb, MFS_JRNL(sb).n_blks);
mblk2 = mfs_jrnl_blkidx2blk(sb, MFS_JRNL(sb).n_blks + 1);
- mn.jrnl_blk = mn.jrnl_blk;
+ mn.jrnl_blk = jrnl_blk;
mn.mblk_idx = 0;
mn.pg = MFS_BLK2PG(sb, mblk1);
@@ -218,11 +221,6 @@ int mfs_mn_init(FAR struct mfs_sb_s * const sb, const
mfs_t jrnl_blk)
break;
}
- if (jrnl_blk_tmp != jrnl_blk)
- {
- break;
- }
-
found = true;
mn.mblk_idx++;
mn.pg++;
@@ -245,9 +243,6 @@ int mfs_mn_init(FAR struct mfs_sb_s * const sb, const mfs_t
jrnl_blk)
}
mfs_read_page(sb, buf, sz + 1, mn.pg, 0);
-
- /* Deserialize. */
-
deser_mn(buf, &mn, &hash);
if (hash != mfs_hash(buf, sz))
{
@@ -255,12 +250,49 @@ int mfs_mn_init(FAR struct mfs_sb_s * const sb, const
mfs_t jrnl_blk)
goto errout;
}
+ blkidx = MFS_JRNL(sb).log_sblkidx;
+ pg_in_blk = MFS_JRNL(sb).log_spg % MFS_PGINBLK(sb);
+
+ while (true)
+ {
+ ret = mfs_jrnl_rdlog(sb, &blkidx, &pg_in_blk, &log);
+ if (predict_false(ret < 0 && ret != -ENOSPC))
+ {
+ goto errout;
+ }
+ else if (ret == -ENOSPC)
+ {
+ ret = OK;
+ break;
+ }
+
+ /* Assumes checking the depth is enough to check if it's empty, as
+ * theoretically there are no blocks with depth 0, as root has a
+ * depth of 1.
+ */
+
+ if (log.depth == 0)
+ {
+ DEBUGASSERT(log.path == NULL);
+ break;
+ }
+
+ if (log.depth == 1)
+ {
+ mn.root_ctz = log.loc_new;
+ mn.root_sz = log.sz_new;
+ }
+
+ mfs_jrnl_log_free(&log);
+ }
+
/* FUTURE TODO: Recovery in case of hash not matching, or page not
* readable.
*/
- MFS_MN(sb) = mn;
+ mn.root_mode = 0777 | S_IFDIR;
+ MFS_MN(sb) = mn;
errout:
return ret;
}