diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/compat.c | 1 | ||||
| -rw-r--r-- | fs/jffs2/build.c | 2 | ||||
| -rw-r--r-- | fs/jffs2/compr.c | 6 | ||||
| -rw-r--r-- | fs/jffs2/compr.h | 4 | ||||
| -rw-r--r-- | fs/jffs2/compr_lzo.c | 4 | ||||
| -rw-r--r-- | fs/jffs2/compr_rtime.c | 6 | ||||
| -rw-r--r-- | fs/jffs2/compr_rubin.c | 11 | ||||
| -rw-r--r-- | fs/jffs2/compr_zlib.c | 6 | ||||
| -rw-r--r-- | fs/jffs2/dir.c | 3 | ||||
| -rw-r--r-- | fs/jffs2/erase.c | 2 | ||||
| -rw-r--r-- | fs/jffs2/fs.c | 22 | ||||
| -rw-r--r-- | fs/jffs2/gc.c | 7 | ||||
| -rw-r--r-- | fs/jffs2/jffs2_fs_sb.h | 1 | ||||
| -rw-r--r-- | fs/jffs2/nodelist.c | 8 | ||||
| -rw-r--r-- | fs/jffs2/nodelist.h | 3 | ||||
| -rw-r--r-- | fs/jffs2/scan.c | 12 |
16 files changed, 57 insertions, 41 deletions
diff --git a/fs/compat.c b/fs/compat.c index ff66c0d7583d..c580c322fa6b 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/eventpoll.h> | 49 | #include <linux/eventpoll.h> |
| 50 | #include <linux/fs_struct.h> | 50 | #include <linux/fs_struct.h> |
| 51 | #include <linux/slab.h> | 51 | #include <linux/slab.h> |
| 52 | #include <linux/pagemap.h> | ||
| 52 | 53 | ||
| 53 | #include <asm/uaccess.h> | 54 | #include <asm/uaccess.h> |
| 54 | #include <asm/mmu_context.h> | 55 | #include <asm/mmu_context.h> |
diff --git a/fs/jffs2/build.c b/fs/jffs2/build.c index a906f538d11c..85c6be2db02f 100644 --- a/fs/jffs2/build.c +++ b/fs/jffs2/build.c | |||
| @@ -23,7 +23,7 @@ static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *, | |||
| 23 | static inline struct jffs2_inode_cache * | 23 | static inline struct jffs2_inode_cache * |
| 24 | first_inode_chain(int *i, struct jffs2_sb_info *c) | 24 | first_inode_chain(int *i, struct jffs2_sb_info *c) |
| 25 | { | 25 | { |
| 26 | for (; *i < INOCACHE_HASHSIZE; (*i)++) { | 26 | for (; *i < c->inocache_hashsize; (*i)++) { |
| 27 | if (c->inocache_list[*i]) | 27 | if (c->inocache_list[*i]) |
| 28 | return c->inocache_list[*i]; | 28 | return c->inocache_list[*i]; |
| 29 | } | 29 | } |
diff --git a/fs/jffs2/compr.c b/fs/jffs2/compr.c index 617a1e5694c1..de4247021d25 100644 --- a/fs/jffs2/compr.c +++ b/fs/jffs2/compr.c | |||
| @@ -103,7 +103,7 @@ uint16_t jffs2_compress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
| 103 | spin_unlock(&jffs2_compressor_list_lock); | 103 | spin_unlock(&jffs2_compressor_list_lock); |
| 104 | *datalen = orig_slen; | 104 | *datalen = orig_slen; |
| 105 | *cdatalen = orig_dlen; | 105 | *cdatalen = orig_dlen; |
| 106 | compr_ret = this->compress(data_in, output_buf, datalen, cdatalen, NULL); | 106 | compr_ret = this->compress(data_in, output_buf, datalen, cdatalen); |
| 107 | spin_lock(&jffs2_compressor_list_lock); | 107 | spin_lock(&jffs2_compressor_list_lock); |
| 108 | this->usecount--; | 108 | this->usecount--; |
| 109 | if (!compr_ret) { | 109 | if (!compr_ret) { |
| @@ -152,7 +152,7 @@ uint16_t jffs2_compress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
| 152 | spin_unlock(&jffs2_compressor_list_lock); | 152 | spin_unlock(&jffs2_compressor_list_lock); |
| 153 | *datalen = orig_slen; | 153 | *datalen = orig_slen; |
| 154 | *cdatalen = orig_dlen; | 154 | *cdatalen = orig_dlen; |
| 155 | compr_ret = this->compress(data_in, this->compr_buf, datalen, cdatalen, NULL); | 155 | compr_ret = this->compress(data_in, this->compr_buf, datalen, cdatalen); |
| 156 | spin_lock(&jffs2_compressor_list_lock); | 156 | spin_lock(&jffs2_compressor_list_lock); |
| 157 | this->usecount--; | 157 | this->usecount--; |
| 158 | if (!compr_ret) { | 158 | if (!compr_ret) { |
| @@ -220,7 +220,7 @@ int jffs2_decompress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
| 220 | if (comprtype == this->compr) { | 220 | if (comprtype == this->compr) { |
| 221 | this->usecount++; | 221 | this->usecount++; |
| 222 | spin_unlock(&jffs2_compressor_list_lock); | 222 | spin_unlock(&jffs2_compressor_list_lock); |
| 223 | ret = this->decompress(cdata_in, data_out, cdatalen, datalen, NULL); | 223 | ret = this->decompress(cdata_in, data_out, cdatalen, datalen); |
| 224 | spin_lock(&jffs2_compressor_list_lock); | 224 | spin_lock(&jffs2_compressor_list_lock); |
| 225 | if (ret) { | 225 | if (ret) { |
| 226 | printk(KERN_WARNING "Decompressor \"%s\" returned %d\n", this->name, ret); | 226 | printk(KERN_WARNING "Decompressor \"%s\" returned %d\n", this->name, ret); |
diff --git a/fs/jffs2/compr.h b/fs/jffs2/compr.h index e471a9106fd9..13bb7597ab39 100644 --- a/fs/jffs2/compr.h +++ b/fs/jffs2/compr.h | |||
| @@ -49,9 +49,9 @@ struct jffs2_compressor { | |||
| 49 | char *name; | 49 | char *name; |
| 50 | char compr; /* JFFS2_COMPR_XXX */ | 50 | char compr; /* JFFS2_COMPR_XXX */ |
| 51 | int (*compress)(unsigned char *data_in, unsigned char *cpage_out, | 51 | int (*compress)(unsigned char *data_in, unsigned char *cpage_out, |
| 52 | uint32_t *srclen, uint32_t *destlen, void *model); | 52 | uint32_t *srclen, uint32_t *destlen); |
| 53 | int (*decompress)(unsigned char *cdata_in, unsigned char *data_out, | 53 | int (*decompress)(unsigned char *cdata_in, unsigned char *data_out, |
| 54 | uint32_t cdatalen, uint32_t datalen, void *model); | 54 | uint32_t cdatalen, uint32_t datalen); |
| 55 | int usecount; | 55 | int usecount; |
| 56 | int disabled; /* if set the compressor won't compress */ | 56 | int disabled; /* if set the compressor won't compress */ |
| 57 | unsigned char *compr_buf; /* used by size compr. mode */ | 57 | unsigned char *compr_buf; /* used by size compr. mode */ |
diff --git a/fs/jffs2/compr_lzo.c b/fs/jffs2/compr_lzo.c index ed25ae7c98eb..af186ee674d8 100644 --- a/fs/jffs2/compr_lzo.c +++ b/fs/jffs2/compr_lzo.c | |||
| @@ -42,7 +42,7 @@ static int __init alloc_workspace(void) | |||
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | static int jffs2_lzo_compress(unsigned char *data_in, unsigned char *cpage_out, | 44 | static int jffs2_lzo_compress(unsigned char *data_in, unsigned char *cpage_out, |
| 45 | uint32_t *sourcelen, uint32_t *dstlen, void *model) | 45 | uint32_t *sourcelen, uint32_t *dstlen) |
| 46 | { | 46 | { |
| 47 | size_t compress_size; | 47 | size_t compress_size; |
| 48 | int ret; | 48 | int ret; |
| @@ -67,7 +67,7 @@ static int jffs2_lzo_compress(unsigned char *data_in, unsigned char *cpage_out, | |||
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static int jffs2_lzo_decompress(unsigned char *data_in, unsigned char *cpage_out, | 69 | static int jffs2_lzo_decompress(unsigned char *data_in, unsigned char *cpage_out, |
| 70 | uint32_t srclen, uint32_t destlen, void *model) | 70 | uint32_t srclen, uint32_t destlen) |
| 71 | { | 71 | { |
| 72 | size_t dl = destlen; | 72 | size_t dl = destlen; |
| 73 | int ret; | 73 | int ret; |
diff --git a/fs/jffs2/compr_rtime.c b/fs/jffs2/compr_rtime.c index 9696ad9ef5f7..16a5047903a6 100644 --- a/fs/jffs2/compr_rtime.c +++ b/fs/jffs2/compr_rtime.c | |||
| @@ -31,8 +31,7 @@ | |||
| 31 | /* _compress returns the compressed size, -1 if bigger */ | 31 | /* _compress returns the compressed size, -1 if bigger */ |
| 32 | static int jffs2_rtime_compress(unsigned char *data_in, | 32 | static int jffs2_rtime_compress(unsigned char *data_in, |
| 33 | unsigned char *cpage_out, | 33 | unsigned char *cpage_out, |
| 34 | uint32_t *sourcelen, uint32_t *dstlen, | 34 | uint32_t *sourcelen, uint32_t *dstlen) |
| 35 | void *model) | ||
| 36 | { | 35 | { |
| 37 | short positions[256]; | 36 | short positions[256]; |
| 38 | int outpos = 0; | 37 | int outpos = 0; |
| @@ -73,8 +72,7 @@ static int jffs2_rtime_compress(unsigned char *data_in, | |||
| 73 | 72 | ||
| 74 | static int jffs2_rtime_decompress(unsigned char *data_in, | 73 | static int jffs2_rtime_decompress(unsigned char *data_in, |
| 75 | unsigned char *cpage_out, | 74 | unsigned char *cpage_out, |
| 76 | uint32_t srclen, uint32_t destlen, | 75 | uint32_t srclen, uint32_t destlen) |
| 77 | void *model) | ||
| 78 | { | 76 | { |
| 79 | short positions[256]; | 77 | short positions[256]; |
| 80 | int outpos = 0; | 78 | int outpos = 0; |
diff --git a/fs/jffs2/compr_rubin.c b/fs/jffs2/compr_rubin.c index a12b4f763373..9e7cec808c4c 100644 --- a/fs/jffs2/compr_rubin.c +++ b/fs/jffs2/compr_rubin.c | |||
| @@ -298,7 +298,7 @@ static int rubin_do_compress(int bit_divider, int *bits, unsigned char *data_in, | |||
| 298 | #if 0 | 298 | #if 0 |
| 299 | /* _compress returns the compressed size, -1 if bigger */ | 299 | /* _compress returns the compressed size, -1 if bigger */ |
| 300 | int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, | 300 | int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, |
| 301 | uint32_t *sourcelen, uint32_t *dstlen, void *model) | 301 | uint32_t *sourcelen, uint32_t *dstlen) |
| 302 | { | 302 | { |
| 303 | return rubin_do_compress(BIT_DIVIDER_MIPS, bits_mips, data_in, | 303 | return rubin_do_compress(BIT_DIVIDER_MIPS, bits_mips, data_in, |
| 304 | cpage_out, sourcelen, dstlen); | 304 | cpage_out, sourcelen, dstlen); |
| @@ -306,8 +306,7 @@ int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, | |||
| 306 | #endif | 306 | #endif |
| 307 | static int jffs2_dynrubin_compress(unsigned char *data_in, | 307 | static int jffs2_dynrubin_compress(unsigned char *data_in, |
| 308 | unsigned char *cpage_out, | 308 | unsigned char *cpage_out, |
| 309 | uint32_t *sourcelen, uint32_t *dstlen, | 309 | uint32_t *sourcelen, uint32_t *dstlen) |
| 310 | void *model) | ||
| 311 | { | 310 | { |
| 312 | int bits[8]; | 311 | int bits[8]; |
| 313 | unsigned char histo[256]; | 312 | unsigned char histo[256]; |
| @@ -387,8 +386,7 @@ static void rubin_do_decompress(int bit_divider, int *bits, | |||
| 387 | 386 | ||
| 388 | static int jffs2_rubinmips_decompress(unsigned char *data_in, | 387 | static int jffs2_rubinmips_decompress(unsigned char *data_in, |
| 389 | unsigned char *cpage_out, | 388 | unsigned char *cpage_out, |
| 390 | uint32_t sourcelen, uint32_t dstlen, | 389 | uint32_t sourcelen, uint32_t dstlen) |
| 391 | void *model) | ||
| 392 | { | 390 | { |
| 393 | rubin_do_decompress(BIT_DIVIDER_MIPS, bits_mips, data_in, | 391 | rubin_do_decompress(BIT_DIVIDER_MIPS, bits_mips, data_in, |
| 394 | cpage_out, sourcelen, dstlen); | 392 | cpage_out, sourcelen, dstlen); |
| @@ -397,8 +395,7 @@ static int jffs2_rubinmips_decompress(unsigned char *data_in, | |||
| 397 | 395 | ||
| 398 | static int jffs2_dynrubin_decompress(unsigned char *data_in, | 396 | static int jffs2_dynrubin_decompress(unsigned char *data_in, |
| 399 | unsigned char *cpage_out, | 397 | unsigned char *cpage_out, |
| 400 | uint32_t sourcelen, uint32_t dstlen, | 398 | uint32_t sourcelen, uint32_t dstlen) |
| 401 | void *model) | ||
| 402 | { | 399 | { |
| 403 | int bits[8]; | 400 | int bits[8]; |
| 404 | int c; | 401 | int c; |
diff --git a/fs/jffs2/compr_zlib.c b/fs/jffs2/compr_zlib.c index 97fc45de6f81..fd05a0b9431d 100644 --- a/fs/jffs2/compr_zlib.c +++ b/fs/jffs2/compr_zlib.c | |||
| @@ -68,8 +68,7 @@ static void free_workspaces(void) | |||
| 68 | 68 | ||
| 69 | static int jffs2_zlib_compress(unsigned char *data_in, | 69 | static int jffs2_zlib_compress(unsigned char *data_in, |
| 70 | unsigned char *cpage_out, | 70 | unsigned char *cpage_out, |
| 71 | uint32_t *sourcelen, uint32_t *dstlen, | 71 | uint32_t *sourcelen, uint32_t *dstlen) |
| 72 | void *model) | ||
| 73 | { | 72 | { |
| 74 | int ret; | 73 | int ret; |
| 75 | 74 | ||
| @@ -136,8 +135,7 @@ static int jffs2_zlib_compress(unsigned char *data_in, | |||
| 136 | 135 | ||
| 137 | static int jffs2_zlib_decompress(unsigned char *data_in, | 136 | static int jffs2_zlib_decompress(unsigned char *data_in, |
| 138 | unsigned char *cpage_out, | 137 | unsigned char *cpage_out, |
| 139 | uint32_t srclen, uint32_t destlen, | 138 | uint32_t srclen, uint32_t destlen) |
| 140 | void *model) | ||
| 141 | { | 139 | { |
| 142 | int ret; | 140 | int ret; |
| 143 | int wbits = MAX_WBITS; | 141 | int wbits = MAX_WBITS; |
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 79121aa5858b..92978658ed18 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c | |||
| @@ -367,7 +367,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | /* We use f->target field to store the target path. */ | 369 | /* We use f->target field to store the target path. */ |
| 370 | f->target = kmalloc(targetlen + 1, GFP_KERNEL); | 370 | f->target = kmemdup(target, targetlen + 1, GFP_KERNEL); |
| 371 | if (!f->target) { | 371 | if (!f->target) { |
| 372 | printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1); | 372 | printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1); |
| 373 | mutex_unlock(&f->sem); | 373 | mutex_unlock(&f->sem); |
| @@ -376,7 +376,6 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char | |||
| 376 | goto fail; | 376 | goto fail; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | memcpy(f->target, target, targetlen + 1); | ||
| 380 | D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target)); | 379 | D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target)); |
| 381 | 380 | ||
| 382 | /* No data here. Only a metadata node, which will be | 381 | /* No data here. Only a metadata node, which will be |
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index abac961f617b..e513f1913c15 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c | |||
| @@ -151,7 +151,7 @@ int jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count) | |||
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* Be nice */ | 153 | /* Be nice */ |
| 154 | yield(); | 154 | cond_resched(); |
| 155 | mutex_lock(&c->erase_free_sem); | 155 | mutex_lock(&c->erase_free_sem); |
| 156 | spin_lock(&c->erase_completion_lock); | 156 | spin_lock(&c->erase_completion_lock); |
| 157 | } | 157 | } |
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index d9beb06e6fca..e896e67767eb 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
| @@ -474,6 +474,25 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i | |||
| 474 | return inode; | 474 | return inode; |
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | static int calculate_inocache_hashsize(uint32_t flash_size) | ||
| 478 | { | ||
| 479 | /* | ||
| 480 | * Pick a inocache hash size based on the size of the medium. | ||
| 481 | * Count how many megabytes we're dealing with, apply a hashsize twice | ||
| 482 | * that size, but rounding down to the usual big powers of 2. And keep | ||
| 483 | * to sensible bounds. | ||
| 484 | */ | ||
| 485 | |||
| 486 | int size_mb = flash_size / 1024 / 1024; | ||
| 487 | int hashsize = (size_mb * 2) & ~0x3f; | ||
| 488 | |||
| 489 | if (hashsize < INOCACHE_HASHSIZE_MIN) | ||
| 490 | return INOCACHE_HASHSIZE_MIN; | ||
| 491 | if (hashsize > INOCACHE_HASHSIZE_MAX) | ||
| 492 | return INOCACHE_HASHSIZE_MAX; | ||
| 493 | |||
| 494 | return hashsize; | ||
| 495 | } | ||
| 477 | 496 | ||
| 478 | int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) | 497 | int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) |
| 479 | { | 498 | { |
| @@ -520,7 +539,8 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) | |||
| 520 | if (ret) | 539 | if (ret) |
| 521 | return ret; | 540 | return ret; |
| 522 | 541 | ||
| 523 | c->inocache_list = kcalloc(INOCACHE_HASHSIZE, sizeof(struct jffs2_inode_cache *), GFP_KERNEL); | 542 | c->inocache_hashsize = calculate_inocache_hashsize(c->flash_size); |
| 543 | c->inocache_list = kcalloc(c->inocache_hashsize, sizeof(struct jffs2_inode_cache *), GFP_KERNEL); | ||
| 524 | if (!c->inocache_list) { | 544 | if (!c->inocache_list) { |
| 525 | ret = -ENOMEM; | 545 | ret = -ENOMEM; |
| 526 | goto out_wbuf; | 546 | goto out_wbuf; |
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index 846a79452497..31dce611337c 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c | |||
| @@ -219,13 +219,14 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
| 219 | if (!list_empty(&c->erase_complete_list) || | 219 | if (!list_empty(&c->erase_complete_list) || |
| 220 | !list_empty(&c->erase_pending_list)) { | 220 | !list_empty(&c->erase_pending_list)) { |
| 221 | spin_unlock(&c->erase_completion_lock); | 221 | spin_unlock(&c->erase_completion_lock); |
| 222 | mutex_unlock(&c->alloc_sem); | ||
| 222 | D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() erasing pending blocks\n")); | 223 | D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() erasing pending blocks\n")); |
| 223 | if (jffs2_erase_pending_blocks(c, 1)) { | 224 | if (jffs2_erase_pending_blocks(c, 1)) |
| 224 | mutex_unlock(&c->alloc_sem); | ||
| 225 | return 0; | 225 | return 0; |
| 226 | } | 226 | |
| 227 | D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n")); | 227 | D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n")); |
| 228 | spin_lock(&c->erase_completion_lock); | 228 | spin_lock(&c->erase_completion_lock); |
| 229 | mutex_lock(&c->alloc_sem); | ||
| 229 | } | 230 | } |
| 230 | 231 | ||
| 231 | /* First, work out which block we're garbage-collecting */ | 232 | /* First, work out which block we're garbage-collecting */ |
diff --git a/fs/jffs2/jffs2_fs_sb.h b/fs/jffs2/jffs2_fs_sb.h index 6784bc89add1..f864005de64c 100644 --- a/fs/jffs2/jffs2_fs_sb.h +++ b/fs/jffs2/jffs2_fs_sb.h | |||
| @@ -100,6 +100,7 @@ struct jffs2_sb_info { | |||
| 100 | wait_queue_head_t erase_wait; /* For waiting for erases to complete */ | 100 | wait_queue_head_t erase_wait; /* For waiting for erases to complete */ |
| 101 | 101 | ||
| 102 | wait_queue_head_t inocache_wq; | 102 | wait_queue_head_t inocache_wq; |
| 103 | int inocache_hashsize; | ||
| 103 | struct jffs2_inode_cache **inocache_list; | 104 | struct jffs2_inode_cache **inocache_list; |
| 104 | spinlock_t inocache_lock; | 105 | spinlock_t inocache_lock; |
| 105 | 106 | ||
diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c index af02bd138469..5e03233c2363 100644 --- a/fs/jffs2/nodelist.c +++ b/fs/jffs2/nodelist.c | |||
| @@ -420,7 +420,7 @@ struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t | |||
| 420 | { | 420 | { |
| 421 | struct jffs2_inode_cache *ret; | 421 | struct jffs2_inode_cache *ret; |
| 422 | 422 | ||
| 423 | ret = c->inocache_list[ino % INOCACHE_HASHSIZE]; | 423 | ret = c->inocache_list[ino % c->inocache_hashsize]; |
| 424 | while (ret && ret->ino < ino) { | 424 | while (ret && ret->ino < ino) { |
| 425 | ret = ret->next; | 425 | ret = ret->next; |
| 426 | } | 426 | } |
| @@ -441,7 +441,7 @@ void jffs2_add_ino_cache (struct jffs2_sb_info *c, struct jffs2_inode_cache *new | |||
| 441 | 441 | ||
| 442 | dbg_inocache("add %p (ino #%u)\n", new, new->ino); | 442 | dbg_inocache("add %p (ino #%u)\n", new, new->ino); |
| 443 | 443 | ||
| 444 | prev = &c->inocache_list[new->ino % INOCACHE_HASHSIZE]; | 444 | prev = &c->inocache_list[new->ino % c->inocache_hashsize]; |
| 445 | 445 | ||
| 446 | while ((*prev) && (*prev)->ino < new->ino) { | 446 | while ((*prev) && (*prev)->ino < new->ino) { |
| 447 | prev = &(*prev)->next; | 447 | prev = &(*prev)->next; |
| @@ -462,7 +462,7 @@ void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old) | |||
| 462 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); | 462 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); |
| 463 | spin_lock(&c->inocache_lock); | 463 | spin_lock(&c->inocache_lock); |
| 464 | 464 | ||
| 465 | prev = &c->inocache_list[old->ino % INOCACHE_HASHSIZE]; | 465 | prev = &c->inocache_list[old->ino % c->inocache_hashsize]; |
| 466 | 466 | ||
| 467 | while ((*prev) && (*prev)->ino < old->ino) { | 467 | while ((*prev) && (*prev)->ino < old->ino) { |
| 468 | prev = &(*prev)->next; | 468 | prev = &(*prev)->next; |
| @@ -487,7 +487,7 @@ void jffs2_free_ino_caches(struct jffs2_sb_info *c) | |||
| 487 | int i; | 487 | int i; |
| 488 | struct jffs2_inode_cache *this, *next; | 488 | struct jffs2_inode_cache *this, *next; |
| 489 | 489 | ||
| 490 | for (i=0; i<INOCACHE_HASHSIZE; i++) { | 490 | for (i=0; i < c->inocache_hashsize; i++) { |
| 491 | this = c->inocache_list[i]; | 491 | this = c->inocache_list[i]; |
| 492 | while (this) { | 492 | while (this) { |
| 493 | next = this->next; | 493 | next = this->next; |
diff --git a/fs/jffs2/nodelist.h b/fs/jffs2/nodelist.h index 523a91691052..5a53d9bdb2b5 100644 --- a/fs/jffs2/nodelist.h +++ b/fs/jffs2/nodelist.h | |||
| @@ -199,7 +199,8 @@ struct jffs2_inode_cache { | |||
| 199 | #define RAWNODE_CLASS_XATTR_DATUM 1 | 199 | #define RAWNODE_CLASS_XATTR_DATUM 1 |
| 200 | #define RAWNODE_CLASS_XATTR_REF 2 | 200 | #define RAWNODE_CLASS_XATTR_REF 2 |
| 201 | 201 | ||
| 202 | #define INOCACHE_HASHSIZE 128 | 202 | #define INOCACHE_HASHSIZE_MIN 128 |
| 203 | #define INOCACHE_HASHSIZE_MAX 1024 | ||
| 203 | 204 | ||
| 204 | #define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size) | 205 | #define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size) |
| 205 | 206 | ||
diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index 46f870d1cc36..b632dddcb482 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include "summary.h" | 20 | #include "summary.h" |
| 21 | #include "debug.h" | 21 | #include "debug.h" |
| 22 | 22 | ||
| 23 | #define DEFAULT_EMPTY_SCAN_SIZE 1024 | 23 | #define DEFAULT_EMPTY_SCAN_SIZE 256 |
| 24 | 24 | ||
| 25 | #define noisy_printk(noise, args...) do { \ | 25 | #define noisy_printk(noise, args...) do { \ |
| 26 | if (*(noise)) { \ | 26 | if (*(noise)) { \ |
| @@ -435,7 +435,7 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo | |||
| 435 | unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s) { | 435 | unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s) { |
| 436 | struct jffs2_unknown_node *node; | 436 | struct jffs2_unknown_node *node; |
| 437 | struct jffs2_unknown_node crcnode; | 437 | struct jffs2_unknown_node crcnode; |
| 438 | uint32_t ofs, prevofs; | 438 | uint32_t ofs, prevofs, max_ofs; |
| 439 | uint32_t hdr_crc, buf_ofs, buf_len; | 439 | uint32_t hdr_crc, buf_ofs, buf_len; |
| 440 | int err; | 440 | int err; |
| 441 | int noise = 0; | 441 | int noise = 0; |
| @@ -550,12 +550,12 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo | |||
| 550 | 550 | ||
| 551 | /* We temporarily use 'ofs' as a pointer into the buffer/jeb */ | 551 | /* We temporarily use 'ofs' as a pointer into the buffer/jeb */ |
| 552 | ofs = 0; | 552 | ofs = 0; |
| 553 | 553 | max_ofs = EMPTY_SCAN_SIZE(c->sector_size); | |
| 554 | /* Scan only 4KiB of 0xFF before declaring it's empty */ | 554 | /* Scan only EMPTY_SCAN_SIZE of 0xFF before declaring it's empty */ |
| 555 | while(ofs < EMPTY_SCAN_SIZE(c->sector_size) && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF) | 555 | while(ofs < max_ofs && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF) |
| 556 | ofs += 4; | 556 | ofs += 4; |
| 557 | 557 | ||
| 558 | if (ofs == EMPTY_SCAN_SIZE(c->sector_size)) { | 558 | if (ofs == max_ofs) { |
| 559 | #ifdef CONFIG_JFFS2_FS_WRITEBUFFER | 559 | #ifdef CONFIG_JFFS2_FS_WRITEBUFFER |
| 560 | if (jffs2_cleanmarker_oob(c)) { | 560 | if (jffs2_cleanmarker_oob(c)) { |
| 561 | /* scan oob, take care of cleanmarker */ | 561 | /* scan oob, take care of cleanmarker */ |
