Add erase block summary support (mount time improvement)
Hi JFFS2 devs,
The patch e631ddba5887: "[JFFS2] Add erase block summary support (mount time improvement)" from Sep 7, 2005, leads to the following static checker warning:
fs/jffs2/wbuf.c:934 jffs2_flash_writev()
warn: inconsistent returns 'c->wbuf_sem'.
Locked on : 908
Unlocked on: 916,934
fs/jffs2/wbuf.c
859 for (invec = 0; invec < count; invec++) {
860 int vlen = invecs[invec].iov_len;
861 uint8_t *v = invecs[invec].iov_base;
862
863 wbuf_retlen = jffs2_fill_wbuf(c, v, vlen);
864
865 if (c->wbuf_len == c->wbuf_pagesize) {
866 ret = __jffs2_flush_wbuf(c, NOPAD);
867 if (ret)
868 goto outerr;
869 }
870 vlen -= wbuf_retlen;
871 outvec_to += wbuf_retlen;
872 donelen += wbuf_retlen;
873 v += wbuf_retlen;
874
875 if (vlen >= c->wbuf_pagesize) {
876 ret = mtd_write(c->mtd, outvec_to, PAGE_DIV(vlen),
877 &wbuf_retlen, v);
878 if (ret < 0 || wbuf_retlen != PAGE_DIV(vlen))
879 goto outfile;
880
881 vlen -= wbuf_retlen;
882 outvec_to += wbuf_retlen;
883 c->wbuf_ofs = outvec_to;
884 donelen += wbuf_retlen;
885 v += wbuf_retlen;
886 }
887
888 wbuf_retlen = jffs2_fill_wbuf(c, v, vlen);
889 if (c->wbuf_len == c->wbuf_pagesize) {
890 ret = __jffs2_flush_wbuf(c, NOPAD);
891 if (ret)
892 goto outerr;
893 }
894
895 outvec_to += wbuf_retlen;
896 donelen += wbuf_retlen;
897 }
898
899 /*
900 * If there's a remainder in the wbuf and it's a non-GC write,
901 * remember that the wbuf affects this ino
902 */
903 *retlen = donelen;
904
905 if (jffs2_sum_active()) {
906 int res = jffs2_sum_add_kvec(c, invecs, count, (uint32_t) to);
907 if (res)
908 return res;
^^^^^^^^^^^This should probably be "ret" instead of "res" and then goto outfile or got outerr?
909 } 910 911 if (c->wbuf_len && ino) 912 jffs2_wbuf_dirties_inode(c, ino); 913 914 ret = 0; 915 up_write(&c->wbuf_sem); 916 return ret; 917 918 outfile: 919 /* 920 * At this point we have no problem, c->wbuf is empty. However 921 * refile nextblock to avoid writing again to same address. 922 */ 923 924 spin_lock(&c->erase_completion_lock); 925 926 jeb = &c->blocks[outvec_to / c->sector_size]; 927 jffs2_block_refile(c, jeb, REFILE_ANYWAY); 928 929 spin_unlock(&c->erase_completion_lock); 930 931 outerr: 932 *retlen = 0; 933 up_write(&c->wbuf_sem); 934 return ret; 935 }
regards,
dan carpenter
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/