From c42118128633cff9446ff16f06cb919d2b295a10 Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Thu, 4 Jul 2013 23:37:38 +0200 Subject: [PATCH] started consistency checks --- build/linux_spiffs_test | Bin 148266 -> 153541 bytes build/spiffs_hydrogen.o | Bin 23768 -> 24240 bytes build/spiffs_nucleus.o | Bin 70272 -> 74248 bytes build/test_hydrogen.o | Bin 100832 -> 100832 bytes src/spiffs.h | 2 + src/spiffs_hydrogen.c | 9 ++++ src/spiffs_nucleus.c | 98 ++++++++++++++++++++++++++++++++++++++++ src/spiffs_nucleus.h | 2 +- 8 files changed, 110 insertions(+), 1 deletion(-) diff --git a/build/linux_spiffs_test b/build/linux_spiffs_test index a45dcc0397697a85bfe5abf7ec7405baeb88d571..8354d6778f9b810573429bca9a41bd53bcaa7649 100755 GIT binary patch delta 27121 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 Z|MhzMav!n8nO|t*^)pw<(uv2!{|A7;?~woi delta 24308 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 D2UFn? diff --git a/build/spiffs_hydrogen.o b/build/spiffs_hydrogen.o index 5f56d68e09174c3c65badd7ffcbff9f345d0656f..67ae604ed063da1300ef51ac3336f52a56f12b6e 100644 GIT binary patch delta 2210 zcmZ9Ne@xV69LK-U7f_B3Cs*4wif&@(wV;)4?5z9_M+&QS7)B28&kelDUP; znhvy0uJ_!kt;Y3FS;V~ETo7e4*Me3Qn=G=$ycI&5O=zrevmeiw@AEzN`EKw$-_Psw zd4HbI=Xsv{P7RTZUyxqAI_QWMlv*DTczR|$uiwh`^mNU6&Q{G`R`}!T`Fc(td#di9 zt-3pQRauO;SYKO}o=bEqNx-`y7zl6Bq z%BLh259WWAl2&v%y>eSTWpg%3JJ{B8@cDRF;bdxj?#Wy=XD!e6n7W))$wQqvILvcY4Lar|89hxPVy?= zc2-(?HyXBPB)DxJth7@7;aN16R#Yd@wFl=Q`wYLO~Wfkgh z2?)!^#WK6)N{PX@BT?qGtZ6dd-h!>%iT@mFXe!@oS=wq?mk=#?TIRPKZ-2xS<+G`5 zoR@7?h+;N$?(d zhHICb-4fPGiS{GPV=IL9Pl?{a1gHHXuT2zUZpl9&yLqgzZjDCX2AVuKPbM3_@1 ziho(6=MmZMW<_G#K9T76Sm3dz#9GHB`X+3(lx-JzXC%4>zFJBs+G{m-Oz3YCzGhtm zh;fBQ5xGO6(@1dICRYBUM88GW9?GtZ*wYdnfQwTz_I-&?<1nXY-fI%IBg*NN$oscM z`!KPGk^%g_M`I^MXMDoftZNa)do@yv@LtLm1RIrn#u4GPRw&$*=mv~%8WDX<6{D$t z1`B(sx-tbB-afsAe(t-9sh*&We&`1n-_`C?g10gmmcHv*WX#SYBQ%oEP@oP|A-$@#9q5eza zM|(qvXc%h3uUN$6I sGsG&tLZXotd?%=G)bEj7d?_aHi&`#cMLgq~ak9oPE}K5+f999ze^(xEDF6Tf delta 1854 zcmZ9MU2GIp6vy`rTj(@E*ecxK_~Oz+c2Srt1gG0Y7tplbEppGur%6+x<<;}DM8-u}3!7(2#(2h+$pJqShz7T9} z#&Wogw!=0VO}fEd@2zuh?A}K1Uwf|k-Ou)I*FJctjRfbWslRsE_y3hf-ZW`U_{7D% zYR2`kR*!rL-f8Mf-QF&Qe5Xlmush>=sNJ*qFfVK&1fp?mO99#FBl<|#LsK{(HMN5U zd?k#{yFKG2@Geuoyw}@306K6Fj(2rv3wvSnZP;?akIAkMeMt)L$Gnh_6g>G$;4xEg z-tX;P&pFni`(mDD2ImEziF>>2?tE;~?=By_uDRbon)Rc%H$*Oqy^Npqdy=i*;%gDB z=%FtRr`HhOsfzm?D8cAs@PxrHO1-7%D;P}}^cd^}<3^JQClt-=s0jLvj9@GD4Xg+X{Ub3rVKk_Tx^n zn>OH3ALCIeEs>|KwdN*@f?k%^Hx)Vnr>}?qAgy03^aAJz;}L27Q=xw#BIpH~Hz;4E zmUkJWtG?3uutJ}JE$F?{H?PnjDuQm5t$$XbXRvalhqueIT~z27$n-P*oUCyY*LaV5*$vdae`#>qiugbi&V^gach@==fNTdv2l%2^)ZB4TXJ7rKD6%prW$z~Ky z1uKHaWrSZ9x)s4Rh|X?HX{litG}86u~M7Ew+cl*EDvG%T5|Xo?7A zdN`9!oKq-AF~jQd|4}I5WDGivYKGB^_$_192bo{r_}Nqu$=)608HG+@G|T8Dp3hoz z3-eh+G*=%O7tf`E@p|^j4UI8>M_}+Qt%ozn=n|#}t@&Nue Q=Eev%g2z(sjbk(PA0~P&iU0rr diff --git a/build/spiffs_nucleus.o b/build/spiffs_nucleus.o index 038b4a43d66a0d9ddc603e5f7c882895f559075e..0c1d2e7b21b3cbf558274ba9ac32c57397465cb4 100644 GIT binary patch delta 12986 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 delta 9548 zcmZu%4OCTC7QXkvRw9@`OGa(Xzoamg$r%~5nsOQ$wWc&j zG}^gNKhi{wX*D!4ul#9(bZM44q&T_8ND@XfQBYA)RFK){oPB)f-Zf{f=eu`*`{&#H z>~qe&4_EIET(LRul}yi$FO1t`w742=#2c|S_pdGqFuMBtUN8MH)m#r12)y*WB`)AKX@41!<=uyMS;10bD4Raf*Pmw;N zK5DkPGF%*+$*Cotr@Laq2nyx^x$olcA9zQ(?;`gz`;{1Gmun|7a8yi_4!e~Lyfw@o zx_jKnlti7u(DGd3D8bSh%^sv8n{} zei!e1chd^f5f|f2-#jte914rKedQaxW2e)1y>^u8%m3mL)92gupu-ooXOZb!x_51$ z=>_NhelUOk-LPqYC-?H^fsxTWzTs8Gsc_5hKG1Sth~sM!0x}O~s>`hhqMRd9#e}I( z$A*4gBDK5wL*u~|=PLdAmJPeY)NlASJ@BW`! zpU_$%_FSkNZ6K{?tLQ$g!<}`-8Uk=1u9MYy7ZIba$+4O2?3e+}w%y>B3 zI3%&3rt@eRx0fDLA^Cfc1G#N?}Jjy7wy!4Q z4GwABgJ>q+DbIV71W0IhlP7VYhW@dyA5DQGMD;oTh?fQj_nZmkh^FI}@;p6-V-g(* zwTPzSokFkkX~V&72SdBfb4jWI1)2iMKX?)cpg`GnNcC4S$L<=G)@ACM9UD> zGpg3mET~3Qule%t=gWV4;XN#Nj~6Tp4Knvu!Nii4x^kc%j%saUPx6mdvarHJZ% zHE*yV9SD^tJh1UZxI3R8-Z-R9J=*A*9MjM&=s{Gk(Qk+NZL=V|**Z6aXiwvw2SO2| zdKG@f&jTDBO@ne9dVr1wj`oLIMD;vh8O|-GZC_|dl(&$o!b>9rNEs!!SgQ~;(vN09 zA)UX`26I8X6Cki0Z3%M4sQaKhz_t*JP)LWep{SZo97p1>1aKo`m8UXqoX~D>K(JFNJq0zTW4-N9jm+==}?5I z&MIK8Zd-oZVzQh-PTwOX6umbRrJ`%$?(DL=|mLwcZz?>FBG+U61mT}=)tPcf|j>>M8r()1P8uT zh@m)D!R}Vc$!SVtiA`e!bdW{@9s6ZAjWLjVHg*E%u#BQq*fhFBq~LX%{04EZ(&bQg zR%TS;l;TePNvi(v=@%kvq58LF;K~kU|y;TKXfar6vqJnwEvO~9o+;fu6 z-zhg2)k)Yx={Z^7Jv5{FI*NV*q3T?$;QLp6TjFDxP2&RbU1O7f79jOsx5>W%vrY1S zUMd)$=o*mSCK>gT{b3zNi`g)@P0m&pX|&rkI;c_+l#{B|v&6KoE{EDSIUn_aqLc^(7w_4EZc3GQJ%6zYm zBG)2lX_u?vZDQAK(^vx0=Ow#i)DO3G4ahw&*)5>>Qz;U43!&mo2IDQZpp}HSQT;!( zp!Me^_k5Bz>nQqK1Lg(EY!ESu2}Cgt89V!eWTw0iwV*{8r1xs7`7d-7eT;_+@;;g3 zF48rimb@>eURq;8+X)RL+fOZM@cxk>S%&K@mog#%nf>WY|p+exee6tZP8~rE!T7s(AR_Z9xk!d(0SEaCscQ z7*}7GwS1VmdK1-DR=Vl(xMc2U7y0^DM^QE%@~+5C)oyZ8*MQP1GSe37E;oIvTD}cc zS7a@hkX@EdBLW&I!Y4FKb94>pxgs<5Ql-~h(4tPB=BgHNL>R;$=*SG;V*R*{cMA(YxyEu546%%D-7$3#kn8b#p_buB^kU#{BGJj zq{Hqm$w1}jp;&?=w0C)g|1=1>E~jd(JWYbJzw@EMf_aXfTruRns1Y| z(So{fNbl9usUh?LD7c{a4YztaXsG6PRMv%ybzf-sG7U z-LzJ&Ro6x?=}>XgS~(Z}Y$GdIdy}ugqc{01BzH?*Y8GCyXcl%`YxKa(m={&`hz8>nM8L164gT@A(w3 zTi1a49+~R}LbK>GLvrouk+~L7zt7N7^u7d!-HJ`&EBQz2foE+R7ee8&TVsatn4@V) z{>P@$MjOo;T@FWYiK*zdPV3+(bc93D!|ytn+AGsjhub7w1Iox={hqj1N6~%>)bz>? z$Orp-v5_{oO&M_l4};^p&0^z*JX1bS*3mZMrgs&^Ngcm^ZSs05;=Q_jL!~Jv;0c<* zVhdVt%FVQxj*GwPD9biY&q!WBfn%~c+b5Qo{i3M)qs;tfgd084ckJ)9(Nt28-vA?IPN)#SX^2U$lT z&QuH=;lvWfurmA-n|d=*OrrO0Dz}p|_>Nj`p$?EbJ z!&aM00$ZX~N~9BGpG~EPRiTR54ORP}vZ<&NUbe|=X)|%~UtMs>)Ov!bIaCR~8XU#4 zU8YCuR-IIsQ5wuEc{+qW<}$~KGjtt$-(@~Um#M)fp3-bYu;{_EV5*>65rG~-;`Z7} zXEkUb+Eg9X>ADJQLJxw8DsYJoqqD0{788Oily98x(8lqGO{b16385(Ja5$~2u*wi~ zT%p+R)e{ZLadc0v=BS4ht}Lyo5eO39Z8errI`C{Dh`&1Dq_9t zqji7ErqUb4o{XfG+sbxEiv6%BQk)!dQG!WP6ct>(o&JIUUXDW+yc}UcbP5suK!;In zGTR+R#Zk}yU+XHYT?J4t06$sa|3w~$s$Dpn8g0s_k!@^Yv`C>^8F?x3 zX*MGdYe7xXNUfx@N>hnqxiO*$55l!f|{;Xx(cgR9#rGLr^A?T9qT|3Vgc{s>ErmPO~u1f`%oon*gbuyJ6qXGyu{Y} zvX3d>9}8G?9Fb9vI#c^emz*yqA4hYpPN@YJxD;XZ_hQ^_e+}qQ)MpE8jib2h*syrp zUeT$!iDBjOrhEz?O$Yv1ub%|pV$xYhJn>ZL!8~1sC40~V*L<2hfDWTPhpqI`D#<1l zpG{>RtMQom^28vOfK)Wap(Zb#MJL#J^w(8bZh|>3i1RoS%GM;%dRopJ5-@*pkkD(@ zaf?-UqUjmIt)l3OA~cOh^~Y7e+$7oL6WQ+*>5Lt~IufZXrqH{{TAMa@MG~=JNZnbh ytFXc((Zd_?ODqWWXq(?(qr*C-R_-0N67FQP?x6J4e|I78qHf{ab5qQ>0{#bfOm02^ diff --git a/build/test_hydrogen.o b/build/test_hydrogen.o index 939f6ec6c4ad881d803ed3593415d48846f16e17..208b6880f74851393befa0f9fb903ae69f078966 100644 GIT binary patch delta 584 zcmY*Xy>1jS81w~lN~l9XoD`*?po+X}dw;rAh!-G~#<%w6tlQf?*1G~Eq?A;t{1{Lm z@c@(;PDp__2#-Kd!FV^Iqgl<2$M$^Vz47B4KmK%QeUXvYs7BYXs}oKcB}?m^t04Q^Ot>kH2W0}O zXpCy1Wt5cGwNl$Au*6?~INSxwGyn7X0Z>GR|FJ&WiDLh2eLTuR9^A8)HgB-T1jL8_ z<=O6CFz&yDlvjJBtd}pZ_AUfzo31KUiy-#zgi#g^NxI6u>P%&v!}csE2&H8)@2Z82 zPI%13wz5*^XeZ`$Tf9vY^Z%^#uD1&6f1f>ij7=gTr88zBm$kMti#)cjq*|dEv>Ydy zfA;bCK2YeRH-;$Sx$y759$}z&FD7V%#XJ-+Mmol6m~w!rA8nqD7`})8bhE#cQozYm zxYCrAHQp92fMuNY%^RsIE&Fk&s#xHnI3mup-3q2W+4?^iUIItqZcd}m-!=zd{s81N B!}I_E delta 581 zcmY*X%}(1u7+gaWg(Fg+v_Xgihn|qVyZ*azs(1n5xNN)|vWl}#y|w_UQjVOsu#eFm zD)j+4CRj*S-vHhK?i~2+&?;Q4Z^pC!W@i0h+Yh$=YjrmDQ6YIQvU9ypT^ypZGDhh$ zHc+VqhPbHD1sjNZ4p5S2M!rExk&vk@02@A*3yqKelUXs8`GO5xRDX~4FIhH`^`;7>T=D|AFhr>`1rsU<6cPL9$7Tzr*td^IU6?!<+rP7&6*soevt1_u@NrFPAur$^ zu}`y4_Vl>*p#kgjEt}3ejt|l;dp++=F)H#>C%gb3>R&)Fj21>pt-h5~OJm@86d>>< zSTZd2h z=mko~fo~6g?ry+T*U<=TD}ZBcukLmr(D#!bltHjp=Wl~MLc%&_Gg4}u>WkyTbJHGF zYff-eZGQz#NKu->#X<*wA`dmSOUAWeP1rt9MzF?0Z~krehvcH;8e}#IQo5G Hb#Gq*)Xc)k diff --git a/src/spiffs.h b/src/spiffs.h index 369f4b4..f89e1c1 100644 --- a/src/spiffs.h +++ b/src/spiffs.h @@ -203,4 +203,6 @@ spiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d); s32_t SPIFFS_closedir(spiffs_DIR *d); struct spiffs_dirent *SPIFFS_readdir(spiffs_DIR *d, struct spiffs_dirent *e); +s32_t SPIFFS_check(spiffs *fs); + #endif /* SPIFFS_H_ */ diff --git a/src/spiffs_hydrogen.c b/src/spiffs_hydrogen.c index 23d8f7b..0ac0e75 100644 --- a/src/spiffs_hydrogen.c +++ b/src/spiffs_hydrogen.c @@ -482,3 +482,12 @@ s32_t SPIFFS_closedir(spiffs_DIR *d) { return SPIFFS_OK; } +s32_t SPIFFS_check(spiffs *fs) { + s32_t res; + SPIFFS_LOCK(fs); + + res = spiffs_area_check(fs, 0); + + SPIFFS_UNLOCK(fs); + return res; +} diff --git a/src/spiffs_nucleus.c b/src/spiffs_nucleus.c index 7a5496a..9181a78 100644 --- a/src/spiffs_nucleus.c +++ b/src/spiffs_nucleus.c @@ -1932,6 +1932,10 @@ static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id return SPIFFS_COUNTINUE; } +// Scans thru all object lookup for object index header pages. If total possible number of +// object ids cannot fit into a work buffer, these are grouped. When a group containing free +// object ids is found, the object lu is again scanned for object ids within group and bitmasked. +// Finally, the bitmasked is searched for a free id s32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id) { s32_t res = SPIFFS_OK; u32_t max_objects = (SPIFFS_CFG_PHYS_SZ(fs) / (u32_t)SPIFFS_CFG_LOG_PAGE_SZ(fs)) / 2; @@ -2061,3 +2065,97 @@ s32_t spiffs_fd_get(spiffs *fs, spiffs_file f, spiffs_fd **fd) { } return SPIFFS_OK; } + +// Scans all object look up. For each entry, corresponding page header is checked for validity. +// If an object index header page is found, this is checked +s32_t spiffs_area_check(spiffs *fs, u8_t check_all_objects) { + s32_t res = SPIFFS_OK; + s32_t entry_count = fs->block_count * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs); + spiffs_block_ix cur_block = 0; + u32_t cur_block_addr = SPIFFS_BLOCK_TO_PADDR(fs, 0); + + spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work; + int cur_entry = 0; + spiffs_page_ix cur_pix; + u32_t entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id)); + + // check each block + while (res == SPIFFS_OK && entry_count > 0) { + int obj_lookup_page = cur_entry / entries_per_page; + // check each object lookup page + while (res == SPIFFS_OK && obj_lookup_page < SPIFFS_OBJ_LOOKUP_PAGES(fs)) { + int entry_offset = obj_lookup_page * entries_per_page; + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work); + // check each entry + while (res == SPIFFS_OK && + cur_entry - entry_offset < entries_per_page && // for non-last obj lookup pages + cur_entry < SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) // for last obj lookup page + { + spiffs_obj_id obj_id = obj_lu_buf[cur_entry-entry_offset]; + spiffs_page_header p_hdr; + cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry); + + // load header + res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, + 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t*)&p_hdr); + SPIFFS_CHECK_RES(res); + + if (obj_id == SPIFFS_OBJ_ID_ERASED) { + // TODO + if (p_hdr.flags & SPIFFS_PH_FLAG_DELET) { + print("WARNING: pix %04x deleted in lu but not on page\n", cur_pix); + } + } else if (obj_id == SPIFFS_OBJ_ID_FREE) { + // TODO + if (p_hdr.flags != 0xff) { + print("WARNING: pix %04x free in lu but not on page\n", cur_pix); + } + } else { + // TODO + if ((p_hdr.flags & SPIFFS_PH_FLAG_DELET) == 0) { + print("WARNING: pix %04x busy in lu but free on page\n", cur_pix); + } + if ((p_hdr.flags & SPIFFS_PH_FLAG_FINAL)) { + print("WARNING: pix %04x busy but not final\n", cur_pix); + } + if (p_hdr.obj_id != obj_id) { + print("WARNING: pix %04x has id %04x in lu but %04x on page\n", cur_pix, obj_id, p_hdr.obj_id); + } + if (obj_id & SPIFFS_OBJ_ID_IX_FLAG) { + // index page + if (p_hdr.flags & SPIFFS_PH_FLAG_INDEX) { + print("WARNING: pix %04x marked as index in lu but as data on page\n", cur_pix); + } + } else { + // data page + if ((p_hdr.flags & SPIFFS_PH_FLAG_INDEX) == 0) { + print("WARNING: pix %04x as data in lu but as index on page\n", cur_pix); + } + } + } + + entry_count--; + cur_entry++; + } // per entry + obj_lookup_page++; + } // per object lookup page + cur_entry = 0; + cur_block++; + cur_block_addr += SPIFFS_CFG_LOG_BLOCK_SZ(fs); + } // per block + + SPIFFS_CHECK_RES(res); + + return SPIFFS_OK; +} + +// Scans all object look up for consistency within given object id. When an index is found, it is loaded +// and checked for validity against each referenced page. When an object index header is found, size is +// checked. +// When an index points to a bad page (deleted, other id, bad span index, etc), the whole area is searched +// for correct page, followed by an index update. If no such page is found, a free page is allocated and +// referenced instead meaning there will be a "hole" with 0xff in the file. +s32_t spiffs_object_check(spiffs *fs, spiffs_obj_id objid) { + +} diff --git a/src/spiffs_nucleus.h b/src/spiffs_nucleus.h index bd5b9c9..ab7c5e1 100644 --- a/src/spiffs_nucleus.h +++ b/src/spiffs_nucleus.h @@ -579,6 +579,6 @@ spiffs_cache_page *spiffs_cache_page_get_by_fd(spiffs *fs, spiffs_fd *fd); #endif #endif -void spiffs_test_list_objects(spiffs *fs); +s32_t spiffs_area_check(spiffs *fs, u8_t check_all_objects); #endif /* SPIFFS_NUCLEUS_H_ */