device.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549
  1. /*
  2. RAWFS: Raw file system for NAND flash
  3. Copyright (C) 2012-2015 Perry Hsu <perry.hsu@mediatek.com>"
  4. This program can be distributed under the terms of the GNU GPL.
  5. See the file COPYING.
  6. */
  7. #if defined(CONFIG_MT_ENG_BUILD)
  8. #define DEBUG 1
  9. #endif
  10. #include <linux/module.h>
  11. #include <linux/fs.h>
  12. #include <linux/pagemap.h>
  13. #include <linux/version.h>
  14. #include <linux/nls.h>
  15. #include <linux/proc_fs.h>
  16. #include <linux/slab.h>
  17. #include <linux/mtd/mtd.h>
  18. #include <linux/crc32.h>
  19. #include "rawfs.h"
  20. #define CEILING(x, y) rawfs_div(((x)+(y)-1), (y))
  21. #define FLOOR(x, y) rawfs_div((x), (y))
  22. /* ----------------------------------------------------------------------------- */
  23. /* Device Level Access */
  24. /* ----------------------------------------------------------------------------- */
  25. #define RAWFS_NAND_PAGE_FOOTER(sb, ptr) (*((unsigned int *) \
  26. (((char *)ptr)+(sb->page_size-4))))
  27. /*---------------------------------------------------------------------------*/
  28. /* Layer 0: Address translation functions */
  29. /*---------------------------------------------------------------------------*/
  30. static int rawfs_block_addr(struct super_block *sb, int block_no, int offset)
  31. {
  32. struct rawfs_sb_info *rawfs_sb;
  33. int result;
  34. rawfs_sb = RAWFS_SB(sb);
  35. result = block_no * RAWFS_NAND_BLOCK_SIZE(rawfs_sb) + offset;
  36. RAWFS_PRINT(RAWFS_DBG_DEVICE, "rawfs_block_addr %d, %d, %d = %d\n",
  37. block_no, RAWFS_NAND_BLOCK_SIZE(rawfs_sb), offset, result);
  38. return result;
  39. }
  40. static int rawfs_page_addr(struct super_block *sb, int block_no, int page_no)
  41. {
  42. struct rawfs_sb_info *rawfs_sb;
  43. rawfs_sb = RAWFS_SB(sb);
  44. return block_no*RAWFS_NAND_BLOCK_SIZE(rawfs_sb) +
  45. page_no*RAWFS_NAND_PAGE_SIZE(rawfs_sb);
  46. }
  47. /*---------------------------------------------------------------------------*/
  48. /* Layer 1: Device functions: RAM disk */
  49. /*---------------------------------------------------------------------------*/
  50. #ifdef RAWFS_RAM_DISK
  51. int rawfs_dev_ram_erase_block(struct super_block *sb, int block_no)
  52. {
  53. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  54. char *fake_block = rawfs_sb->fake_block;
  55. RAWFS_PRINT(RAWFS_DBG_DEVICE, "rawfs_dev_ram_erase_block: %d\n", block_no);
  56. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb)) {
  57. memset(&fake_block[rawfs_page_addr(sb, block_no, 0)], 0xFF,
  58. RAWFS_NAND_BLOCK_SIZE(rawfs_sb));
  59. }
  60. return 0;
  61. }
  62. EXPORT_SYMBOL_GPL(rawfs_dev_ram_erase_block);
  63. int rawfs_dev_ram_read_page_user(struct super_block *sb, int block_no,
  64. int block_offset, const struct iovec *iov, unsigned long nr_segs, int size)
  65. {
  66. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  67. char *fake_block = rawfs_sb->fake_block;
  68. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  69. "rawfs_dev_ram_read_page_user: block %d, addr %d, size %d\n",
  70. block_no, block_offset, size);
  71. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  72. (block_offset+size) <= RAWFS_NAND_BLOCK_SIZE(rawfs_sb)) {
  73. unsigned long seg;
  74. unsigned long copied;
  75. RAWFS_PRINT(RAWFS_DBG_DEVICE, "iov_base %08X, ram buffer = %08X\n",
  76. (unsigned)iov->iov_base,
  77. (unsigned)&fake_block[rawfs_block_addr(
  78. sb, block_no, block_offset)]);
  79. for (seg = 0; seg < nr_segs && size > 0; seg++) {
  80. const struct iovec *iv = &iov[seg];
  81. /* if (access_ok(access_flags, iv->iov_base, iv->iov_len)) */
  82. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  83. "iv_base %08X, iv_len = %08X, ram_offset = %08X\n",
  84. (unsigned int) iv->iov_base,
  85. (unsigned int) ((size > iv->iov_len) ? iv->iov_len : size),
  86. (unsigned int) &fake_block[rawfs_block_addr(
  87. sb, block_no, block_offset)]);
  88. copied = copy_to_user(iv->iov_base,
  89. fake_block + rawfs_block_addr(sb, block_no, block_offset),
  90. (size > iv->iov_len) ? iv->iov_len : size);
  91. size -= iv->iov_len;
  92. }
  93. }
  94. return 0;
  95. }
  96. EXPORT_SYMBOL_GPL(rawfs_dev_ram_read_page_user);
  97. int rawfs_dev_ram_write_page(struct super_block *sb, int block_no, int page_no,
  98. void *buffer)
  99. {
  100. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  101. char *fake_block = rawfs_sb->fake_block;
  102. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  103. "rawfs_dev_ram_write_page: block %d, page %d\n", block_no, page_no);
  104. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  105. page_no < RAWFS_NAND_PAGES(rawfs_sb)) {
  106. memcpy(fake_block + rawfs_page_addr(sb, block_no, page_no), buffer,
  107. RAWFS_NAND_PAGE_SIZE(rawfs_sb));
  108. }
  109. return 0;
  110. }
  111. EXPORT_SYMBOL_GPL(rawfs_dev_ram_write_page);
  112. int rawfs_dev_ram_read_page(struct super_block *sb, int block_no, int page_no,
  113. void *buffer)
  114. {
  115. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  116. char *fake_block = rawfs_sb->fake_block;
  117. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  118. "rawfs_dev_ram_read_page: block %d, page %d\n", block_no, page_no);
  119. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  120. page_no < RAWFS_NAND_PAGES(rawfs_sb)) {
  121. memcpy(buffer, fake_block + rawfs_page_addr(sb, block_no, page_no),
  122. RAWFS_NAND_PAGE_SIZE(rawfs_sb));
  123. }
  124. return 0;
  125. }
  126. EXPORT_SYMBOL_GPL(rawfs_dev_ram_read_page);
  127. #endif /* RAWFS_RAM_DISK */
  128. /*---------------------------------------------------------------------------*/
  129. /* Layer 1: Device functions: MTD */
  130. /*---------------------------------------------------------------------------*/
  131. int rawfs_dev_mtd_erase_block(struct super_block *sb, int block_no)
  132. {
  133. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  134. struct mtd_info *mtd = RAWFS_MTD(sb);
  135. struct erase_info ei;
  136. int retval = 0;
  137. u32 addr;
  138. addr = ((loff_t) block_no) * RAWFS_NAND_BLOCK_SIZE(rawfs_sb);
  139. RAWFS_PRINT(RAWFS_DBG_DEVICE, "rawfs_dev_mtd_erase_block: %d @ 0x%X\n",
  140. block_no, addr);
  141. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb)) {
  142. ei.mtd = mtd;
  143. ei.addr = addr;
  144. ei.len = RAWFS_NAND_BLOCK_SIZE(rawfs_sb);
  145. ei.time = 1000;
  146. ei.retries = 2;
  147. ei.callback = NULL;
  148. ei.priv = (u_long) sb;
  149. retval = mtd_erase(mtd, &ei);
  150. if (retval)
  151. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  152. "rawfs_dev_mtd_erase_block: mtd error %d\n", retval);
  153. else
  154. RAWFS_PRINT(RAWFS_DBG_DEVICE, "rawfs_dev_mtd_erase_block: done\n");
  155. }
  156. return retval;
  157. }
  158. EXPORT_SYMBOL_GPL(rawfs_dev_mtd_erase_block);
  159. int rawfs_dev_mtd_read_page_user(struct super_block *sb, int block_no,
  160. int block_offset, const struct iovec *iov, unsigned long nr_segs, int size)
  161. {
  162. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  163. struct mtd_info *mtd = RAWFS_MTD(sb);
  164. loff_t addr = ((loff_t) rawfs_block_addr(sb, block_no, block_offset));
  165. int result = 0;
  166. void *page_buffer;
  167. size_t dummy;
  168. int retval = 0;
  169. page_buffer = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  170. if (!page_buffer) {
  171. result = -ENOMEM;
  172. goto out;
  173. }
  174. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  175. "rawfs_dev_mtd_read_page_user: block %d, addr %lld, size %d\n",
  176. block_no, addr, size);
  177. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  178. (block_offset+size) <= RAWFS_NAND_BLOCK_SIZE(rawfs_sb)) {
  179. unsigned long seg;
  180. unsigned long copied;
  181. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  182. "rawfs_dev_mtd_read_page_user: iov_base %lx, addr = %lx\n",
  183. (unsigned long)iov->iov_base,
  184. (unsigned long)addr);
  185. for (seg = 0; seg < nr_segs && size > 0; seg++) {
  186. const struct iovec *iv = &iov[seg];
  187. unsigned int read_length = 0;
  188. unsigned int remain_length = iv->iov_len;
  189. u8 *user_addr = iv->iov_base;
  190. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  191. "rawfs_dev_mtd_read_page_user: seg %ld, base %lx, length %08X\n",
  192. seg, (unsigned long)iv->iov_base, (unsigned)iv->iov_len);
  193. /* if (access_ok(access_flags, iv->iov_base, iv->iov_len)) */
  194. while (remain_length > 0) {
  195. unsigned read = 0;
  196. read = (size > remain_length) ? remain_length : size;
  197. read = (read > RAWFS_NAND_PAGE_SIZE(rawfs_sb)) ?
  198. RAWFS_NAND_PAGE_SIZE(rawfs_sb) : read;
  199. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  200. "user_addr %lx, phy_addr = %lx, read = %08X, reamin = %08X\n",
  201. (unsigned long) user_addr,
  202. (unsigned long) addr,
  203. (unsigned int) read_length,
  204. (unsigned int) remain_length);
  205. retval = mtd_read(mtd, addr, RAWFS_NAND_PAGE_SIZE(rawfs_sb),
  206. &dummy, page_buffer);
  207. if (retval) {
  208. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  209. "rawfs_dev_mtd_read_page: block %d, page %d, offset %X, mtd error %d\n",
  210. block_no,
  211. rawfs_div(addr, RAWFS_NAND_PAGE_SIZE(rawfs_sb)),
  212. (unsigned)addr, retval);
  213. }
  214. copied = copy_to_user(user_addr, page_buffer, read);
  215. remain_length -= read;
  216. addr += read;
  217. user_addr += read;
  218. read_length += read;
  219. size -= read;
  220. }
  221. }
  222. }
  223. out:
  224. kfree(page_buffer);
  225. return retval;
  226. }
  227. EXPORT_SYMBOL_GPL(rawfs_dev_mtd_read_page_user);
  228. int rawfs_dev_mtd_write_page(struct super_block *sb, int block_no, int page_no,
  229. void *buffer)
  230. {
  231. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  232. struct mtd_info *mtd = RAWFS_MTD(sb);
  233. loff_t addr = ((loff_t) rawfs_page_addr(sb, block_no, page_no));
  234. size_t dummy;
  235. int retval = 0;
  236. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  237. "rawfs_dev_mtd_write_page: block %d, page %d\n", block_no, page_no);
  238. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  239. page_no < RAWFS_NAND_PAGES(rawfs_sb)) {
  240. retval = mtd_write(mtd, addr, RAWFS_NAND_PAGE_SIZE(rawfs_sb), &dummy,
  241. buffer);
  242. if (retval) {
  243. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  244. "rawfs_dev_mtd_write_page: block %d, page %d, mtd error %d\n",
  245. block_no, page_no, retval);
  246. dump_stack();
  247. } else { /* write succeed, read-back verify */
  248. int read_retval;
  249. void *read_buffer;
  250. read_buffer = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  251. if (read_buffer) {
  252. read_retval = mtd_read(mtd, addr,
  253. RAWFS_NAND_PAGE_SIZE(rawfs_sb), &dummy, read_buffer);
  254. if (read_retval) { /* error case 1: MTD read error */
  255. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  256. "rawfs_dev_mtd_write_page: read-verify failed, mtd error %d\n",
  257. read_retval);
  258. retval = read_retval;
  259. } else {
  260. /* error case 2: read-verify failed */
  261. if (memcmp(buffer, read_buffer,
  262. RAWFS_NAND_PAGE_SIZE(rawfs_sb))) {
  263. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  264. "rawfs_dev_mtd_write_page: read-verify mismatch\n");
  265. retval = -EIO;
  266. } else {
  267. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  268. "rawfs_dev_mtd_write_page: done\n");
  269. }
  270. }
  271. kfree(read_buffer);
  272. } else {
  273. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  274. "rawfs_dev_mtd_write_page: read-verify abort, out of memory\n");
  275. }
  276. }
  277. }
  278. return retval;
  279. }
  280. EXPORT_SYMBOL_GPL(rawfs_dev_mtd_write_page);
  281. int rawfs_dev_mtd_read_page(struct super_block *sb, int block_no, int page_no,
  282. void *buffer)
  283. {
  284. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  285. struct mtd_info *mtd = RAWFS_MTD(sb);
  286. loff_t addr = ((loff_t) rawfs_page_addr(sb, block_no, page_no));
  287. size_t dummy;
  288. int retval = 0;
  289. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  290. "rawfs_dev_mtd_read_page: block %d, page %d\n", block_no, page_no);
  291. if (block_no < RAWFS_NAND_BLOCKS(rawfs_sb) &&
  292. page_no < RAWFS_NAND_PAGES(rawfs_sb)) {
  293. retval = mtd_read(mtd, addr, RAWFS_NAND_PAGE_SIZE(rawfs_sb),
  294. &dummy, buffer);
  295. if (retval) {
  296. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  297. "rawfs_dev_mtd_read_page: block %d, page %d, read fail, mtd error %d\n",
  298. block_no, page_no,
  299. retval);
  300. dump_stack();
  301. }
  302. }
  303. return retval;
  304. }
  305. EXPORT_SYMBOL_GPL(rawfs_dev_mtd_read_page);
  306. static int rawfs_block_header_read(struct super_block *sb, int block_no,
  307. struct rawfs_block_header *block_head_out)
  308. {
  309. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  310. struct rawfs_block_header *block_head = NULL;
  311. int result = 0;
  312. block_head = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  313. if (!block_head) {
  314. result = -ENOMEM;
  315. goto end;
  316. }
  317. result = rawfs_sb->dev.read_page(sb, block_no, 0, block_head);
  318. if (result) {
  319. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  320. "rawfs_read_block_header: block %d header, read error %d\n",
  321. block_no, result);
  322. result = -EIO;
  323. goto end;
  324. }
  325. if (block_head_out)
  326. memcpy(block_head_out, block_head, sizeof(struct rawfs_block_header));
  327. end:
  328. kfree(block_head);
  329. return result;
  330. }
  331. /*---------------------------------------------------------------------------*/
  332. /* Layer 2: Block/Page level application */
  333. /*---------------------------------------------------------------------------*/
  334. /* This function updates following two statistics which are used in
  335. block level analysis:
  336. rawfs_sb->sequence_number
  337. rawfs_sb->erase_count_max */
  338. int rawfs_block_is_valid(struct super_block *sb, int block_no,
  339. struct rawfs_block_header *block_head_out,
  340. struct rawfs_gc_marker_page *gc_page_out)
  341. {
  342. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  343. struct rawfs_block_header block_head;
  344. struct rawfs_gc_marker_page *gc_page = NULL;
  345. __u32 crc;
  346. bool all_empty = true;
  347. int i;
  348. int result = 0;
  349. int retval = 0;
  350. void *page_buffer = NULL;
  351. result = rawfs_block_header_read(sb, block_no, &block_head);
  352. if (result) {
  353. if (result == -EIO)
  354. result = RAWFS_BLOCK_STAT_INVALID_HEAD;
  355. goto end;
  356. }
  357. page_buffer = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  358. if (!page_buffer) {
  359. result = -ENOMEM;
  360. goto end;
  361. }
  362. if (block_head.i_signature_head != RAWFS_NAND_BLOCK_SIG_HEAD) {
  363. RAWFS_PRINT(RAWFS_DBG_MOUNT, "block %d is invalid\n", block_no);
  364. result = RAWFS_BLOCK_STAT_INVALID_HEAD;
  365. goto end;
  366. }
  367. crc = crc32(0, &block_head,
  368. sizeof(struct rawfs_block_header) - sizeof(__u32));
  369. if (block_head.i_crc != crc) {
  370. RAWFS_PRINT(RAWFS_DBG_MOUNT, "block %d is invalid, header crc fail\n",
  371. block_no);
  372. result = RAWFS_BLOCK_STAT_INVALID_HEAD;
  373. goto end;
  374. }
  375. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  376. "rawfs_is_valid_block: block %d, seq.no %d, last seq.no=%d, ec=%d\n",
  377. block_no,
  378. block_head.i_sequence_number,
  379. block_head.i_sequence_number_last,
  380. block_head.i_erase_count);
  381. /* Copy block head into output */
  382. if (block_head_out)
  383. memcpy(block_head_out, &block_head, sizeof(struct rawfs_block_header));
  384. /* Search for GC block */
  385. for (i = 1; i < RAWFS_NAND_PAGES(rawfs_sb); i++) {
  386. retval = rawfs_sb->dev.read_page(sb, block_no, i, page_buffer);
  387. if (retval) {
  388. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  389. "rawfs_is_valid_block: block %d, page %d, read error %d\n", block_no, i, retval);
  390. all_empty = false;
  391. }
  392. gc_page = (struct rawfs_gc_marker_page *)page_buffer;
  393. if (gc_page->i_signature_head != RAWFS_NAND_PAGE_SIG_EMPTY)
  394. all_empty = false;
  395. if (gc_page->i_signature_head != RAWFS_NAND_GC_MARKER_SIG_HEAD)
  396. continue;
  397. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  398. "rawfs_is_valid_block: block %d is a data block, GC complete marker found @ page %d\n",
  399. block_no, i);
  400. crc = rawfs_page_crc_gcmarker(sb, gc_page);
  401. if (crc != gc_page->i_crc) {
  402. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  403. "rawfs_is_valid_block: page %d, GC maker, crc error, expected %X, calucated %X\n",
  404. i, gc_page->i_crc, crc);
  405. result = RAWFS_PAGE_STAT_INVALID;
  406. } else {
  407. if (gc_page_out != NULL)
  408. memcpy(gc_page_out, gc_page,
  409. sizeof(struct rawfs_gc_marker_page));
  410. }
  411. rawfs_sb->sequence_number = max(rawfs_sb->sequence_number,
  412. block_head.i_sequence_number);
  413. rawfs_sb->erase_count_max = max3(rawfs_sb->erase_count_max,
  414. block_head.i_erase_count, gc_page->i_src_block_erase_count);
  415. result = RAWFS_BLOCK_STAT_DATA;
  416. goto end;
  417. }
  418. if (all_empty) {
  419. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  420. "rawfs_is_valid_block: block %d is a empty block\n", block_no);
  421. result = RAWFS_BLOCK_STAT_EMPTY;
  422. } else {
  423. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  424. "rawfs_is_valid_block: block %d is an invalid data block without GC complete marker\n",
  425. block_no);
  426. rawfs_sb->sequence_number = max(rawfs_sb->sequence_number,
  427. block_head.i_sequence_number);
  428. result = RAWFS_BLOCK_STAT_INVALID_DATA;
  429. }
  430. end:
  431. kfree(page_buffer);
  432. return result;
  433. }
  434. EXPORT_SYMBOL_GPL(rawfs_block_is_valid);
  435. __u32 rawfs_page_crc_data(struct super_block *sb, void *data_page)
  436. {
  437. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  438. struct rawfs_page *ptr;
  439. __u32 retval;
  440. ptr = (struct rawfs_page *) data_page;
  441. retval = crc32(0, &ptr->i_info.i_file_info, sizeof(struct rawfs_file_info));
  442. retval = crc32(retval, &ptr->i_data[0], rawfs_sb->page_data_size);
  443. return retval;
  444. }
  445. EXPORT_SYMBOL_GPL(rawfs_page_crc_data);
  446. __u32 rawfs_page_crc_gcmarker(struct super_block *sb, void *gcmarker_page)
  447. {
  448. __u32 retval;
  449. retval = crc32(0, gcmarker_page,
  450. sizeof(struct rawfs_gc_marker_page) - sizeof(__u32));
  451. return retval;
  452. }
  453. EXPORT_SYMBOL_GPL(rawfs_page_crc_gcmarker);
  454. int rawfs_page_get(struct super_block *sb, int block_no, int page_no,
  455. struct rawfs_file_info *file_info, void *data)
  456. {
  457. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  458. struct rawfs_page *page;
  459. int result = RAWFS_PAGE_STAT_EMPTY;
  460. int retval;
  461. unsigned signature_foot;
  462. void *page_buffer;
  463. __u32 crc;
  464. page_buffer = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  465. if (!page_buffer) {
  466. result = -ENOMEM;
  467. goto out;
  468. }
  469. retval = rawfs_sb->dev.read_page(sb, block_no, page_no, page_buffer);
  470. if (retval) {
  471. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d, read error %d\n", page_no,
  472. retval);
  473. result = RAWFS_PAGE_STAT_UNCORRECTABLE;
  474. goto out;
  475. }
  476. page = (struct rawfs_page *)page_buffer;
  477. signature_foot = RAWFS_NAND_PAGE_FOOTER(rawfs_sb, page);
  478. if ((page->i_signature_head == RAWFS_NAND_PAGE_SIG_EMPTY) &&
  479. (signature_foot == RAWFS_NAND_PAGE_SIG_EMPTY)) {
  480. goto out;
  481. } else if (page->i_signature_head == RAWFS_NAND_GC_MARKER_SIG_HEAD) {
  482. /* Verify GC page CRC */
  483. struct rawfs_gc_marker_page *gcmarker;
  484. gcmarker = (struct rawfs_gc_marker_page *)page_buffer;
  485. crc = rawfs_page_crc_gcmarker(sb, page);
  486. if (crc != gcmarker->i_crc) {
  487. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  488. "page %d, GC maker, crc error, expected %X, calucated %X\n",
  489. page_no, gcmarker->i_crc, crc);
  490. result = RAWFS_PAGE_STAT_INVALID;
  491. } else {
  492. result = RAWFS_PAGE_STAT_GC_MARKER;
  493. }
  494. goto out;
  495. } else if (page->i_signature_head == RAWFS_NAND_BLOCK_SIG_HEAD) {
  496. result = RAWFS_PAGE_STAT_BLOCK_HEAD;
  497. goto out;
  498. } else if ((page->i_signature_head != RAWFS_NAND_PAGE_SIG_HEAD) ||
  499. (signature_foot != RAWFS_NAND_PAGE_SIG_FOOT)) {
  500. result = RAWFS_PAGE_STAT_INVALID; /* Invalid Page: 0 */
  501. goto out;
  502. }
  503. /* Verify Data Page CRC */
  504. crc = rawfs_page_crc_data(sb, page);
  505. if (crc != page->i_crc) {
  506. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  507. "page %d, crc error, expected %X, calucated %X\n",
  508. page_no, page->i_crc, crc);
  509. result = RAWFS_PAGE_STAT_INVALID;
  510. goto out;
  511. }
  512. /* Copy Page Data */
  513. if (data != NULL)
  514. memcpy(data, page->i_data, RAWFS_NAND_PAGE_DATA_SIZE(rawfs_sb));
  515. if (file_info != NULL)
  516. memcpy(file_info, &page->i_info.i_file_info,
  517. sizeof(struct rawfs_file_info));
  518. if (page->i_info.i_file_info.i_chunk_total == -1)
  519. result = RAWFS_PAGE_STAT_DELETED;
  520. else if (page->i_info.i_file_info.i_chunk_total >=
  521. page->i_info.i_file_info.i_chunk_index)
  522. result = RAWFS_PAGE_STAT_VALID;
  523. /* Free Page */
  524. out:
  525. kfree(page_buffer);
  526. return result;
  527. }
  528. EXPORT_SYMBOL_GPL(rawfs_page_get);
  529. /* Program Block Header */
  530. static void rawfs_block_write_header(struct super_block *sb, int block_no,
  531. unsigned sequence_number, unsigned sequence_number_last,
  532. unsigned erase_count)
  533. {
  534. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  535. struct rawfs_block_header *bheader;
  536. bheader = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  537. bheader->i_rawfs_version = RAWFS_VERSION;
  538. bheader->i_signature_head = RAWFS_NAND_BLOCK_SIG_HEAD;
  539. bheader->i_erase_count = erase_count;
  540. bheader->i_sequence_number = sequence_number;
  541. bheader->i_sequence_number_last = sequence_number_last;
  542. bheader->i_crc = crc32(0, bheader,
  543. sizeof(struct rawfs_block_header) - sizeof(__u32));
  544. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  545. "rawfs_block_write_header: block %d, seq.no %d, last_seq.no %d, ec: %d\n",
  546. block_no, sequence_number, sequence_number_last, erase_count);
  547. rawfs_sb->erase_count_max = max(rawfs_sb->erase_count_max, erase_count);
  548. rawfs_sb->dev.write_page(sb, block_no, 0, bheader);
  549. kfree(bheader);
  550. }
  551. static void rawfs_page_write_gc_marker(struct super_block *sb, int block_no,
  552. int page_no, unsigned src_block_index, unsigned src_block_seq,
  553. unsigned src_erase_count)
  554. {
  555. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  556. struct rawfs_gc_marker_page *gc_marker;
  557. gc_marker = kzalloc(RAWFS_NAND_PAGE_SIZE(rawfs_sb), GFP_NOFS);
  558. gc_marker->i_signature_head = RAWFS_NAND_GC_MARKER_SIG_HEAD;
  559. gc_marker->i_src_block_index = src_block_index;
  560. gc_marker->i_src_block_sequence_number = src_block_seq;
  561. gc_marker->i_src_block_erase_count = src_erase_count;
  562. gc_marker->i_crc = crc32(0, gc_marker,
  563. sizeof(struct rawfs_gc_marker_page) - sizeof(__u32));
  564. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  565. "rawfs_write_gc_marker_page: block %d, page %d, src_blk %d, src_seq.no: %d, src_blk_ec %d\n",
  566. block_no, page_no, src_block_index, src_block_seq, src_erase_count);
  567. rawfs_sb->dev.write_page(sb, block_no, page_no, gc_marker);
  568. rawfs_sb->data_block_gcmarker_page_index = page_no;
  569. kfree(gc_marker);
  570. }
  571. /* Set page head/foot signature, and crc */
  572. void rawfs_page_signature(struct super_block *sb, void *buf)
  573. {
  574. struct rawfs_page *page_buf = (struct rawfs_page *) buf;
  575. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  576. page_buf->i_signature_head = RAWFS_NAND_PAGE_SIG_HEAD;
  577. RAWFS_NAND_PAGE_FOOTER(rawfs_sb, buf) = RAWFS_NAND_PAGE_SIG_FOOT;
  578. page_buf->i_crc = rawfs_page_crc_data(sb, page_buf);
  579. RAWFS_PRINT(RAWFS_DBG_DEVICE,
  580. "rawfs_page_signature: %s @ %X (%d/%d), crc %X\n",
  581. page_buf->i_info.i_file_info.i_name,
  582. page_buf->i_info.i_file_info.i_parent_folder_id,
  583. page_buf->i_info.i_file_info.i_chunk_index,
  584. page_buf->i_info.i_file_info.i_chunk_total,
  585. page_buf->i_crc);
  586. }
  587. EXPORT_SYMBOL_GPL(rawfs_page_signature);
  588. /* Mount: Block Level Analysis */
  589. /* Assign data block & empty block in sb */
  590. int rawfs_block_level_analysis(struct super_block *sb)
  591. {
  592. /* For each block, Check its block header */
  593. int i;
  594. int result = 0;
  595. int *block_list = NULL;
  596. int block_list_entries = 0;
  597. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  598. struct rawfs_block_header block_header;
  599. struct rawfs_gc_marker_page gc_page;
  600. int data_block_seqno = 0;
  601. int gc_src_block_index = -1;
  602. int gc_src_block_seqno = -1;
  603. RAWFS_PRINT(RAWFS_DBG_MOUNT, "rawfs_block_level_analysis\n");
  604. rawfs_sb->data_block = -1;
  605. rawfs_sb->empty_block = -1;
  606. rawfs_sb->sequence_number = 0;
  607. rawfs_sb->erase_count_max = 0;
  608. rawfs_sb->data_block_gcmarker_page_index = -1;
  609. block_list = kzalloc((1+RAWFS_NAND_BLOCKS(rawfs_sb))*sizeof(int), GFP_NOFS);
  610. if (!block_list) {
  611. result = -ENOMEM;
  612. goto out;
  613. }
  614. memset(&block_header, 0, sizeof(struct rawfs_block_header));
  615. for (i = 0; i < RAWFS_NAND_BLOCKS(rawfs_sb); i++) {
  616. int block_stat;
  617. block_stat = rawfs_block_is_valid(sb, i, &block_header, &gc_page);
  618. /* erase all blocks if firstboot flag was set in protect.rc */
  619. if (rawfs_sb->flags & RAWFS_MNT_FIRSTBOOT)
  620. block_stat = RAWFS_BLOCK_STAT_INVALID_HEAD;
  621. switch (block_stat) {
  622. case RAWFS_BLOCK_STAT_INVALID_HEAD: /* Invalid Block Head */
  623. block_list[block_list_entries] = i;
  624. block_list_entries++;
  625. /* Add to list, the block header will program latter,
  626. its header will be recovered from data block */
  627. break;
  628. case RAWFS_BLOCK_STAT_INVALID_DATA:
  629. /* Invalid Block Data, Keep orignal header */
  630. block_list[block_list_entries] = i;
  631. block_list_entries++;
  632. break;
  633. case RAWFS_BLOCK_STAT_EMPTY: /* Empty Block */
  634. rawfs_sb->empty_block = i;
  635. break;
  636. case RAWFS_BLOCK_STAT_DATA:
  637. /* Data Block, with largest sequence number */
  638. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  639. "rawfs_block_level_analysis: data block %d, seq.no %d, last seq.no=%d, ec=%d\n",
  640. i,
  641. block_header.i_sequence_number,
  642. block_header.i_sequence_number_last,
  643. block_header.i_erase_count);
  644. if (block_header.i_sequence_number >= data_block_seqno) {
  645. rawfs_sb->data_block = i;
  646. data_block_seqno = block_header.i_sequence_number;
  647. gc_src_block_index = gc_page.i_src_block_index;
  648. gc_src_block_seqno = gc_page.i_src_block_sequence_number;
  649. }
  650. break;
  651. case -ENOMEM:
  652. result = -ENOMEM;
  653. goto out;
  654. default:
  655. break;
  656. }
  657. }
  658. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  659. "rawfs_block_level_analysis: [Handling] data block %d, empty block %d\n",
  660. rawfs_sb->data_block, rawfs_sb->empty_block);
  661. /* Case A: There's no data block, this is First Boot */
  662. if (rawfs_sb->data_block < 0) {
  663. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  664. "rawfs_block_level_analysis: A.1/A.2: Data block not exist: First Boot\n");
  665. rawfs_sb->data_block = 0;
  666. rawfs_sb->empty_block = 1;
  667. for (i = 0; i < RAWFS_NAND_BLOCKS(rawfs_sb); i++) {
  668. rawfs_sb->dev.erase_block(sb, i);
  669. rawfs_block_write_header(sb, i, i+1, 0, 0);
  670. }
  671. rawfs_sb->sequence_number = i;
  672. /* gc_block=1, last_seq=-1, for first boot */
  673. rawfs_page_write_gc_marker(sb, 0, 1, 1, -1, 0);
  674. goto out;
  675. } else {
  676. if (rawfs_sb->empty_block < 0) { /* Case B: Empty block was not exist */
  677. /* case B.1: Both data blocks are valid, but there's no empty block
  678. => erase the one that last gc marker indicates. */
  679. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  680. "rawfs_block_level_analysis: B.1 Empty block not exist, gc_block_index %d\n",
  681. gc_src_block_index);
  682. BUG_ON(gc_src_block_index < 0); /* This should not happen,
  683. since data blocks already had been found. */
  684. /* add to list */
  685. for (i = 0; i < block_list_entries; i++) {
  686. if (block_list[i] == gc_src_block_index)
  687. break;
  688. }
  689. if (i == block_list_entries) {
  690. block_list[block_list_entries] = gc_src_block_index;
  691. block_list_entries++;
  692. }
  693. rawfs_sb->empty_block = gc_src_block_index;
  694. BUG_ON(rawfs_sb->empty_block == rawfs_sb->data_block);
  695. } else {
  696. /* Case B.2: Both data block and empty block are valid
  697. => Normal Case */
  698. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  699. "rawfs_block_level_analysis: B.2 Normal Boot\n");
  700. }
  701. }
  702. /* Handle blocks listed in erase list. */
  703. for (i = 0; i < block_list_entries; i++) {
  704. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  705. "rawfs_block_level_analysis: erase & restore block %d header, seq %d, ec %d\n",
  706. block_list[i], rawfs_sb->sequence_number,
  707. rawfs_sb->erase_count_max);
  708. rawfs_sb->dev.erase_block(sb, block_list[i]);
  709. rawfs_block_write_header(sb, block_list[i], rawfs_sb->sequence_number,
  710. 0, rawfs_sb->erase_count_max);
  711. if (rawfs_sb->empty_block < 0)
  712. rawfs_sb->empty_block = block_list[i];
  713. rawfs_sb->sequence_number++;
  714. }
  715. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  716. "rawfs_block_level_analysis: [Result] data block %d, empty block %d\n",
  717. rawfs_sb->data_block, rawfs_sb->empty_block);
  718. BUG_ON(rawfs_sb->empty_block < 0);
  719. BUG_ON(rawfs_sb->data_block < 0);
  720. out:
  721. kfree(block_list);
  722. return result;
  723. }
  724. EXPORT_SYMBOL_GPL(rawfs_block_level_analysis);
  725. void rawfs_file_list_init(struct super_block *sb)
  726. {
  727. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  728. INIT_LIST_HEAD(&sbi->file_list);
  729. INIT_LIST_HEAD(&sbi->folder_list);
  730. }
  731. EXPORT_SYMBOL_GPL(rawfs_file_list_init);
  732. void rawfs_file_list_destroy(struct super_block *sb)
  733. {
  734. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  735. struct rawfs_file_list_entry *ptr, *tmp;
  736. struct list_head *lists[2];
  737. int i;
  738. lists[0] = &sbi->folder_list;
  739. lists[1] = &sbi->file_list;
  740. RAWFS_PRINT(RAWFS_DBG_DIR, "rawfs_file_list_destroy()\n");
  741. mutex_lock(&sbi->file_list_lock);
  742. for (i = 0; i < 2; i++) {
  743. list_for_each_entry_safe(ptr, tmp, lists[i], list) {
  744. RAWFS_PRINT(RAWFS_DBG_DIR,
  745. "rawfs_file_list_destroy: free %s @ folder %0X", ptr->file_info.i_name,
  746. ptr->file_info.i_parent_folder_id);
  747. list_del(&ptr->list);
  748. kfree(ptr);
  749. }
  750. }
  751. mutex_unlock(&sbi->file_list_lock);
  752. }
  753. EXPORT_SYMBOL_GPL(rawfs_file_list_destroy);
  754. int rawfs_file_list_count(struct super_block *sb, unsigned int *entry_count,
  755. unsigned int *used_blocks, unsigned int *free_blocks)
  756. {
  757. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  758. struct rawfs_file_list_entry *ptr;
  759. struct list_head *lists[2];
  760. struct rawfs_file_info *fi;
  761. unsigned int entries = 0;
  762. unsigned int ublocks = 0;
  763. int fblocks;
  764. int i;
  765. lists[0] = &sbi->folder_list; /* Folders will be listed before files */
  766. lists[1] = &sbi->file_list;
  767. mutex_lock(&sbi->file_list_lock);
  768. for (i = 0; i < 2; i++) {
  769. list_for_each_entry(ptr, lists[i], list) {
  770. if (ptr->i_location_page < 0) /* skip block file */
  771. continue;
  772. fi = &ptr->file_info;
  773. RAWFS_PRINT(RAWFS_DBG_DIR,
  774. "rawfs_file_list_count() %s %s @ folder %X, size %d, pages %d\n",
  775. S_ISDIR(fi->i_mode)?"folder":"file",
  776. fi->i_name, fi->i_parent_folder_id, (unsigned)fi->i_size,
  777. ptr->i_location_page_count);
  778. entries++;
  779. ublocks += ptr->i_location_page_count;
  780. }
  781. }
  782. mutex_unlock(&sbi->file_list_lock);
  783. fblocks = (sbi->pages_per_block - 3 - ublocks);
  784. if (entry_count)
  785. *entry_count = entries;
  786. if (used_blocks)
  787. *used_blocks = ublocks;
  788. if (free_blocks)
  789. *free_blocks = (fblocks < 0) ? 0 : fblocks;
  790. RAWFS_PRINT(RAWFS_DBG_DIR,
  791. "rawfs_file_list_count() entries %d, used %d, free %d\n", entries, ublocks, fblocks);
  792. return 0;
  793. }
  794. EXPORT_SYMBOL_GPL(rawfs_file_list_count);
  795. struct rawfs_file_list_entry *rawfs_file_list_get(struct super_block *sb,
  796. const char *name, int folder_id)
  797. {
  798. /* Try to search in file list */
  799. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  800. struct rawfs_file_list_entry *ptr;
  801. struct rawfs_file_list_entry *entry = NULL;
  802. struct list_head *lists[2];
  803. int i;
  804. lists[0] = &sbi->folder_list; /* Folders will be listed before files */
  805. lists[1] = &sbi->file_list;
  806. mutex_lock(&sbi->file_list_lock);
  807. for (i = 0; i < 2; i++) { /* Check files on the same folder */
  808. list_for_each_entry(ptr, lists[i], list) {
  809. if (ptr->file_info.i_parent_folder_id != folder_id)
  810. continue;
  811. if (strnicmp(ptr->file_info.i_name, name,
  812. RAWFS_MAX_FILENAME_LEN+4) == 0) {
  813. entry = ptr;
  814. break;
  815. }
  816. }
  817. }
  818. mutex_unlock(&sbi->file_list_lock);
  819. if (entry)
  820. RAWFS_PRINT(RAWFS_DBG_DIR, "rawfs_file_list_get() %s, found @ %0lx",
  821. name, (unsigned long)entry);
  822. else
  823. RAWFS_PRINT(RAWFS_DBG_DIR, "rawfs_file_list_get() %s, not found", name);
  824. return entry;
  825. }
  826. EXPORT_SYMBOL_GPL(rawfs_file_list_get);
  827. struct rawfs_file_list_entry *rawfs_file_list_get_by_id(struct super_block *sb,
  828. umode_t mode, int id)
  829. {
  830. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  831. struct rawfs_file_list_entry *ptr;
  832. struct rawfs_file_list_entry *entry = NULL;
  833. struct list_head *list_p;
  834. /* Determine entry type */
  835. if S_ISDIR(mode)
  836. list_p = &sbi->folder_list;
  837. else
  838. list_p = &sbi->file_list;
  839. mutex_lock(&sbi->file_list_lock);
  840. list_for_each_entry(ptr, &sbi->folder_list, list) {
  841. if (ptr->file_info.i_id == id) {
  842. entry = ptr;
  843. break;
  844. }
  845. }
  846. mutex_unlock(&sbi->file_list_lock);
  847. return entry;
  848. }
  849. EXPORT_SYMBOL_GPL(rawfs_file_list_get_by_id);
  850. void rawfs_file_list_remove(struct super_block *sb, struct rawfs_file_info *fi)
  851. {
  852. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  853. struct rawfs_file_list_entry *ptr, *tmp;
  854. struct rawfs_file_list_entry *entry = NULL;
  855. struct list_head *list_p;
  856. /* Determine entry type */
  857. if S_ISDIR(fi->i_mode)
  858. list_p = &sbi->folder_list;
  859. else
  860. list_p = &sbi->file_list;
  861. RAWFS_PRINT(RAWFS_DBG_DIR,
  862. "rawfs_file_list_remove() %s %s from folder %X\n",
  863. S_ISDIR(fi->i_mode)?"folder":"file",
  864. fi->i_name, fi->i_parent_folder_id);
  865. mutex_lock(&sbi->file_list_lock);
  866. list_for_each_entry_safe(ptr, tmp, list_p, list) {
  867. /* Check files on the same folder */
  868. if (ptr->file_info.i_parent_folder_id != fi->i_parent_folder_id)
  869. continue;
  870. if (strnicmp(ptr->file_info.i_name, fi->i_name,
  871. RAWFS_MAX_FILENAME_LEN+4) == 0) {
  872. entry = ptr;
  873. break;
  874. }
  875. }
  876. if (entry) {
  877. list_del(&entry->list);
  878. kfree(entry);
  879. }
  880. mutex_unlock(&sbi->file_list_lock);
  881. }
  882. EXPORT_SYMBOL_GPL(rawfs_file_list_remove);
  883. int rawfs_file_list_add(struct super_block *sb, struct rawfs_file_info *fi,
  884. int block_no, int page_no)
  885. {
  886. int result = 0;
  887. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  888. struct rawfs_file_list_entry *ptr;
  889. struct rawfs_file_list_entry *entry = NULL;
  890. struct list_head *list_p;
  891. /* Determine entry type */
  892. if S_ISDIR(fi->i_mode)
  893. list_p = &sbi->folder_list;
  894. else
  895. list_p = &sbi->file_list;
  896. RAWFS_PRINT(RAWFS_DBG_DIR,
  897. "rawfs_file_list_add() add %s %s to folder %X @ block %d, page %d\n",
  898. S_ISDIR(fi->i_mode)?"folder":"file", fi->i_name,
  899. fi->i_parent_folder_id, block_no, page_no);
  900. mutex_lock(&sbi->file_list_lock);
  901. list_for_each_entry(ptr, list_p, list) {
  902. if (ptr->file_info.i_parent_folder_id != fi->i_parent_folder_id)
  903. continue;
  904. if ((strnicmp(ptr->file_info.i_name, fi->i_name,
  905. RAWFS_MAX_FILENAME_LEN+4) == 0) ||
  906. (ptr->file_info.i_id == fi->i_id)) {
  907. entry = ptr;
  908. break;
  909. }
  910. }
  911. if (!entry) { /* Entry not exist -> allocate new entry */
  912. entry = kzalloc(sizeof(struct rawfs_file_list_entry), GFP_NOFS);
  913. RAWFS_PRINT(RAWFS_DBG_DIR,
  914. "rawfs_file_list_add() allocate new entry @ %lx\n", (unsigned long)entry);
  915. if (!entry) {
  916. result = -ENOMEM;
  917. goto out;
  918. }
  919. INIT_LIST_HEAD(&(entry->list));
  920. list_add_tail(&(entry->list), list_p);
  921. } else {
  922. RAWFS_PRINT(RAWFS_DBG_DIR,
  923. "rawfs_file_list_add() update existing entry @ %lx\n", (unsigned long)entry);
  924. }
  925. memcpy(&(entry->file_info), fi, sizeof(struct rawfs_file_info));
  926. entry->i_location_block = block_no;
  927. entry->i_location_page = page_no;
  928. entry->i_location_page_count = S_ISDIR(fi->i_mode) ? 1 :
  929. CEILING((unsigned)fi->i_size, sbi->page_data_size);
  930. out:
  931. mutex_unlock(&sbi->file_list_lock);
  932. return result;
  933. }
  934. EXPORT_SYMBOL_GPL(rawfs_file_list_add);
  935. /* Inconsistent: 1, Consistent: 0 */
  936. static int rawfs_page_check_file_consistency(struct rawfs_file_info *fi_head,
  937. struct rawfs_file_info *fi_ptr, int index)
  938. {
  939. /* Except CRC & index, all info should indentical to that head. */
  940. int result;
  941. if (index != fi_ptr->i_chunk_index)
  942. return 1;
  943. fi_head->i_chunk_index = fi_ptr->i_chunk_index;
  944. if (memcmp(fi_head, fi_ptr, sizeof(struct rawfs_file_info)) == 0)
  945. result = 0;
  946. else
  947. result = 1;
  948. fi_head->i_chunk_index = 1;
  949. return result;
  950. }
  951. /***** Mount: Page Level Analysis (On data block)
  952. Build list of files
  953. Last free page in data block */
  954. int rawfs_page_level_analysis(struct super_block *sb)
  955. {
  956. int i;
  957. int result = 0;
  958. int page_status;
  959. int free_page_index = -1;
  960. int head_pos = -1;
  961. int uncorrectable_pages = 0; /* uncorrectable pages among file chunks. */
  962. struct rawfs_sb_info *rawfs_sb;
  963. struct rawfs_file_info *fi_ptr; /* Info of Current reading page. */
  964. struct rawfs_file_info *fi_head; /* Info Current processing file. */
  965. rawfs_sb = RAWFS_SB(sb);
  966. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page level analysis @ block %d\n",
  967. rawfs_sb->data_block);
  968. fi_ptr = kzalloc(sizeof(struct rawfs_file_info), GFP_NOFS);
  969. fi_head = kzalloc(sizeof(struct rawfs_file_info), GFP_NOFS);
  970. if ((!fi_head) || (!fi_ptr)) {
  971. result = -ENOMEM;
  972. goto out;
  973. }
  974. /* Search pages from data block begin (by order of update sequence). */
  975. for (i = 1; i < RAWFS_NAND_PAGES(rawfs_sb); i++) {
  976. page_status = rawfs_page_get(sb, rawfs_sb->data_block, i, fi_ptr, NULL);
  977. switch (page_status) {
  978. case RAWFS_PAGE_STAT_VALID:
  979. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Valid\n", i);
  980. /* Check file integrity */
  981. /* Search & delete redundant entries in list. (by name) */
  982. /* Insert new entry to list */
  983. free_page_index = -1;
  984. if (fi_ptr->i_chunk_index == 1) { /* First chunk of file */
  985. memcpy(fi_head, fi_ptr, sizeof(struct rawfs_file_info));
  986. head_pos = i;
  987. uncorrectable_pages = 0;
  988. } else { /* Check current chunk is consistent to the head */
  989. /* No head chunk were found preceding this middle chunk,
  990. it is invalid. */
  991. if (head_pos < 0)
  992. break;
  993. /* Expected index of current chunk is
  994. (i-head_pos+1+uncorrectable_pages) */
  995. if (rawfs_page_check_file_consistency(fi_head, fi_ptr,
  996. i-head_pos+1+uncorrectable_pages)) {
  997. head_pos = -1;
  998. break;
  999. }
  1000. }
  1001. /* Last chunk */
  1002. if (fi_ptr->i_chunk_index == fi_ptr->i_chunk_total) {
  1003. result = rawfs_file_list_add(sb, fi_head,
  1004. rawfs_sb->data_block, head_pos);
  1005. if (result)
  1006. goto out;
  1007. }
  1008. break;
  1009. case RAWFS_PAGE_STAT_DELETED:
  1010. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Deleted\n", i);
  1011. /* Search list for redundant entry (by name)
  1012. delete entry */
  1013. free_page_index = -1;
  1014. rawfs_file_list_remove(sb, fi_ptr);
  1015. head_pos = -1;
  1016. break;
  1017. case RAWFS_PAGE_STAT_INVALID: /* Do nothing, skip it */
  1018. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Invalid\n", i);
  1019. free_page_index = -1;
  1020. head_pos = -1;
  1021. break;
  1022. case RAWFS_PAGE_STAT_BLOCK_HEAD: /* Do nothing, skip it */
  1023. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Block Head\n", i);
  1024. free_page_index = -1;
  1025. head_pos = -1;
  1026. break;
  1027. case RAWFS_PAGE_STAT_UNCORRECTABLE:
  1028. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Uncorrectable\n", i);
  1029. /* Ignore this page, and continue search next valid chunk. */
  1030. uncorrectable_pages++;
  1031. /* We shall skip uncorrectable pages */
  1032. free_page_index = -1;
  1033. break;
  1034. case RAWFS_PAGE_STAT_GC_MARKER:
  1035. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: GC complete mark\n", i);
  1036. head_pos = -1;
  1037. free_page_index = -1;
  1038. rawfs_sb->data_block_gcmarker_page_index = i;
  1039. break;
  1040. case RAWFS_PAGE_STAT_EMPTY:
  1041. RAWFS_PRINT(RAWFS_DBG_MOUNT, "page %d: Empty\n", i);
  1042. /* Set last free page,
  1043. Verify all pages are free, till end. */
  1044. if (free_page_index < 0)
  1045. free_page_index = i;
  1046. head_pos = -1;
  1047. break;
  1048. case -ENOMEM:
  1049. result = -ENOMEM;
  1050. goto out;
  1051. default:
  1052. result = page_status;
  1053. goto out;
  1054. }
  1055. }
  1056. out:
  1057. kfree(fi_ptr);
  1058. kfree(fi_head);
  1059. if (free_page_index < 0)
  1060. rawfs_dev_garbage_collection(sb);
  1061. else
  1062. rawfs_sb->data_block_free_page_index = free_page_index;
  1063. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  1064. "rawfs_page_level_analysis, gc_marker %d, free_index %d\n",
  1065. rawfs_sb->data_block_gcmarker_page_index,
  1066. rawfs_sb->data_block_free_page_index);
  1067. return result;
  1068. }
  1069. EXPORT_SYMBOL_GPL(rawfs_page_level_analysis);
  1070. /* Mount: File Level Analysis (On data block) */
  1071. /* Search for files whose parent folders are not exist */
  1072. int rawfs_file_level_analysis(struct super_block *sb)
  1073. {
  1074. int result = 0;
  1075. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  1076. struct rawfs_file_list_entry *file_ptr, *folder_ptr, *tmp;
  1077. struct rawfs_file_list_entry *entry;
  1078. struct list_head *list_p;
  1079. list_p = &sbi->file_list;
  1080. RAWFS_PRINT(RAWFS_DBG_MOUNT, "rawfs_file_level_analysis.\n");
  1081. mutex_lock(&sbi->file_list_lock);
  1082. list_for_each_entry_safe(file_ptr, tmp, list_p, list) {
  1083. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  1084. "rawfs_file_level_analysis: %s(%X)@%X, %d\n",
  1085. file_ptr->file_info.i_name,
  1086. file_ptr->file_info.i_id,
  1087. file_ptr->file_info.i_parent_folder_id,
  1088. (unsigned)file_ptr->file_info.i_size);
  1089. if (file_ptr->file_info.i_parent_folder_id == RAWFS_ROOT_DIR_ID)
  1090. continue;
  1091. entry = NULL;
  1092. /* Search for the parent folder in folder list. */
  1093. list_for_each_entry(folder_ptr, &sbi->folder_list, list) {
  1094. if (folder_ptr->file_info.i_id ==
  1095. file_ptr->file_info.i_parent_folder_id) {
  1096. entry = folder_ptr;
  1097. break;
  1098. }
  1099. }
  1100. /* Parent folder not exist => Remove orphan files from file list */
  1101. if (entry == NULL) {
  1102. RAWFS_PRINT(RAWFS_DBG_MOUNT,
  1103. "rawfs_file_level_analysis: %s(%X)@%X, parent folder not exist.\n",
  1104. file_ptr->file_info.i_name,
  1105. file_ptr->file_info.i_id,
  1106. file_ptr->file_info.i_parent_folder_id);
  1107. list_del(&file_ptr->list);
  1108. kfree(file_ptr);
  1109. }
  1110. }
  1111. mutex_unlock(&sbi->file_list_lock);
  1112. return result;
  1113. }
  1114. EXPORT_SYMBOL_GPL(rawfs_file_level_analysis);
  1115. int rawfs_dev_free_space(struct super_block *sb)
  1116. {
  1117. int result;
  1118. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  1119. /* -2: Except block header page,
  1120. last page is reserved for deletion & rename */
  1121. result = rawfs_sb->pages_per_block -
  1122. rawfs_sb->data_block_free_page_index - 2;
  1123. result = result * rawfs_sb->page_data_size;
  1124. return result;
  1125. }
  1126. EXPORT_SYMBOL_GPL(rawfs_dev_free_space);
  1127. /* For all files in the gc data block, copy all valid data to empty block */
  1128. int rawfs_dev_garbage_collection(struct super_block *sb)
  1129. {
  1130. int result = 0;
  1131. int i, j;
  1132. int empty_block;
  1133. int empty_block_free_page_index = 1;
  1134. int data_block;
  1135. struct rawfs_sb_info *sbi = RAWFS_SB(sb);
  1136. struct rawfs_page *page_buf = NULL;
  1137. struct rawfs_file_list_entry *ptr;
  1138. struct list_head *lists[2];
  1139. struct inode *inode;
  1140. struct rawfs_inode_info *inode_info;
  1141. struct rawfs_block_header block_header;
  1142. RAWFS_PRINT(RAWFS_DBG_GC, "rawfs_dev_garbage_collection()\n");
  1143. if (sbi->data_block_gcmarker_page_index+1 ==
  1144. sbi->data_block_free_page_index) {
  1145. RAWFS_PRINT(RAWFS_DBG_GC,
  1146. "rawfs_dev_garbage_collection: disk is full, gcmarker index %d, free index %d, pages per block %d\n",
  1147. sbi->data_block_gcmarker_page_index,
  1148. sbi->data_block_free_page_index,
  1149. sbi->pages_per_block);
  1150. result = -ENOSPC;
  1151. goto out;
  1152. }
  1153. /* Clear the list */
  1154. page_buf = kzalloc(sbi->page_size, GFP_NOFS);
  1155. if (!page_buf) {
  1156. result = -ENOMEM;
  1157. goto out;
  1158. }
  1159. empty_block = sbi->empty_block;
  1160. data_block = sbi->data_block;
  1161. result = rawfs_block_header_read(sb, data_block, &block_header);
  1162. if (result)
  1163. goto out;
  1164. /* Try to search in file list */
  1165. lists[0] = &sbi->folder_list; /* Folders will be listed before files */
  1166. lists[1] = &sbi->file_list;
  1167. mutex_lock(&sbi->file_list_lock);
  1168. for (i = 0; i < 2; i++) {
  1169. list_for_each_entry(ptr, lists[i], list) {
  1170. int starting_page;
  1171. /* skip block file */
  1172. if (ptr->i_location_page < 0) {
  1173. RAWFS_PRINT(RAWFS_DBG_GC,
  1174. "rawfs_dev_garbage_collection: skip block file %s",
  1175. ptr->file_info.i_name);
  1176. continue;
  1177. }
  1178. if (ptr->i_location_block != data_block) {
  1179. RAWFS_PRINT(RAWFS_DBG_GC,
  1180. "rawfs_dev_garbage_collection: skip %s @ block %d",
  1181. ptr->file_info.i_name,
  1182. ptr->i_location_block);
  1183. continue;
  1184. }
  1185. /* Copy Content */
  1186. starting_page = empty_block_free_page_index;
  1187. RAWFS_PRINT(RAWFS_DBG_GC,
  1188. "rawfs_dev_garbage_collection: Moving %s %s @ folder %X, Block %d Page %d, Count %d\n",
  1189. S_ISDIR(ptr->file_info.i_mode)?"folder":"file",
  1190. ptr->file_info.i_name, ptr->file_info.i_parent_folder_id,
  1191. ptr->i_location_block, ptr->i_location_page,
  1192. ptr->i_location_page_count);
  1193. for (j = 0; j < ptr->i_location_page_count; j++) {
  1194. RAWFS_PRINT(RAWFS_DBG_GC,
  1195. "rawfs_dev_garbage_collection: Block %d Page %d > Block %d Page %d\n",
  1196. data_block, ptr->i_location_page + j,
  1197. empty_block, empty_block_free_page_index);
  1198. sbi->dev.read_page(sb, data_block, ptr->i_location_page + j,
  1199. page_buf);
  1200. sbi->dev.write_page(sb, empty_block, empty_block_free_page_index,
  1201. page_buf);
  1202. empty_block_free_page_index++;
  1203. }
  1204. /* Update file list */
  1205. ptr->i_location_block = empty_block;
  1206. ptr->i_location_page = starting_page;
  1207. /* ptr->i_location_page_count = ptr->file_info.i_chunk_total; */
  1208. /* Update inode info */
  1209. inode = rawfs_iget(sb, ptr->file_info.i_name,
  1210. ptr->file_info.i_parent_folder_id);
  1211. if (inode) {
  1212. /* TODO: get inode lock first */
  1213. inode_info = RAWFS_I(inode);
  1214. inode_info->i_location_block = empty_block;
  1215. inode_info->i_location_page = starting_page;
  1216. inode_info->i_location_page_count = ptr->i_location_page_count;
  1217. RAWFS_PRINT(RAWFS_DBG_GC,
  1218. "rawfs_dev_garbage_collection: Update inode info %s %s @ folder %X, Block %d Page %d, Count %d\n",
  1219. S_ISDIR(ptr->file_info.i_mode)?"folder":"file",
  1220. ptr->file_info.i_name, ptr->file_info.i_parent_folder_id,
  1221. inode_info->i_location_block, inode_info->i_location_page,
  1222. inode_info->i_location_page_count);
  1223. iput(inode);
  1224. }
  1225. }
  1226. }
  1227. mutex_unlock(&sbi->file_list_lock);
  1228. /* write GC complete marker page */
  1229. rawfs_page_write_gc_marker(sb,
  1230. empty_block,
  1231. empty_block_free_page_index,
  1232. data_block,
  1233. block_header.i_sequence_number,
  1234. block_header.i_erase_count);
  1235. empty_block_free_page_index++;
  1236. /* Erase data block */
  1237. sbi->dev.erase_block(sb, data_block);
  1238. /* Write block header to new data block */
  1239. rawfs_block_write_header(sb, data_block,
  1240. sbi->sequence_number,
  1241. block_header.i_sequence_number, /* last seq no */
  1242. block_header.i_erase_count+1);
  1243. sbi->sequence_number++;
  1244. sbi->data_block = empty_block;
  1245. sbi->empty_block = data_block;
  1246. sbi->data_block_free_page_index = empty_block_free_page_index;
  1247. result = (RAWFS_NAND_PAGES(sbi) - empty_block_free_page_index) *
  1248. RAWFS_NAND_PAGE_DATA_SIZE(sbi);
  1249. RAWFS_PRINT(RAWFS_DBG_GC,
  1250. "rawfs_dev_garbage_collection: empty_blk = %d, data_blk = %d, free index = %d, reclaimed: %d bytes\n",
  1251. sbi->empty_block, sbi->data_block, sbi->data_block_free_page_index,
  1252. result);
  1253. out:
  1254. kfree(page_buf);
  1255. return result;
  1256. }
  1257. EXPORT_SYMBOL_GPL(rawfs_dev_garbage_collection);
  1258. /* Reserve space for create, write, copy, and rename */
  1259. int rawfs_reserve_space(struct super_block *sb, int chunks)
  1260. {
  1261. int result = 0;
  1262. int required_size;
  1263. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  1264. required_size = chunks * rawfs_sb->page_data_size;
  1265. if (required_size > rawfs_dev_free_space(sb)) {
  1266. int reclaimed_size;
  1267. reclaimed_size = rawfs_dev_garbage_collection(sb);
  1268. if ((required_size > reclaimed_size) || (reclaimed_size < 0)) {
  1269. RAWFS_PRINT(RAWFS_DBG_GC,
  1270. "rawfs_reg_reserve_space: disk full, reclaimed %d, required %d\n",
  1271. reclaimed_size, required_size);
  1272. result = -ENOSPC;
  1273. }
  1274. }
  1275. return result;
  1276. }
  1277. EXPORT_SYMBOL_GPL(rawfs_reserve_space);
  1278. MODULE_AUTHOR("Perry Hsu <perry.hsu@mediatek.com>");
  1279. MODULE_DESCRIPTION("RAW file system for NAND flash");
  1280. MODULE_LICENSE("GPL");