From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher denx Date: Tue, 30 Jun 2015 11:07:46 +0200 Subject: [U-Boot] [PATCH 3/8] JFFS2: Only list each directory entry once In-Reply-To: <1435554149-18042-4-git-send-email-mark.tomlinson@alliedtelesis.co.nz> References: <1435554149-18042-1-git-send-email-mark.tomlinson@alliedtelesis.co.nz> <1435554149-18042-4-git-send-email-mark.tomlinson@alliedtelesis.co.nz> Message-ID: <55925C62.7000908@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Mark, Am 29.06.2015 um 07:02 schrieb Mark Tomlinson: > If multiple versions of a file exist, only the most recent version > should be used. The scheme to write 0 for the inode in older versions > did not work, since this would have required writing to flash. > > The only time this caused an issue was listing a directory, where older > versions of the file would still be seen. Since the directory entries > are sorted, just look at the next entry in the list, and if it's the same > move to that entry instead. > > Signed-off-by: Mark Tomlinson > --- > > fs/jffs2/jffs2_1pass.c | 37 ++++++++++++++++++++++++++++++++----- > 1 file changed, 32 insertions(+), 5 deletions(-) Reviewed-by: Heiko Schocher bye, Heiko > > diff --git a/fs/jffs2/jffs2_1pass.c b/fs/jffs2/jffs2_1pass.c > index 079bb73..1f6eea7 100644 > --- a/fs/jffs2/jffs2_1pass.c > +++ b/fs/jffs2/jffs2_1pass.c > @@ -840,7 +840,6 @@ jffs2_1pass_find_inode(struct b_lists * pL, const char *name, u32 pino) > jDir = (struct jffs2_raw_dirent *) get_node_mem(b->offset, > pL->readbuf); > if ((pino == jDir->pino) && (len == jDir->nsize) && > - (jDir->ino) && /* 0 for unlink */ > (!strncmp((char *)jDir->name, name, len))) { /* a match */ > if (jDir->version < version) { > put_fl_mem(jDir, pL->readbuf); > @@ -961,13 +960,42 @@ jffs2_1pass_list_inodes(struct b_lists * pL, u32 pino) > for (b = pL->dir.listHead; b; b = b->next) { > jDir = (struct jffs2_raw_dirent *) get_node_mem(b->offset, > pL->readbuf); > - if ((pino == jDir->pino) && (jDir->ino)) { /* ino=0 -> unlink */ > + if (pino == jDir->pino) { > u32 i_version = 0; > struct jffs2_raw_inode ojNode; > struct jffs2_raw_inode *jNode, *i = NULL; > - struct b_node *b2 = pL->frag.listHead; > + struct b_node *b2; > > - while (b2) { > +#ifdef CONFIG_SYS_JFFS2_SORT_FRAGMENTS > + /* Check for more recent versions of this file */ > + int match; > + do { > + struct b_node *next = b->next; > + struct jffs2_raw_dirent *jDirNext; > + if (!next) > + break; > + jDirNext = (struct jffs2_raw_dirent *) > + get_node_mem(next->offset, NULL); > + match = jDirNext->pino == jDir->pino && > + jDirNext->nsize == jDir->nsize && > + strncmp((char *)jDirNext->name, > + (char *)jDir->name, > + jDir->nsize) == 0; > + if (match) { > + /* Use next. It is more recent */ > + b = next; > + /* Update buffer with the new info */ > + *jDir = *jDirNext; > + put_fl_mem(jDirNext, NULL); > + } > + } while (match); > +#endif > + if (jDir->ino == 0) { > + /* Deleted file */ > + continue; > + } > + > + for (b2 = pL->frag.listHead; b2; b2 = b2->next) { > jNode = (struct jffs2_raw_inode *) > get_fl_mem(b2->offset, sizeof(ojNode), &ojNode); > if (jNode->ino == jDir->ino && jNode->version >= i_version) { > @@ -983,7 +1011,6 @@ jffs2_1pass_list_inodes(struct b_lists * pL, u32 pino) > sizeof(*i), > NULL); > } > - b2 = b2->next; > } > > dump_inode(pL, jDir, i); > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany