aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/wbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jffs2/wbuf.c')
-rw-r--r--fs/jffs2/wbuf.c128
1 files changed, 64 insertions, 64 deletions
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 44d8a894a41b..242cd53a970c 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -188,7 +188,7 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
188 /* Find the first node to be recovered, by skipping over every 188 /* Find the first node to be recovered, by skipping over every
189 node which ends before the wbuf starts, or which is obsolete. */ 189 node which ends before the wbuf starts, or which is obsolete. */
190 first_raw = &jeb->first_node; 190 first_raw = &jeb->first_node;
191 while (*first_raw && 191 while (*first_raw &&
192 (ref_obsolete(*first_raw) || 192 (ref_obsolete(*first_raw) ||
193 (ref_offset(*first_raw)+ref_totlen(c, jeb, *first_raw)) < c->wbuf_ofs)) { 193 (ref_offset(*first_raw)+ref_totlen(c, jeb, *first_raw)) < c->wbuf_ofs)) {
194 D1(printk(KERN_DEBUG "Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n", 194 D1(printk(KERN_DEBUG "Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n",
@@ -237,7 +237,7 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
237 ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo); 237 ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo);
238 else 238 else
239 ret = c->mtd->read(c->mtd, start, c->wbuf_ofs - start, &retlen, buf); 239 ret = c->mtd->read(c->mtd, start, c->wbuf_ofs - start, &retlen, buf);
240 240
241 if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) { 241 if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) {
242 /* ECC recovered */ 242 /* ECC recovered */
243 ret = 0; 243 ret = 0;
@@ -274,15 +274,15 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
274 if (end-start >= c->wbuf_pagesize) { 274 if (end-start >= c->wbuf_pagesize) {
275 /* Need to do another write immediately, but it's possible 275 /* Need to do another write immediately, but it's possible
276 that this is just because the wbuf itself is completely 276 that this is just because the wbuf itself is completely
277 full, and there's nothing earlier read back from the 277 full, and there's nothing earlier read back from the
278 flash. Hence 'buf' isn't necessarily what we're writing 278 flash. Hence 'buf' isn't necessarily what we're writing
279 from. */ 279 from. */
280 unsigned char *rewrite_buf = buf?:c->wbuf; 280 unsigned char *rewrite_buf = buf?:c->wbuf;
281 uint32_t towrite = (end-start) - ((end-start)%c->wbuf_pagesize); 281 uint32_t towrite = (end-start) - ((end-start)%c->wbuf_pagesize);
282 282
283 D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n", 283 D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n",
284 towrite, ofs)); 284 towrite, ofs));
285 285
286#ifdef BREAKMEHEADER 286#ifdef BREAKMEHEADER
287 static int breakme; 287 static int breakme;
288 if (breakme++ == 20) { 288 if (breakme++ == 20) {
@@ -434,7 +434,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
434 this happens, if we have a change to a new block, 434 this happens, if we have a change to a new block,
435 or if fsync forces us to flush the writebuffer. 435 or if fsync forces us to flush the writebuffer.
436 if we have a switch to next page, we will not have 436 if we have a switch to next page, we will not have
437 enough remaining space for this. 437 enough remaining space for this.
438 */ 438 */
439 if (pad ) { 439 if (pad ) {
440 c->wbuf_len = PAD(c->wbuf_len); 440 c->wbuf_len = PAD(c->wbuf_len);
@@ -442,7 +442,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
442 /* Pad with JFFS2_DIRTY_BITMASK initially. this helps out ECC'd NOR 442 /* Pad with JFFS2_DIRTY_BITMASK initially. this helps out ECC'd NOR
443 with 8 byte page size */ 443 with 8 byte page size */
444 memset(c->wbuf + c->wbuf_len, 0, c->wbuf_pagesize - c->wbuf_len); 444 memset(c->wbuf + c->wbuf_len, 0, c->wbuf_pagesize - c->wbuf_len);
445 445
446 if ( c->wbuf_len + sizeof(struct jffs2_unknown_node) < c->wbuf_pagesize) { 446 if ( c->wbuf_len + sizeof(struct jffs2_unknown_node) < c->wbuf_pagesize) {
447 struct jffs2_unknown_node *padnode = (void *)(c->wbuf + c->wbuf_len); 447 struct jffs2_unknown_node *padnode = (void *)(c->wbuf + c->wbuf_len);
448 padnode->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 448 padnode->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
@@ -453,7 +453,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
453 } 453 }
454 /* else jffs2_flash_writev has actually filled in the rest of the 454 /* else jffs2_flash_writev has actually filled in the rest of the
455 buffer for us, and will deal with the node refs etc. later. */ 455 buffer for us, and will deal with the node refs etc. later. */
456 456
457#ifdef BREAKME 457#ifdef BREAKME
458 static int breakme; 458 static int breakme;
459 if (breakme++ == 20) { 459 if (breakme++ == 20) {
@@ -462,9 +462,9 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
462 c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, 462 c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize,
463 &retlen, brokenbuf, NULL, c->oobinfo); 463 &retlen, brokenbuf, NULL, c->oobinfo);
464 ret = -EIO; 464 ret = -EIO;
465 } else 465 } else
466#endif 466#endif
467 467
468 if (jffs2_cleanmarker_oob(c)) 468 if (jffs2_cleanmarker_oob(c))
469 ret = c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf, NULL, c->oobinfo); 469 ret = c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf, NULL, c->oobinfo);
470 else 470 else
@@ -485,7 +485,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
485 } 485 }
486 486
487 spin_lock(&c->erase_completion_lock); 487 spin_lock(&c->erase_completion_lock);
488 488
489 /* Adjust free size of the block if we padded. */ 489 /* Adjust free size of the block if we padded. */
490 if (pad) { 490 if (pad) {
491 struct jffs2_eraseblock *jeb; 491 struct jffs2_eraseblock *jeb;
@@ -495,7 +495,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
495 D1(printk(KERN_DEBUG "jffs2_flush_wbuf() adjusting free_size of %sblock at %08x\n", 495 D1(printk(KERN_DEBUG "jffs2_flush_wbuf() adjusting free_size of %sblock at %08x\n",
496 (jeb==c->nextblock)?"next":"", jeb->offset)); 496 (jeb==c->nextblock)?"next":"", jeb->offset));
497 497
498 /* wbuf_pagesize - wbuf_len is the amount of space that's to be 498 /* wbuf_pagesize - wbuf_len is the amount of space that's to be
499 padded. If there is less free space in the block than that, 499 padded. If there is less free space in the block than that,
500 something screwed up */ 500 something screwed up */
501 if (jeb->free_size < (c->wbuf_pagesize - c->wbuf_len)) { 501 if (jeb->free_size < (c->wbuf_pagesize - c->wbuf_len)) {
@@ -523,9 +523,9 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
523 return 0; 523 return 0;
524} 524}
525 525
526/* Trigger garbage collection to flush the write-buffer. 526/* Trigger garbage collection to flush the write-buffer.
527 If ino arg is zero, do it if _any_ real (i.e. not GC) writes are 527 If ino arg is zero, do it if _any_ real (i.e. not GC) writes are
528 outstanding. If ino arg non-zero, do it only if a write for the 528 outstanding. If ino arg non-zero, do it only if a write for the
529 given inode is outstanding. */ 529 given inode is outstanding. */
530int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino) 530int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino)
531{ 531{
@@ -620,13 +620,13 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
620 /* If not NAND flash, don't bother */ 620 /* If not NAND flash, don't bother */
621 if (!jffs2_is_writebuffered(c)) 621 if (!jffs2_is_writebuffered(c))
622 return jffs2_flash_direct_writev(c, invecs, count, to, retlen); 622 return jffs2_flash_direct_writev(c, invecs, count, to, retlen);
623 623
624 down_write(&c->wbuf_sem); 624 down_write(&c->wbuf_sem);
625 625
626 /* If wbuf_ofs is not initialized, set it to target address */ 626 /* If wbuf_ofs is not initialized, set it to target address */
627 if (c->wbuf_ofs == 0xFFFFFFFF) { 627 if (c->wbuf_ofs == 0xFFFFFFFF) {
628 c->wbuf_ofs = PAGE_DIV(to); 628 c->wbuf_ofs = PAGE_DIV(to);
629 c->wbuf_len = PAGE_MOD(to); 629 c->wbuf_len = PAGE_MOD(to);
630 memset(c->wbuf,0xff,c->wbuf_pagesize); 630 memset(c->wbuf,0xff,c->wbuf_pagesize);
631 } 631 }
632 632
@@ -640,10 +640,10 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
640 memset(c->wbuf,0xff,c->wbuf_pagesize); 640 memset(c->wbuf,0xff,c->wbuf_pagesize);
641 } 641 }
642 } 642 }
643 643
644 /* Sanity checks on target address. 644 /* Sanity checks on target address.
645 It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), 645 It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs),
646 and it's permitted to write at the beginning of a new 646 and it's permitted to write at the beginning of a new
647 erase block. Anything else, and you die. 647 erase block. Anything else, and you die.
648 New block starts at xxx000c (0-b = block header) 648 New block starts at xxx000c (0-b = block header)
649 */ 649 */
@@ -661,8 +661,8 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
661 } 661 }
662 /* set pointer to new block */ 662 /* set pointer to new block */
663 c->wbuf_ofs = PAGE_DIV(to); 663 c->wbuf_ofs = PAGE_DIV(to);
664 c->wbuf_len = PAGE_MOD(to); 664 c->wbuf_len = PAGE_MOD(to);
665 } 665 }
666 666
667 if (to != PAD(c->wbuf_ofs + c->wbuf_len)) { 667 if (to != PAD(c->wbuf_ofs + c->wbuf_len)) {
668 /* We're not writing immediately after the writebuffer. Bad. */ 668 /* We're not writing immediately after the writebuffer. Bad. */
@@ -682,21 +682,21 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
682 invec = 0; 682 invec = 0;
683 outvec = 0; 683 outvec = 0;
684 684
685 /* Fill writebuffer first, if already in use */ 685 /* Fill writebuffer first, if already in use */
686 if (c->wbuf_len) { 686 if (c->wbuf_len) {
687 uint32_t invec_ofs = 0; 687 uint32_t invec_ofs = 0;
688 688
689 /* adjust alignment offset */ 689 /* adjust alignment offset */
690 if (c->wbuf_len != PAGE_MOD(to)) { 690 if (c->wbuf_len != PAGE_MOD(to)) {
691 c->wbuf_len = PAGE_MOD(to); 691 c->wbuf_len = PAGE_MOD(to);
692 /* take care of alignment to next page */ 692 /* take care of alignment to next page */
693 if (!c->wbuf_len) 693 if (!c->wbuf_len)
694 c->wbuf_len = c->wbuf_pagesize; 694 c->wbuf_len = c->wbuf_pagesize;
695 } 695 }
696 696
697 while(c->wbuf_len < c->wbuf_pagesize) { 697 while(c->wbuf_len < c->wbuf_pagesize) {
698 uint32_t thislen; 698 uint32_t thislen;
699 699
700 if (invec == count) 700 if (invec == count)
701 goto alldone; 701 goto alldone;
702 702
@@ -704,17 +704,17 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
704 704
705 if (thislen >= invecs[invec].iov_len) 705 if (thislen >= invecs[invec].iov_len)
706 thislen = invecs[invec].iov_len; 706 thislen = invecs[invec].iov_len;
707 707
708 invec_ofs = thislen; 708 invec_ofs = thislen;
709 709
710 memcpy(c->wbuf + c->wbuf_len, invecs[invec].iov_base, thislen); 710 memcpy(c->wbuf + c->wbuf_len, invecs[invec].iov_base, thislen);
711 c->wbuf_len += thislen; 711 c->wbuf_len += thislen;
712 donelen += thislen; 712 donelen += thislen;
713 /* Get next invec, if actual did not fill the buffer */ 713 /* Get next invec, if actual did not fill the buffer */
714 if (c->wbuf_len < c->wbuf_pagesize) 714 if (c->wbuf_len < c->wbuf_pagesize)
715 invec++; 715 invec++;
716 } 716 }
717 717
718 /* write buffer is full, flush buffer */ 718 /* write buffer is full, flush buffer */
719 ret = __jffs2_flush_wbuf(c, NOPAD); 719 ret = __jffs2_flush_wbuf(c, NOPAD);
720 if (ret) { 720 if (ret) {
@@ -773,10 +773,10 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
773 773
774 /* We did cross a page boundary, so we write some now */ 774 /* We did cross a page boundary, so we write some now */
775 if (jffs2_cleanmarker_oob(c)) 775 if (jffs2_cleanmarker_oob(c))
776 ret = c->mtd->writev_ecc(c->mtd, outvecs, splitvec+1, outvec_to, &wbuf_retlen, NULL, c->oobinfo); 776 ret = c->mtd->writev_ecc(c->mtd, outvecs, splitvec+1, outvec_to, &wbuf_retlen, NULL, c->oobinfo);
777 else 777 else
778 ret = jffs2_flash_direct_writev(c, outvecs, splitvec+1, outvec_to, &wbuf_retlen); 778 ret = jffs2_flash_direct_writev(c, outvecs, splitvec+1, outvec_to, &wbuf_retlen);
779 779
780 if (ret < 0 || wbuf_retlen != PAGE_DIV(totlen)) { 780 if (ret < 0 || wbuf_retlen != PAGE_DIV(totlen)) {
781 /* At this point we have no problem, 781 /* At this point we have no problem,
782 c->wbuf is empty. However refile nextblock to avoid 782 c->wbuf is empty. However refile nextblock to avoid
@@ -793,7 +793,7 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig
793 spin_unlock(&c->erase_completion_lock); 793 spin_unlock(&c->erase_completion_lock);
794 goto exit; 794 goto exit;
795 } 795 }
796 796
797 donelen += wbuf_retlen; 797 donelen += wbuf_retlen;
798 c->wbuf_ofs = PAGE_DIV(outvec_to) + PAGE_DIV(totlen); 798 c->wbuf_ofs = PAGE_DIV(outvec_to) + PAGE_DIV(totlen);
799 799
@@ -837,7 +837,7 @@ alldone:
837 jffs2_wbuf_dirties_inode(c, ino); 837 jffs2_wbuf_dirties_inode(c, ino);
838 838
839 ret = 0; 839 ret = 0;
840 840
841exit: 841exit:
842 up_write(&c->wbuf_sem); 842 up_write(&c->wbuf_sem);
843 return ret; 843 return ret;
@@ -880,18 +880,18 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re
880 if ( (ret == -EBADMSG) && (*retlen == len) ) { 880 if ( (ret == -EBADMSG) && (*retlen == len) ) {
881 printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx) returned ECC error\n", 881 printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx) returned ECC error\n",
882 len, ofs); 882 len, ofs);
883 /* 883 /*
884 * We have the raw data without ECC correction in the buffer, maybe 884 * We have the raw data without ECC correction in the buffer, maybe
885 * we are lucky and all data or parts are correct. We check the node. 885 * we are lucky and all data or parts are correct. We check the node.
886 * If data are corrupted node check will sort it out. 886 * If data are corrupted node check will sort it out.
887 * We keep this block, it will fail on write or erase and the we 887 * We keep this block, it will fail on write or erase and the we
888 * mark it bad. Or should we do that now? But we should give him a chance. 888 * mark it bad. Or should we do that now? But we should give him a chance.
889 * Maybe we had a system crash or power loss before the ecc write or 889 * Maybe we had a system crash or power loss before the ecc write or
890 * a erase was completed. 890 * a erase was completed.
891 * So we return success. :) 891 * So we return success. :)
892 */ 892 */
893 ret = 0; 893 ret = 0;
894 } 894 }
895 895
896 /* if no writebuffer available or write buffer empty, return */ 896 /* if no writebuffer available or write buffer empty, return */
897 if (!c->wbuf_pagesize || !c->wbuf_len) 897 if (!c->wbuf_pagesize || !c->wbuf_len)
@@ -906,16 +906,16 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re
906 if (owbf > c->wbuf_len) /* is read beyond write buffer ? */ 906 if (owbf > c->wbuf_len) /* is read beyond write buffer ? */
907 goto exit; 907 goto exit;
908 lwbf = c->wbuf_len - owbf; /* number of bytes to copy */ 908 lwbf = c->wbuf_len - owbf; /* number of bytes to copy */
909 if (lwbf > len) 909 if (lwbf > len)
910 lwbf = len; 910 lwbf = len;
911 } else { 911 } else {
912 orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ 912 orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */
913 if (orbf > len) /* is write beyond write buffer ? */ 913 if (orbf > len) /* is write beyond write buffer ? */
914 goto exit; 914 goto exit;
915 lwbf = len - orbf; /* number of bytes to copy */ 915 lwbf = len - orbf; /* number of bytes to copy */
916 if (lwbf > c->wbuf_len) 916 if (lwbf > c->wbuf_len)
917 lwbf = c->wbuf_len; 917 lwbf = c->wbuf_len;
918 } 918 }
919 if (lwbf > 0) 919 if (lwbf > 0)
920 memcpy(buf+orbf,c->wbuf+owbf,lwbf); 920 memcpy(buf+orbf,c->wbuf+owbf,lwbf);
921 921
@@ -943,7 +943,7 @@ int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
943 printk(KERN_NOTICE "jffs2_check_oob_empty(): allocation of temporary data buffer for oob check failed\n"); 943 printk(KERN_NOTICE "jffs2_check_oob_empty(): allocation of temporary data buffer for oob check failed\n");
944 return -ENOMEM; 944 return -ENOMEM;
945 } 945 }
946 /* 946 /*
947 * if mode = 0, we scan for a total empty oob area, else we have 947 * if mode = 0, we scan for a total empty oob area, else we have
948 * to take care of the cleanmarker in the first page of the block 948 * to take care of the cleanmarker in the first page of the block
949 */ 949 */
@@ -952,41 +952,41 @@ int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
952 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); 952 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset));
953 goto out; 953 goto out;
954 } 954 }
955 955
956 if (retlen < len) { 956 if (retlen < len) {
957 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read " 957 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read "
958 "(%zd bytes not %d) for block at %08x\n", retlen, len, jeb->offset)); 958 "(%zd bytes not %d) for block at %08x\n", retlen, len, jeb->offset));
959 ret = -EIO; 959 ret = -EIO;
960 goto out; 960 goto out;
961 } 961 }
962 962
963 /* Special check for first page */ 963 /* Special check for first page */
964 for(i = 0; i < oob_size ; i++) { 964 for(i = 0; i < oob_size ; i++) {
965 /* Yeah, we know about the cleanmarker. */ 965 /* Yeah, we know about the cleanmarker. */
966 if (mode && i >= c->fsdata_pos && 966 if (mode && i >= c->fsdata_pos &&
967 i < c->fsdata_pos + c->fsdata_len) 967 i < c->fsdata_pos + c->fsdata_len)
968 continue; 968 continue;
969 969
970 if (buf[i] != 0xFF) { 970 if (buf[i] != 0xFF) {
971 D2(printk(KERN_DEBUG "Found %02x at %x in OOB for %08x\n", 971 D2(printk(KERN_DEBUG "Found %02x at %x in OOB for %08x\n",
972 buf[i], i, jeb->offset)); 972 buf[i], i, jeb->offset));
973 ret = 1; 973 ret = 1;
974 goto out; 974 goto out;
975 } 975 }
976 } 976 }
977 977
978 /* we know, we are aligned :) */ 978 /* we know, we are aligned :) */
979 for (page = oob_size; page < len; page += sizeof(long)) { 979 for (page = oob_size; page < len; page += sizeof(long)) {
980 unsigned long dat = *(unsigned long *)(&buf[page]); 980 unsigned long dat = *(unsigned long *)(&buf[page]);
981 if(dat != -1) { 981 if(dat != -1) {
982 ret = 1; 982 ret = 1;
983 goto out; 983 goto out;
984 } 984 }
985 } 985 }
986 986
987out: 987out:
988 kfree(buf); 988 kfree(buf);
989 989
990 return ret; 990 return ret;
991} 991}
992 992
@@ -1068,7 +1068,7 @@ int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_erasebloc
1068 n.totlen = cpu_to_je32(8); 1068 n.totlen = cpu_to_je32(8);
1069 1069
1070 ret = jffs2_flash_write_oob(c, jeb->offset + c->fsdata_pos, c->fsdata_len, &retlen, (unsigned char *)&n); 1070 ret = jffs2_flash_write_oob(c, jeb->offset + c->fsdata_pos, c->fsdata_len, &retlen, (unsigned char *)&n);
1071 1071
1072 if (ret) { 1072 if (ret) {
1073 D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Write failed for block at %08x: error %d\n", jeb->offset, ret)); 1073 D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Write failed for block at %08x: error %d\n", jeb->offset, ret));
1074 return ret; 1074 return ret;
@@ -1080,7 +1080,7 @@ int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_erasebloc
1080 return 0; 1080 return 0;
1081} 1081}
1082 1082
1083/* 1083/*
1084 * On NAND we try to mark this block bad. If the block was erased more 1084 * On NAND we try to mark this block bad. If the block was erased more
1085 * than MAX_ERASE_FAILURES we mark it finaly bad. 1085 * than MAX_ERASE_FAILURES we mark it finaly bad.
1086 * Don't care about failures. This block remains on the erase-pending 1086 * Don't care about failures. This block remains on the erase-pending
@@ -1101,7 +1101,7 @@ int jffs2_write_nand_badblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *
1101 1101
1102 D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Marking bad block at %08x\n", bad_offset)); 1102 D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Marking bad block at %08x\n", bad_offset));
1103 ret = c->mtd->block_markbad(c->mtd, bad_offset); 1103 ret = c->mtd->block_markbad(c->mtd, bad_offset);
1104 1104
1105 if (ret) { 1105 if (ret) {
1106 D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Write failed for block at %08x: error %d\n", jeb->offset, ret)); 1106 D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Write failed for block at %08x: error %d\n", jeb->offset, ret));
1107 return ret; 1107 return ret;
@@ -1125,7 +1125,7 @@ static int jffs2_nand_set_oobinfo(struct jffs2_sb_info *c)
1125 /* Do this only, if we have an oob buffer */ 1125 /* Do this only, if we have an oob buffer */
1126 if (!c->mtd->oobsize) 1126 if (!c->mtd->oobsize)
1127 return 0; 1127 return 0;
1128 1128
1129 /* Cleanmarker is out-of-band, so inline size zero */ 1129 /* Cleanmarker is out-of-band, so inline size zero */
1130 c->cleanmarker_size = 0; 1130 c->cleanmarker_size = 0;
1131 1131
@@ -1151,7 +1151,7 @@ static int jffs2_nand_set_oobinfo(struct jffs2_sb_info *c)
1151 c->fsdata_len = NAND_JFFS2_OOB16_FSDALEN; 1151 c->fsdata_len = NAND_JFFS2_OOB16_FSDALEN;
1152 c->badblock_pos = 15; 1152 c->badblock_pos = 15;
1153 break; 1153 break;
1154 1154
1155 default: 1155 default:
1156 D1(printk(KERN_DEBUG "JFFS2 on NAND. No autoplacment info found\n")); 1156 D1(printk(KERN_DEBUG "JFFS2 on NAND. No autoplacment info found\n"));
1157 return -EINVAL; 1157 return -EINVAL;
@@ -1168,7 +1168,7 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
1168 init_rwsem(&c->wbuf_sem); 1168 init_rwsem(&c->wbuf_sem);
1169 c->wbuf_pagesize = c->mtd->oobblock; 1169 c->wbuf_pagesize = c->mtd->oobblock;
1170 c->wbuf_ofs = 0xFFFFFFFF; 1170 c->wbuf_ofs = 0xFFFFFFFF;
1171 1171
1172 c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); 1172 c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1173 if (!c->wbuf) 1173 if (!c->wbuf)
1174 return -ENOMEM; 1174 return -ENOMEM;
@@ -1194,13 +1194,13 @@ void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c)
1194 1194
1195int jffs2_dataflash_setup(struct jffs2_sb_info *c) { 1195int jffs2_dataflash_setup(struct jffs2_sb_info *c) {
1196 c->cleanmarker_size = 0; /* No cleanmarkers needed */ 1196 c->cleanmarker_size = 0; /* No cleanmarkers needed */
1197 1197
1198 /* Initialize write buffer */ 1198 /* Initialize write buffer */
1199 init_rwsem(&c->wbuf_sem); 1199 init_rwsem(&c->wbuf_sem);
1200 1200
1201 1201
1202 c->wbuf_pagesize = c->mtd->erasesize; 1202 c->wbuf_pagesize = c->mtd->erasesize;
1203 1203
1204 /* Find a suitable c->sector_size 1204 /* Find a suitable c->sector_size
1205 * - Not too much sectors 1205 * - Not too much sectors
1206 * - Sectors have to be at least 4 K + some bytes 1206 * - Sectors have to be at least 4 K + some bytes
@@ -1210,11 +1210,11 @@ int jffs2_dataflash_setup(struct jffs2_sb_info *c) {
1210 */ 1210 */
1211 1211
1212 c->sector_size = 8 * c->mtd->erasesize; 1212 c->sector_size = 8 * c->mtd->erasesize;
1213 1213
1214 while (c->sector_size < 8192) { 1214 while (c->sector_size < 8192) {
1215 c->sector_size *= 2; 1215 c->sector_size *= 2;
1216 } 1216 }
1217 1217
1218 /* It may be necessary to adjust the flash size */ 1218 /* It may be necessary to adjust the flash size */
1219 c->flash_size = c->mtd->size; 1219 c->flash_size = c->mtd->size;
1220 1220
@@ -1222,7 +1222,7 @@ int jffs2_dataflash_setup(struct jffs2_sb_info *c) {
1222 c->flash_size = (c->flash_size / c->sector_size) * c->sector_size; 1222 c->flash_size = (c->flash_size / c->sector_size) * c->sector_size;
1223 printk(KERN_WARNING "JFFS2 flash size adjusted to %dKiB\n", c->flash_size); 1223 printk(KERN_WARNING "JFFS2 flash size adjusted to %dKiB\n", c->flash_size);
1224 }; 1224 };
1225 1225
1226 c->wbuf_ofs = 0xFFFFFFFF; 1226 c->wbuf_ofs = 0xFFFFFFFF;
1227 c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); 1227 c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1228 if (!c->wbuf) 1228 if (!c->wbuf)