
On Mon, May 07, 2007 at 07:38:20PM +0200, Stefan Roese wrote:
Hi Matthieu,
On Monday 07 May 2007, Matthieu CASTET wrote:
Using jffs2_nand_1pass.c make thing lot's of better (very fast scaning)
Unfortunalty the code seems incomplete : if I do a ls, there are missing files.
Do I understand this correctly? Some files are displayed and some are missing? Could you give an example?
I'm also interrested in test case. Having filesystem image would help as well.
Do you know what's the status of jffs2_nand_1pass.c ?
No, sorry I personally haven't used the JFFS2 code in U-Boot before.
IIRC this code originally is coming from Ladislav Michl (please correct me if I'm wrong here). So Ladis, can you say something about the status of this file and why it not used at all?
Indeed... I wrote it (modified from jffs2_1pass.c) when I was adding NAND code. Unfortunately it is not that easy to support JFFS2 on NOR and NAND simultaneously. It would need more work... Below is what I'm currently using - some changes to shut up newer gcc warnings. Perhaps some kind of #define (evil grin) would be enough?
Best regards, ladis
diff --git a/fs/jffs2/Makefile b/fs/jffs2/Makefile index c1357d0..d02b678 100644 --- a/fs/jffs2/Makefile +++ b/fs/jffs2/Makefile @@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)libjffs2.a
AOBJS = -COBJS = jffs2_1pass.o compr_rtime.o compr_rubin.o compr_zlib.o mini_inflate.o +COBJS = jffs2_nand_1pass.o compr_rtime.o compr_rubin.o compr_zlib.o mini_inflate.o COBJS += compr_lzo.o compr_lzari.o
SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/fs/jffs2/jffs2_nand_1pass.c b/fs/jffs2/jffs2_nand_1pass.c index e78af75..e908929 100644 --- a/fs/jffs2/jffs2_nand_1pass.c +++ b/fs/jffs2/jffs2_nand_1pass.c @@ -166,7 +166,7 @@ insert_dirent(struct b_list *list, struct jffs2_raw_dirent *node, u32 offset) new->version = node->version; new->pino = node->pino; new->ino = node->ino; - new->nhash = full_name_hash(node->name, node->nsize); + new->nhash = full_name_hash((char *)node->name, node->nsize); new->nsize = node->nsize; new->type = node->type;
@@ -298,16 +298,16 @@ jffs2_1pass_read_inode(struct b_lists *pL, u32 ino, char *dest, } #endif if (dest || stat) { - char *src, *dst; + unsigned char *src, *dst; char data[4096 + sizeof(struct jffs2_raw_inode)]; struct jffs2_raw_inode *inode; - size_t len; + ulong len;
inode = (struct jffs2_raw_inode *)&data; len = sizeof(struct jffs2_raw_inode); if (dest) len += jNode->csize; - nand_read(nand, jNode->offset, &len, inode); + nand_read(nand, jNode->offset, &len, (u_char *)inode); /* ignore data behind latest known EOF */ if (inode->offset > totalSize) continue; @@ -322,8 +322,8 @@ jffs2_1pass_read_inode(struct b_lists *pL, u32 ino, char *dest, if (!dest) continue;
- src = ((char *) inode) + sizeof(struct jffs2_raw_inode); - dst = (char *) (dest + inode->offset); + src = ((unsigned char *) inode) + sizeof(struct jffs2_raw_inode); + dst = (unsigned char *) (dest + inode->offset);
switch (inode->compr) { case JFFS2_COMPR_NONE: @@ -434,7 +434,7 @@ static inline void dump_stat(struct stat *st, const char *name) if (st->st_mtime == (time_t)(-1)) /* some ctimes really hate -1 */ st->st_mtime = 1;
- ctime_r(&st->st_mtime, s/*,64*/); /* newlib ctime doesn't have buflen */ + ctime_r((time_t *)&st->st_mtime, s/*,64*/); /* newlib ctime doesn't have buflen */
if ((p = strchr(s,'\n')) != NULL) *p = '\0'; if ((p = strchr(s,'\r')) != NULL) *p = '\0'; @@ -452,12 +452,12 @@ dump_inode(struct b_lists *pL, struct b_dirent *d, struct b_inode *i) { char fname[JFFS2_MAX_NAME_LEN + 1]; struct stat st; - size_t len; + ulong len;
if(!d || !i) return -1; len = d->nsize; nand_read(nand, d->offset + sizeof(struct jffs2_raw_dirent), - &len, &fname); + &len, (uchar *)fname); fname[d->nsize] = '\0';
memset(&st, 0, sizeof(st)); @@ -597,8 +597,9 @@ jffs2_1pass_resolve_inode(struct b_lists * pL, u32 ino) /* it's a soft link so we follow it again. */ for (jNode = (struct b_inode *)pL->frag.listHead; jNode; jNode = jNode->next) { if (jNode->ino == jDirFoundIno) { - size_t len = jNode->csize; - nand_read(nand, jNode->offset + sizeof(struct jffs2_raw_inode), &len, &tmp); + ulong len = jNode->csize; + nand_read(nand, jNode->offset + sizeof(struct jffs2_raw_inode), + &len, (uchar *)tmp); tmp[jNode->csize] = '\0'; break; } @@ -664,9 +665,11 @@ jffs2_1pass_search_list_inodes(struct b_lists * pL, const char *fname, u32 pino) unsigned char jffs2_1pass_rescan_needed(struct part_info *part) { +/* FIXME struct b_node *b; struct jffs2_unknown_node onode; struct jffs2_unknown_node *node; +*/ struct b_lists *pL = (struct b_lists *)part->jffs2_priv;
if (part->jffs2_priv == 0){ @@ -685,8 +688,9 @@ jffs2_1pass_rescan_needed(struct part_info *part) return 1; }
- /* FIXME */ + #if 0 + /* FIXME */ /* but suppose someone reflashed a partition at the same offset... */ b = pL->dir.listHead; while (b) { @@ -770,7 +774,7 @@ jffs2_fill_scan_buf(nand_info_t *nand, unsigned char *buf, unsigned ofs, unsigned len) { int ret; - unsigned olen; + ulong olen;
olen = len; ret = nand_read(nand, ofs, &olen, buf); @@ -792,7 +796,7 @@ jffs2_1pass_build_lists(struct part_info * part) struct b_lists *pL; struct jffs2_unknown_node *node; unsigned nr_blocks, sectorsize, ofs, offset; - char *buf; + unsigned char *buf; int i; u32 counter = 0; u32 counter4 = 0; @@ -910,9 +914,11 @@ jffs2_1pass_build_lists(struct part_info * part) static u32 jffs2_1pass_fill_info(struct b_lists * pL, struct b_jffs2_info * piL) { +/* FIXME struct b_node *b; struct jffs2_raw_inode ojNode; struct jffs2_raw_inode *jNode; +*/ int i;
for (i = 0; i < JFFS2_NUM_COMPR; i++) { diff --git a/fs/jffs2/jffs2_nand_private.h b/fs/jffs2/jffs2_nand_private.h index 18cca8d..2e4d50c 100644 --- a/fs/jffs2/jffs2_nand_private.h +++ b/fs/jffs2/jffs2_nand_private.h @@ -35,7 +35,7 @@ struct b_list { };
struct b_lists { - char *partOffset; + u32 partOffset; struct b_list dir; struct b_list frag; }; @@ -122,7 +122,7 @@ static inline unsigned long end_name_hash(unsigned long hash)
/* Compute the hash for a name string. */ static inline unsigned int -full_name_hash(const unsigned char *name, unsigned int len) +full_name_hash(const char *name, unsigned int len) { unsigned long hash = init_name_hash(); while (len--)