super.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  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/mtd/mtd.h>
  17. #include <linux/statfs.h>
  18. #include <linux/ctype.h>
  19. #include <linux/slab.h>
  20. #include <linux/sched.h>
  21. #include <linux/uidgid.h>
  22. #include <linux/cred.h>
  23. #include <linux/seq_file.h>
  24. #include <linux/major.h>
  25. #include "rawfs.h"
  26. /* To identify RAW FS from other file systems. */
  27. #define RAWFS_MAGIC 0x4D524653 /* "MRFS" */
  28. unsigned int rawfs_parm = 0;
  29. module_param(rawfs_parm, int, 0);
  30. MODULE_PARM_DESC(rawfs_parm, "");
  31. /* Debug message level */
  32. int rawfs_debug_msg_mask = RAWFS_DEBUG_MSG_DEFAULT;
  33. /* File System Statistics */
  34. static struct list_head *rawfs_context;
  35. static struct mutex rawfs_context_lock;
  36. static void rawfs_context_init(void)
  37. {
  38. rawfs_context = kzalloc(sizeof(struct list_head), GFP_NOFS);
  39. if (rawfs_context) {
  40. INIT_LIST_HEAD(rawfs_context);
  41. mutex_init(&rawfs_context_lock);
  42. }
  43. }
  44. static void rawfs_context_add(struct super_block *sb)
  45. {
  46. struct rawfs_sb_info *rawfs_sb;
  47. rawfs_sb = RAWFS_SB(sb);
  48. rawfs_sb->super = sb;
  49. mutex_lock(&rawfs_context_lock);
  50. INIT_LIST_HEAD(&(rawfs_sb->fs_context));
  51. list_add_tail(&(rawfs_sb->fs_context), rawfs_context);
  52. mutex_unlock(&rawfs_context_lock);
  53. }
  54. static void rawfs_context_remove(struct super_block *sb)
  55. {
  56. struct rawfs_sb_info *rawfs_sb;
  57. rawfs_sb = RAWFS_SB(sb);
  58. mutex_lock(&rawfs_context_lock);
  59. list_del(&(rawfs_sb->fs_context));
  60. mutex_unlock(&rawfs_context_lock);
  61. }
  62. /* External Variables */
  63. /* extern struct inode_operations rawfs_dir_inode_ops;
  64. extern struct inode_operations rawfs_file_inode_ops;
  65. extern struct file_operations rawfs_dir_operations;
  66. */
  67. /* Local Macros */
  68. #define rawfs_devname(sb, buf) bdevname(sb->s_bdev, buf)
  69. /* Process Files */
  70. static struct proc_dir_entry *rawfs_proc_root;
  71. static int rawfs_proc_init(void)
  72. {
  73. rawfs_proc_root = proc_mkdir("fs/rawfs", NULL);
  74. if (rawfs_proc_root == NULL)
  75. return -ENOMEM;
  76. return 0;
  77. }
  78. static void rawfs_proc_clean(void)
  79. {
  80. if (rawfs_proc_root == NULL)
  81. return;
  82. remove_proc_entry("DebugData", rawfs_proc_root);
  83. remove_proc_entry("fs/rawfs", NULL);
  84. }
  85. static const char * const rawfs_block_stat_str[] = {
  86. "INV",
  87. "EMP",
  88. "IDT",
  89. "DAT",
  90. ""
  91. };
  92. static const char * const rawfs_page_stat_str[] = {
  93. "EMP",
  94. "DEL",
  95. "VAL",
  96. "BKH",
  97. "GCM",
  98. "UNC",
  99. "INV",
  100. ""
  101. };
  102. static inline const char *rawfs_block_stat(int i)
  103. {
  104. if (i < 0 || i > 4)
  105. i = 4;
  106. return rawfs_block_stat_str[i];
  107. }
  108. static inline const char *rawfs_page_stat(int i)
  109. {
  110. if (i < 0 || i > 7)
  111. i = 7;
  112. return rawfs_page_stat_str[i];
  113. }
  114. static struct {
  115. char *dbg_name;
  116. int dbg_bit;
  117. } rawfs_dbg_flags[] = {
  118. {"init", RAWFS_DBG_INIT},
  119. {"super", RAWFS_DBG_SUPER},
  120. {"inode", RAWFS_DBG_INODE},
  121. {"file", RAWFS_DBG_FILE},
  122. {"dir", RAWFS_DBG_DIR},
  123. {"device", RAWFS_DBG_DEVICE},
  124. {"dentry", RAWFS_DBG_DENTRY},
  125. {"gc", RAWFS_DBG_GC},
  126. {"all", -1},
  127. {"none", 0},
  128. {NULL, 0},
  129. };
  130. #define MAX_DBG_NAME_LENGTH 30
  131. static int parse_strtoull(const char *buf,
  132. unsigned long long max, unsigned long long *value)
  133. {
  134. int ret;
  135. ret = kstrtoull(skip_spaces(buf), 0, value);
  136. if (!ret && *value > max)
  137. ret = -EINVAL;
  138. return ret;
  139. }
  140. static ssize_t rawfs_proc_write(struct file *filp, const char __user *buf,
  141. size_t len, loff_t *ppos)
  142. {
  143. int result = 0, dbg_bit;
  144. char *dbg_name;
  145. const char *x;
  146. char substring[MAX_DBG_NAME_LENGTH + 1];
  147. int i;
  148. int done = 0;
  149. int add;
  150. int pos = 0;
  151. unsigned long long val;
  152. RAWFS_PRINT(RAWFS_DBG_SUPER, "rawfs_proc_write, current mask %X, %s\n",
  153. rawfs_debug_msg_mask, buf);
  154. result = rawfs_debug_msg_mask;
  155. while (!done && (pos < len)) {
  156. done = 1;
  157. while ((pos < len) && isspace(buf[pos]))
  158. pos++;
  159. switch (buf[pos]) {
  160. case '+':
  161. case '-':
  162. case '=':
  163. add = buf[pos];
  164. pos++;
  165. break;
  166. default:
  167. add = ' ';
  168. break;
  169. }
  170. dbg_name = NULL;
  171. for (x = buf + pos, i = 0;
  172. (*x == '_' || (*x >= 'a' && *x <= 'z')) &&
  173. i < MAX_DBG_NAME_LENGTH; x++, i++, pos++)
  174. substring[i] = *x;
  175. substring[i] = '\0';
  176. for (i = 0; rawfs_dbg_flags[i].dbg_name != NULL; i++) {
  177. if (strcmp(substring, rawfs_dbg_flags[i].dbg_name)
  178. == 0) {
  179. dbg_name = rawfs_dbg_flags[i].dbg_name;
  180. dbg_bit =
  181. rawfs_dbg_flags[i].dbg_bit;
  182. done = 0;
  183. break;
  184. }
  185. }
  186. if (dbg_name != NULL) {
  187. done = 0;
  188. switch (add) {
  189. case '-':
  190. result &= ~dbg_bit;
  191. break;
  192. case '+':
  193. result |= dbg_bit;
  194. break;
  195. case '=':
  196. result = dbg_bit;
  197. break;
  198. default:
  199. result |= dbg_bit;
  200. break;
  201. }
  202. }
  203. }
  204. rawfs_debug_msg_mask = result;
  205. RAWFS_PRINT(RAWFS_DBG_SUPER, "rawfs_proc_write: new trace filter = %X\n",
  206. rawfs_debug_msg_mask);
  207. if (result) {
  208. for (i = 0; rawfs_dbg_flags[i].dbg_name != NULL; i++) {
  209. char flag;
  210. flag = ((result & rawfs_dbg_flags[i].dbg_bit) ==
  211. rawfs_dbg_flags[i].dbg_bit) ? '+' : '-';
  212. RAWFS_PRINT(RAWFS_DBG_SUPER, " %c%s\n", flag,
  213. rawfs_dbg_flags[i].dbg_name);
  214. }
  215. }
  216. return len;
  217. }
  218. static void *rawfs_seq_debug_start(struct seq_file *seq, loff_t *pos)
  219. {
  220. struct super_block *sb = seq->private;
  221. unsigned int block_no;
  222. if (*pos < 0 || *pos >= RAWFS_NAND_BLOCKS(RAWFS_SB(sb)))
  223. return NULL;
  224. block_no = *pos + 1;
  225. return (void *) ((unsigned long) block_no);
  226. }
  227. static void *rawfs_seq_debug_next(struct seq_file *seq, void *v, loff_t *pos)
  228. {
  229. struct super_block *sb = seq->private;
  230. unsigned int block_no;
  231. ++*pos;
  232. if (*pos < 0 || *pos >= RAWFS_NAND_BLOCKS(RAWFS_SB(sb)))
  233. return NULL;
  234. block_no = *pos + 1;
  235. return (void *) ((unsigned long) block_no);
  236. }
  237. static int rawfs_seq_debug_show(struct seq_file *seq, void *v)
  238. {
  239. struct super_block *sb = seq->private;
  240. struct rawfs_sb_info *sbi;
  241. unsigned int block_no = (unsigned int) ((unsigned long) v);
  242. struct rawfs_block_header bh;
  243. struct rawfs_file_info fi;
  244. int i = 0, page, stat_blk;
  245. char devname_buf[BDEVNAME_SIZE + 1];
  246. RAWFS_PRINT(RAWFS_DBG_SUPER, "rawfs_seq_debug_show()\n");
  247. block_no--;
  248. if (!sb)
  249. return 0;
  250. sbi = RAWFS_SB(sb);
  251. mutex_lock(&sbi->rawfs_lock);
  252. if (block_no == 0) {
  253. seq_printf(seq,
  254. "-----------------------------\n"
  255. "[%d] %s @ %d.%d\n"
  256. " <geometry>\n"
  257. " -total blocks %d\n"
  258. " -block size %d\n"
  259. " -page size %d\n"
  260. " -pages per block %d\n"
  261. " -sectors per page %d\n"
  262. " -data per page %d\n",
  263. i, rawfs_devname(sbi->super, devname_buf),
  264. MAJOR(sbi->super->s_dev), MINOR(sbi->super->s_dev),
  265. sbi->total_blocks,
  266. sbi->block_size,
  267. sbi->page_size,
  268. sbi->pages_per_block,
  269. sbi->sectors_per_page,
  270. sbi->page_data_size);
  271. seq_printf(seq,
  272. " <management>\n"
  273. " -data block %d\n"
  274. " - free index %d\n"
  275. " - gc index %d\n"
  276. " -empty block %d\n"
  277. " -max ec %d\n"
  278. " -seq.no %d\n",
  279. sbi->data_block,
  280. sbi->data_block_free_page_index,
  281. sbi->data_block_gcmarker_page_index,
  282. sbi->empty_block,
  283. sbi->erase_count_max,
  284. sbi->sequence_number);
  285. }
  286. stat_blk = rawfs_block_is_valid(sbi->super, block_no, &bh, NULL);
  287. seq_printf(seq,
  288. "<block %d> %s, ver=%d, seq_no=%d, last_seq_no=%d, ec=%d, crc=%X\n",
  289. block_no,
  290. rawfs_block_stat(stat_blk),
  291. bh.i_rawfs_version,
  292. bh.i_sequence_number,
  293. bh.i_sequence_number_last,
  294. bh.i_erase_count,
  295. bh.i_crc);
  296. for (page = 0; page < sbi->pages_per_block; page++) {
  297. int stat_pg;
  298. stat_pg = rawfs_page_get(sbi->super, block_no, page, &fi,
  299. NULL);
  300. if ((stat_pg == RAWFS_PAGE_STAT_VALID) ||
  301. (stat_pg == RAWFS_PAGE_STAT_DELETED)) {
  302. seq_printf(seq,
  303. " -%d %s %s (%d/%d)@%X id=%X %dB\n",
  304. page,
  305. rawfs_page_stat(stat_pg),
  306. fi.i_name,
  307. fi.i_chunk_index,
  308. fi.i_chunk_total,
  309. fi.i_parent_folder_id,
  310. fi.i_id,
  311. (unsigned)fi.i_size);
  312. } else if (stat_pg == RAWFS_PAGE_STAT_EMPTY) {
  313. continue;
  314. } else {
  315. seq_printf(seq,
  316. " -%d %s\n",
  317. page,
  318. rawfs_page_stat(stat_pg));
  319. }
  320. }
  321. mutex_unlock(&sbi->rawfs_lock);
  322. return 0;
  323. }
  324. static void rawfs_seq_debug_stop(struct seq_file *seq, void *v)
  325. {
  326. }
  327. static const struct seq_operations rawfs_seq_debug_ops = {
  328. .start = rawfs_seq_debug_start,
  329. .next = rawfs_seq_debug_next,
  330. .stop = rawfs_seq_debug_stop,
  331. .show = rawfs_seq_debug_show,
  332. };
  333. static int rawfs_seq_debug_open(struct inode *inode, struct file *file)
  334. {
  335. struct super_block *sb = PDE_DATA(inode);
  336. int rc;
  337. rc = seq_open(file, &rawfs_seq_debug_ops);
  338. if (rc == 0) {
  339. struct seq_file *m = file->private_data;
  340. m->private = sb;
  341. }
  342. return rc;
  343. }
  344. static const struct file_operations rawfs_seq_debug_fops = {
  345. .owner = THIS_MODULE,
  346. .open = rawfs_seq_debug_open,
  347. .read = seq_read,
  348. .llseek = seq_lseek,
  349. .release = seq_release,
  350. .write = rawfs_proc_write,
  351. };
  352. static unsigned rawfs_calc_shifts(unsigned a)
  353. {
  354. unsigned bits = 0;
  355. if (!a)
  356. return 0;
  357. while (!(a & 1)) {
  358. a >>= 1;
  359. bits++;
  360. }
  361. return bits;
  362. }
  363. static void
  364. rawfs_put_super(struct super_block *sb)
  365. {
  366. struct rawfs_sb_info *rawfs_sb;
  367. rawfs_sb = RAWFS_SB(sb);
  368. if (rawfs_sb == NULL) /* Empty superblock info passed to unmount */
  369. return;
  370. unload_nls(rawfs_sb->local_nls);
  371. /* FS-FILLIN your fs specific umount logic here */
  372. if (rawfs_sb->driver_context)
  373. put_mtd_device(rawfs_sb->driver_context);
  374. rawfs_context_remove(sb); /* remove from fs context list */
  375. /* Process File */
  376. if (rawfs_sb->s_proc) {
  377. remove_proc_entry("debug", rawfs_sb->s_proc);
  378. remove_proc_entry(sb->s_id, rawfs_proc_root);
  379. }
  380. kfree(rawfs_sb);
  381. }
  382. /* This will be called when using "df" command */
  383. int rawfs_stat_fs(struct dentry *dentry, struct kstatfs *buf)
  384. {
  385. unsigned int entry_count, used_blocks, free_blocks;
  386. int result = 0;
  387. struct super_block *sb = dentry->d_inode->i_sb;
  388. struct rawfs_sb_info *rawfs_sb = RAWFS_SB(sb);
  389. RAWFS_PRINT(RAWFS_DBG_SUPER, "rawfs_stat_fs\n");
  390. if (!buf)
  391. result = -EFAULT;
  392. else
  393. result = rawfs_file_list_count(sb, &entry_count, &used_blocks,
  394. &free_blocks);
  395. if (result)
  396. goto out;
  397. buf->f_type = dentry->d_sb->s_magic; /* RAWFS_MAGIC */
  398. buf->f_bsize = rawfs_sb->page_size; /* PAGE_CACHE_SIZE; */
  399. buf->f_namelen = RAWFS_MAX_FILENAME_LEN; /* NAME_MAX */
  400. buf->f_blocks = rawfs_sb->pages_per_block * rawfs_sb->total_blocks;
  401. buf->f_ffree = free_blocks;
  402. buf->f_bavail = free_blocks;
  403. buf->f_files = entry_count;
  404. buf->f_ffree = free_blocks;
  405. RAWFS_PRINT(RAWFS_DBG_SUPER,
  406. "rawfs_stat_fs: f_type %X, f_blocks %d, f_ffree %d, f_bavail %d, f_namelen %d, f_bsize %d\n",
  407. (unsigned)buf->f_type,
  408. (unsigned)buf->f_blocks,
  409. (unsigned)buf->f_ffree,
  410. (unsigned)buf->f_bavail,
  411. (unsigned)buf->f_bsize,
  412. (unsigned)buf->f_namelen
  413. );
  414. out:
  415. return result;
  416. }
  417. /* RAWFS: To be compeleted */
  418. /* Reference: fat_sops */
  419. struct super_operations rawfs_super_ops = {
  420. .alloc_inode = rawfs_alloc_inode,
  421. .destroy_inode = rawfs_destroy_inode,
  422. /* .write_inode = rawfs_write_inode, // fat_write_inode */
  423. /* .evict_inode = rawfs_evict_inode, // fat_evict_inode */
  424. /* .sync_fs = rawfs_sync_fs, // fat_sync_fs */
  425. .statfs = rawfs_stat_fs, /* simple_statfs, */
  426. .drop_inode = generic_delete_inode, /* Not needed, is the default */
  427. .put_super = rawfs_put_super,
  428. };
  429. static void
  430. rawfs_parse_mount_options(char *options, struct rawfs_sb_info *rawfs_sb)
  431. {
  432. char *value;
  433. char *data;
  434. /* Default is MTD device */
  435. rawfs_sb->flags |= RAWFS_MNT_MTD;
  436. if (!options)
  437. return;
  438. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_parse_mount_options: %s\n", options);
  439. while ((data = strsep(&options, ",")) != NULL) {
  440. if (!*data)
  441. continue;
  442. value = strchr(data, '=');
  443. if (value != NULL)
  444. *value++ = '\0';
  445. else if ((strnicmp(data, "nocase", 6) == 0) ||
  446. (strnicmp(data, "ignorecase", 10) == 0)) {
  447. rawfs_sb->flags |= RAWFS_MNT_CASE;
  448. RAWFS_PRINT(RAWFS_DBG_INIT, "+ ignore case\n");
  449. } else if (strnicmp(data, "ram", 3) == 0) {
  450. rawfs_sb->flags |= RAWFS_MNT_RAM;
  451. rawfs_sb->flags &= ~RAWFS_MNT_MTD;
  452. RAWFS_PRINT(RAWFS_DBG_INIT, "+ ram disk\n");
  453. } else if (strnicmp(data, "mtd", 3) == 0) {
  454. rawfs_sb->flags |= RAWFS_MNT_MTD;
  455. rawfs_sb->flags &= ~RAWFS_MNT_RAM;
  456. RAWFS_PRINT(RAWFS_DBG_INIT, "+ nand mtd\n");
  457. } else if (strnicmp(data, "firstboot", 9) == 0) {
  458. rawfs_sb->flags |= RAWFS_MNT_FIRSTBOOT;
  459. RAWFS_PRINT(RAWFS_DBG_INIT, "+ first boot\n");
  460. } else if (strnicmp(data, "blockfile", 9) == 0) {
  461. rawfs_sb->flags |= RAWFS_MNT_BLOCKFILE;
  462. RAWFS_PRINT(RAWFS_DBG_INIT, "+ block file\n");
  463. } else {
  464. RAWFS_PRINT(RAWFS_DBG_INIT, "+ bad mount option %s\n",
  465. data);
  466. }
  467. }
  468. }
  469. int rawfs_ci_hash(const struct dentry *dentry, struct qstr *q)
  470. {
  471. struct nls_table *codepage = RAWFS_SB(dentry->d_inode->i_sb)->local_nls;
  472. unsigned long hash;
  473. int i;
  474. hash = init_name_hash();
  475. for (i = 0; i < q->len; i++)
  476. hash = partial_name_hash(nls_tolower(codepage, q->name[i]),
  477. hash);
  478. q->hash = end_name_hash(hash);
  479. return 0;
  480. }
  481. EXPORT_SYMBOL_GPL(rawfs_ci_hash);
  482. int rawfs_compare_dentry(const struct dentry *parent,
  483. const struct dentry *dentry, unsigned int len, const char *str,
  484. const struct qstr *name)
  485. {
  486. struct nls_table *codepage = RAWFS_SB(dentry->d_inode->i_sb)->local_nls;
  487. if (len != name->len)
  488. return 1;
  489. return nls_strnicmp(codepage, str, name->name, len);
  490. }
  491. EXPORT_SYMBOL_GPL(rawfs_compare_dentry);
  492. /* No sense hanging on to negative dentries as they are only
  493. in memory - we are not saving anything as we would for network
  494. or disk filesystem */
  495. int rawfs_delete_dentry(const struct dentry *dentry)
  496. {
  497. RAWFS_PRINT(RAWFS_DBG_DENTRY, "delete entry %s\n", dentry->d_name.name);
  498. return 1;
  499. }
  500. EXPORT_SYMBOL_GPL(rawfs_delete_dentry);
  501. uint32_t rawfs_div(uint64_t n, uint32_t base)
  502. {
  503. uint64_t result = n;
  504. do_div(result, base);
  505. return (uint32_t) result;
  506. }
  507. EXPORT_SYMBOL_GPL(rawfs_div);
  508. #define RAWFS_DEV_RAM_PAGE_SIZE 1024
  509. #define RAWFS_DEV_RAM_PAGES_PER_BLOCK 64
  510. #define RAWFS_DEV_RAM_BLOCKS 2
  511. static void rawfs_dbg_sb_info(struct super_block *sb)
  512. {
  513. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: page_size %d\n",
  514. RAWFS_SB(sb)->page_size);
  515. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: pages_per_block %d\n",
  516. RAWFS_SB(sb)->pages_per_block);
  517. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: total_blocks %d\n",
  518. RAWFS_SB(sb)->total_blocks);
  519. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: block_size %d\n",
  520. RAWFS_SB(sb)->block_size);
  521. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: sectors_per_page %d\n",
  522. RAWFS_SB(sb)->sectors_per_page);
  523. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: page_data_size %d\n",
  524. RAWFS_SB(sb)->page_data_size);
  525. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: dev.erase_block %p\n",
  526. RAWFS_SB(sb)->dev.erase_block);
  527. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: dev.read_page %p\n",
  528. RAWFS_SB(sb)->dev.read_page);
  529. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: dev.read_page_user %p\n",
  530. RAWFS_SB(sb)->dev.read_page_user);
  531. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: dev.write_page %p\n",
  532. RAWFS_SB(sb)->dev.write_page);
  533. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_dbg_sb_info: driver_context %p\n",
  534. RAWFS_SB(sb)->driver_context);
  535. }
  536. #ifdef RAWFS_RAM_DISK
  537. /*
  538. char rawfs_ram_disk[RAWFS_DEV_RAM_PAGE_SIZE*
  539. RAWFS_DEV_RAM_PAGES_PER_BLOCK*
  540. RAWFS_DEV_RAM_BLOCKS];
  541. */
  542. static void rawfs_ram_init(void *data, struct rawfs_sb_info *rawfs_sb)
  543. {
  544. rawfs_sb->page_size = RAWFS_DEV_RAM_PAGE_SIZE;
  545. rawfs_sb->pages_per_block = RAWFS_DEV_RAM_PAGES_PER_BLOCK;
  546. rawfs_sb->total_blocks = RAWFS_DEV_RAM_BLOCKS;
  547. rawfs_sb->block_size = rawfs_sb->pages_per_block * rawfs_sb->page_size;
  548. rawfs_sb->sectors_per_page = RAWFS_DEV_RAM_PAGE_SIZE >> 9;
  549. rawfs_sb->page_data_size = RAWFS_DEV_RAM_PAGE_SIZE - 512;
  550. rawfs_sb->dev.erase_block = rawfs_dev_ram_erase_block;
  551. rawfs_sb->dev.read_page = rawfs_dev_ram_read_page;
  552. rawfs_sb->dev.read_page_user = rawfs_dev_ram_read_page_user;
  553. rawfs_sb->dev.write_page = rawfs_dev_ram_write_page;
  554. rawfs_sb->driver_context = NULL;
  555. }
  556. #endif
  557. static int rawfs_mtd_init(struct super_block *sb, void *data, int silent)
  558. {
  559. char devname_buf[BDEVNAME_SIZE + 1];
  560. struct mtd_info *mtd;
  561. struct rawfs_sb_info *rawfs_sb;
  562. if (!sb)
  563. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: sb is NULL\n");
  564. else if (!sb->s_dev)
  565. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: sb->s_dev is NULL\n");
  566. else if (!rawfs_devname(sb, devname_buf))
  567. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: devname is NULL\n");
  568. else
  569. RAWFS_PRINT(RAWFS_DBG_INIT,
  570. "rawfs_mtd_init: dev is %d name is \"%s\"\n",
  571. sb->s_dev, rawfs_devname(sb, devname_buf));
  572. RAWFS_PRINT(RAWFS_DBG_INIT,
  573. "rawfs_mtd_init: Attempting MTD mount of %u.%u,\"%s\"\n",
  574. MAJOR(sb->s_dev), MINOR(sb->s_dev), rawfs_devname(sb, devname_buf));
  575. /* Check it's an mtd device..... */
  576. if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) {
  577. RAWFS_PRINT(RAWFS_DBG_INIT,
  578. "rawfs_mtd_init: Major %d is not a MTD block device\n", MAJOR(sb->s_dev));
  579. return -1; /* This isn't an mtd device */
  580. }
  581. /* Get the device */
  582. mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
  583. if (!mtd) {
  584. RAWFS_PRINT(RAWFS_DBG_INIT,
  585. "rawfs_mtd_init: MTD device #%u doesn't appear to exist",
  586. MINOR(sb->s_dev));
  587. return -1;
  588. }
  589. /* Check it's NAND */
  590. if (!(mtd->type == MTD_NANDFLASH || mtd->type == MTD_MLCNANDFLASH)) {
  591. RAWFS_PRINT(RAWFS_DBG_INIT,
  592. "rawfs_mtd_init: MTD device is not NAND it's type %d",
  593. mtd->type);
  594. return -1;
  595. }
  596. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: erase %p", mtd->_erase);
  597. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: read %p", mtd->_read);
  598. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: write %p", mtd->_write);
  599. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: readoob %p", mtd->_read_oob);
  600. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: writeoob %p",
  601. mtd->_write_oob);
  602. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: block_isbad %p",
  603. mtd->_block_isbad);
  604. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: block_markbad %p",
  605. mtd->_block_markbad);
  606. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: write (page) size %d",
  607. mtd->writesize);
  608. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: oobsize %d", mtd->oobsize);
  609. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: erase (block) size %d",
  610. mtd->erasesize);
  611. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: size %lld", mtd->size);
  612. rawfs_sb = RAWFS_SB(sb);
  613. rawfs_sb->block_size = mtd->erasesize;
  614. rawfs_sb->page_size = mtd->writesize;
  615. rawfs_sb->pages_per_block = rawfs_div(rawfs_sb->block_size,
  616. rawfs_sb->page_size);
  617. rawfs_sb->total_blocks = rawfs_div(mtd->size, mtd->erasesize);
  618. rawfs_sb->sectors_per_page = rawfs_sb->page_size >> 9;
  619. rawfs_sb->page_data_size = rawfs_sb->page_size - 512;
  620. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: total blocks %d",
  621. rawfs_sb->total_blocks);
  622. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: pages per block %d",
  623. rawfs_sb->pages_per_block);
  624. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: sectors per page %d",
  625. rawfs_sb->sectors_per_page);
  626. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mtd_init: data storage per page %d",
  627. rawfs_sb->page_data_size);
  628. rawfs_sb->driver_context = mtd;
  629. rawfs_sb->dev.erase_block = rawfs_dev_mtd_erase_block;
  630. rawfs_sb->dev.read_page = rawfs_dev_mtd_read_page;
  631. rawfs_sb->dev.read_page_user = rawfs_dev_mtd_read_page_user;
  632. rawfs_sb->dev.write_page = rawfs_dev_mtd_write_page;
  633. #ifdef MTK_NAND_PL_TEST
  634. mtk_nand_register_pl_test(0x480000 >> mtd->writesize_shift,
  635. 0x80000 >> mtd->writesize_shift, 0);
  636. #endif
  637. return 0;
  638. }
  639. static int rawfs_fill_super(struct super_block *sb, void *data, int silent)
  640. {
  641. int result;
  642. struct inode *inode;
  643. struct rawfs_sb_info *rawfs_sb;
  644. sb->s_magic = RAWFS_MAGIC;
  645. sb->s_op = &rawfs_super_ops;
  646. sb->s_time_gran = 1; /* 1 nanosecond time granularity */
  647. RAWFS_PRINT(RAWFS_DBG_INIT,
  648. "fill super, rawfs_file_info=%ld, rawfs_page_header=%ld\n",
  649. (unsigned long)sizeof(struct rawfs_file_info),
  650. (unsigned long)sizeof(struct rawfs_page));
  651. /* Allocate SB Info */
  652. sb->s_fs_info = kzalloc(sizeof(struct rawfs_sb_info), GFP_KERNEL);
  653. rawfs_sb = RAWFS_SB(sb);
  654. if (!rawfs_sb)
  655. return -ENOMEM;
  656. /* Parse mount options */
  657. rawfs_parse_mount_options(data, rawfs_sb);
  658. #ifdef RAWFS_BLOCK_FILE
  659. rawfs_sb->flags |= RAWFS_MNT_BLOCKFILE;
  660. #endif
  661. /* init inode hash tables */
  662. rawfs_hash_init(sb);
  663. /* init file list */
  664. rawfs_file_list_init(sb);
  665. /* read device information */
  666. /* init locks & mutex */
  667. mutex_init(&rawfs_sb->rawfs_lock);
  668. mutex_init(&rawfs_sb->file_list_lock);
  669. /* Mount on RAM */
  670. #ifdef RAWFS_RAM_DISK
  671. if (rawfs_sb->flags & RAWFS_MNT_RAM) {
  672. rawfs_ram_init(data, rawfs_sb);
  673. rawfs_sb->fake_block = kzalloc(rawfs_sb->total_blocks *
  674. rawfs_sb->block_size, GFP_NOFS);
  675. /* rawfs_sb->fake_block = &rawfs_ram_disk[0]; */
  676. if (!rawfs_sb->fake_block)
  677. return -ENOMEM;
  678. }
  679. #endif
  680. /* Mount on MTD */
  681. if (rawfs_sb->flags & RAWFS_MNT_MTD)
  682. rawfs_mtd_init(sb, data, silent);
  683. rawfs_dbg_sb_info(sb);
  684. sb->s_maxbytes = (rawfs_sb->pages_per_block-3) * rawfs_sb->page_data_size;
  685. sb->s_blocksize = rawfs_sb->page_size;
  686. sb->s_blocksize_bits = rawfs_calc_shifts(rawfs_sb->page_size);
  687. inode = new_inode(sb);
  688. if (!inode) {
  689. kfree(rawfs_sb);
  690. return -ENOMEM;
  691. }
  692. /* fill root inode: S_IFDIR, NULL, -1 */
  693. rawfs_fill_inode(inode, NULL, -1, -1, S_IFDIR | 0755, 0);
  694. sb->s_root = d_make_root(inode);
  695. if (!sb->s_root) {
  696. iput(inode);
  697. kfree(rawfs_sb);
  698. return -ENOMEM;
  699. }
  700. /* below not needed for many fs - but an example of per fs sb data */
  701. rawfs_sb->local_nls = load_nls_default();
  702. /* FS-FILLIN your filesystem specific mount logic/checks here */
  703. result = rawfs_block_level_analysis(sb); /* Build block file inodes */
  704. if (result < 0)
  705. goto end;
  706. /* Adding block file */
  707. if (rawfs_sb->flags & RAWFS_MNT_BLOCKFILE) {
  708. struct rawfs_file_info fi;
  709. memset(&fi, 0, sizeof(struct rawfs_file_info));
  710. fi.i_atime = fi.i_mtime = fi.i_ctime = CURRENT_TIME_SEC;
  711. fi.i_uid = current_fsuid().val;
  712. fi.i_gid = current_fsgid().val; /* current->fsgid; */
  713. fi.i_parent_folder_id = RAWFS_ROOT_DIR_ID;
  714. fi.i_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH;
  715. fi.i_id = RAWFS_BLOCK0_INO;
  716. strncpy(fi.i_name, ".block0", RAWFS_MAX_FILENAME_LEN+4);
  717. rawfs_file_list_add(sb, &fi, 0, -1);
  718. fi.i_id = RAWFS_BLOCK1_INO;
  719. strncpy(fi.i_name, ".block1", RAWFS_MAX_FILENAME_LEN+4);
  720. rawfs_file_list_add(sb, &fi, 1, -1);
  721. }
  722. result = rawfs_page_level_analysis(sb); /* Build regular file inodes */
  723. if (result < 0)
  724. goto end;
  725. rawfs_file_level_analysis(sb);
  726. if (rawfs_context == NULL)
  727. rawfs_context_init();
  728. rawfs_context_add(sb); /* Add to fs context list */
  729. /* Process File */
  730. if (rawfs_proc_root)
  731. rawfs_sb->s_proc = proc_mkdir(sb->s_id, rawfs_proc_root);
  732. if (rawfs_sb->s_proc)
  733. proc_create_data("debug", S_IRUGO, rawfs_sb->s_proc,
  734. &rawfs_seq_debug_fops, sb);
  735. end:
  736. return result;
  737. }
  738. static struct dentry *rawfs_mount(struct file_system_type *fs_type,
  739. int flags, const char *dev_name, void *data)
  740. {
  741. struct rawfs_sb_info peek_sb;
  742. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mount");
  743. /* peek mount options */
  744. rawfs_parse_mount_options(data, &peek_sb);
  745. if (peek_sb.flags & RAWFS_MNT_MTD) {
  746. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mount: mount on %s", dev_name);
  747. return mount_bdev(fs_type, flags, dev_name, data, rawfs_fill_super);
  748. }
  749. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_mount: mount on RAM");
  750. return mount_nodev(fs_type, flags, data, rawfs_fill_super);
  751. }
  752. static void rawfs_kill_super(struct super_block *sb)
  753. {
  754. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_kill_super: unmount\n");
  755. rawfs_file_list_destroy(sb);
  756. kill_litter_super(sb);
  757. }
  758. static struct file_system_type rawfs_fs_type = {
  759. .owner = THIS_MODULE,
  760. .name = "rawfs",
  761. .mount = rawfs_mount,
  762. /* .get_sb = rawfs_get_sb, */
  763. .kill_sb = rawfs_kill_super,
  764. /* .fs_flags */
  765. };
  766. /* ------------------------------------------------------------------------------ */
  767. static int __init init_rawfs_fs(void)
  768. {
  769. int err;
  770. RAWFS_PRINT(RAWFS_DBG_INIT, "Module Init\n");
  771. #ifdef CONFIG_PROC_FS
  772. err = rawfs_proc_init();
  773. #endif
  774. /* filesystem pass optional parms at load time */
  775. if (rawfs_parm > 1024) {
  776. RAWFS_PRINT(RAWFS_DBG_INIT, "rawfs_parm %d exceeds limit\n",
  777. rawfs_parm);
  778. rawfs_parm = 128;
  779. }
  780. err = rawfs_init_inodecache();
  781. if (err)
  782. goto out;
  783. err = register_filesystem(&rawfs_fs_type);
  784. out:
  785. return err;
  786. }
  787. static void __exit exit_rawfs_fs(void)
  788. {
  789. RAWFS_PRINT(RAWFS_DBG_INIT, "Module Exit\n");
  790. #ifdef CONFIG_PROC_FS
  791. rawfs_proc_clean();
  792. #endif
  793. rawfs_destroy_inodecache();
  794. unregister_filesystem(&rawfs_fs_type);
  795. }
  796. module_init(init_rawfs_fs)
  797. module_exit(exit_rawfs_fs)
  798. MODULE_AUTHOR("Perry Hsu <perry.hsu@mediatek.com>");
  799. MODULE_DESCRIPTION("RAW file system for NAND flash");
  800. MODULE_LICENSE("GPL");