[U-Boot] [PATCH 4/8] JFFS2: Improve speed reading flash files

Heiko Schocher denx hs at denx.de
Tue Jun 30 11:09:25 CEST 2015


Hello Mark,

Am 29.06.2015 um 07:02 schrieb Mark Tomlinson:
> jffs2_1pass_read_inode() would read the entire data for each node
> in the filesystem, regardless of whether it was part of the file
> to be loaded or not. By only reading the header data for an inode,
> and then reading the data only when it is found to be part of the
> file to be loaded, much copying of data is saved.
>
> jffs2_1pass_list_inodes() read each inode for every file in the
> directory into a buffer. By using NULL as a buffer pointer, NOR
> flash simply returns a pointer, and therefore avoids a memory copy.
>
> Signed-off-by: Mark Tomlinson <mark.tomlinson at alliedtelesis.co.nz>
> ---
>
>   fs/jffs2/jffs2_1pass.c | 25 +++++++++++++++++++------
>   1 file changed, 19 insertions(+), 6 deletions(-)

Reviewed-by: Heiko Schocher <hs at denx.de>

bye,
Heiko
>
> diff --git a/fs/jffs2/jffs2_1pass.c b/fs/jffs2/jffs2_1pass.c
> index 1f6eea7..80210be 100644
> --- a/fs/jffs2/jffs2_1pass.c
> +++ b/fs/jffs2/jffs2_1pass.c
> @@ -730,8 +730,12 @@ jffs2_1pass_read_inode(struct b_lists *pL, u32 inode, char *dest)
>   #endif
>
>   	for (b = pL->frag.listHead; b != NULL; b = b->next) {
> -		jNode = (struct jffs2_raw_inode *) get_node_mem(b->offset,
> -								pL->readbuf);
> +		/* Copy just the node and not the data at this point,
> +		 * since we don't yet know if we need this data.
> +		 */
> +		jNode = (struct jffs2_raw_inode *)get_fl_mem(b->offset,
> +				sizeof(struct jffs2_raw_inode),
> +				pL->readbuf);
>   		if (inode == jNode->ino) {
>   #if 0
>   			putLabeledWord("\r\n\r\nread_inode: totlen = ", jNode->totlen);
> @@ -755,7 +759,14 @@ jffs2_1pass_read_inode(struct b_lists *pL, u32 inode, char *dest)
>   #endif
>
>   			if(dest) {
> -				src = ((uchar *) jNode) + sizeof(struct jffs2_raw_inode);
> +				/* Now that the inode has been checked,
> +				 * read the entire inode, including data.
> +				 */
> +				put_fl_mem(jNode, pL->readbuf);
> +				jNode = (struct jffs2_raw_inode *)
> +					get_node_mem(b->offset, pL->readbuf);
> +				src = ((uchar *)jNode) +
> +					sizeof(struct jffs2_raw_inode);
>   				/* ignore data behind latest known EOF */
>   				if (jNode->offset > totalSize) {
>   					put_fl_mem(jNode, pL->readbuf);
> @@ -962,7 +973,6 @@ jffs2_1pass_list_inodes(struct b_lists * pL, u32 pino)
>   								pL->readbuf);
>   		if (pino == jDir->pino) {
>   			u32 i_version = 0;
> -			struct jffs2_raw_inode ojNode;
>   			struct jffs2_raw_inode *jNode, *i = NULL;
>   			struct b_node *b2;
>
> @@ -997,8 +1007,10 @@ jffs2_1pass_list_inodes(struct b_lists * pL, u32 pino)
>
>   			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) {
> +					get_fl_mem(b2->offset, sizeof(*jNode),
> +						   NULL);
> +				if (jNode->ino == jDir->ino &&
> +				    jNode->version >= i_version) {
>   					i_version = jNode->version;
>   					if (i)
>   						put_fl_mem(i, NULL);
> @@ -1011,6 +1023,7 @@ jffs2_1pass_list_inodes(struct b_lists * pL, u32 pino)
>   							       sizeof(*i),
>   							       NULL);
>   				}
> +				put_fl_mem(jNode, NULL);
>   			}
>
>   			dump_inode(pL, jDir, i);
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


More information about the U-Boot mailing list