inode.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. /*
  2. * linux/fs/minix/inode.c
  3. *
  4. * Copyright (C) 1991, 1992 Linus Torvalds
  5. *
  6. * Copyright (C) 1996 Gertjan van Wingerde (gertjan@cs.vu.nl)
  7. * Minix V2 fs support.
  8. *
  9. * Modified for 680x0 by Andreas Schwab
  10. */
  11. #include <linux/module.h>
  12. #include "minix.h"
  13. #include <linux/buffer_head.h>
  14. #include <linux/slab.h>
  15. #include <linux/init.h>
  16. #include <linux/highuid.h>
  17. #include <linux/vfs.h>
  18. static void minix_read_inode(struct inode * inode);
  19. static int minix_write_inode(struct inode * inode, int wait);
  20. static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
  21. static int minix_remount (struct super_block * sb, int * flags, char * data);
  22. static void minix_delete_inode(struct inode *inode)
  23. {
  24. truncate_inode_pages(&inode->i_data, 0);
  25. inode->i_size = 0;
  26. minix_truncate(inode);
  27. minix_free_inode(inode);
  28. }
  29. static void minix_put_super(struct super_block *sb)
  30. {
  31. int i;
  32. struct minix_sb_info *sbi = minix_sb(sb);
  33. if (!(sb->s_flags & MS_RDONLY)) {
  34. sbi->s_ms->s_state = sbi->s_mount_state;
  35. mark_buffer_dirty(sbi->s_sbh);
  36. }
  37. for (i = 0; i < sbi->s_imap_blocks; i++)
  38. brelse(sbi->s_imap[i]);
  39. for (i = 0; i < sbi->s_zmap_blocks; i++)
  40. brelse(sbi->s_zmap[i]);
  41. brelse (sbi->s_sbh);
  42. kfree(sbi->s_imap);
  43. sb->s_fs_info = NULL;
  44. kfree(sbi);
  45. return;
  46. }
  47. static kmem_cache_t * minix_inode_cachep;
  48. static struct inode *minix_alloc_inode(struct super_block *sb)
  49. {
  50. struct minix_inode_info *ei;
  51. ei = (struct minix_inode_info *)kmem_cache_alloc(minix_inode_cachep, SLAB_KERNEL);
  52. if (!ei)
  53. return NULL;
  54. return &ei->vfs_inode;
  55. }
  56. static void minix_destroy_inode(struct inode *inode)
  57. {
  58. kmem_cache_free(minix_inode_cachep, minix_i(inode));
  59. }
  60. static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
  61. {
  62. struct minix_inode_info *ei = (struct minix_inode_info *) foo;
  63. if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
  64. SLAB_CTOR_CONSTRUCTOR)
  65. inode_init_once(&ei->vfs_inode);
  66. }
  67. static int init_inodecache(void)
  68. {
  69. minix_inode_cachep = kmem_cache_create("minix_inode_cache",
  70. sizeof(struct minix_inode_info),
  71. 0, (SLAB_RECLAIM_ACCOUNT|
  72. SLAB_MEM_SPREAD),
  73. init_once, NULL);
  74. if (minix_inode_cachep == NULL)
  75. return -ENOMEM;
  76. return 0;
  77. }
  78. static void destroy_inodecache(void)
  79. {
  80. kmem_cache_destroy(minix_inode_cachep);
  81. }
  82. static struct super_operations minix_sops = {
  83. .alloc_inode = minix_alloc_inode,
  84. .destroy_inode = minix_destroy_inode,
  85. .read_inode = minix_read_inode,
  86. .write_inode = minix_write_inode,
  87. .delete_inode = minix_delete_inode,
  88. .put_super = minix_put_super,
  89. .statfs = minix_statfs,
  90. .remount_fs = minix_remount,
  91. };
  92. static int minix_remount (struct super_block * sb, int * flags, char * data)
  93. {
  94. struct minix_sb_info * sbi = minix_sb(sb);
  95. struct minix_super_block * ms;
  96. ms = sbi->s_ms;
  97. if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
  98. return 0;
  99. if (*flags & MS_RDONLY) {
  100. if (ms->s_state & MINIX_VALID_FS ||
  101. !(sbi->s_mount_state & MINIX_VALID_FS))
  102. return 0;
  103. /* Mounting a rw partition read-only. */
  104. ms->s_state = sbi->s_mount_state;
  105. mark_buffer_dirty(sbi->s_sbh);
  106. } else {
  107. /* Mount a partition which is read-only, read-write. */
  108. sbi->s_mount_state = ms->s_state;
  109. ms->s_state &= ~MINIX_VALID_FS;
  110. mark_buffer_dirty(sbi->s_sbh);
  111. if (!(sbi->s_mount_state & MINIX_VALID_FS))
  112. printk("MINIX-fs warning: remounting unchecked fs, "
  113. "running fsck is recommended\n");
  114. else if ((sbi->s_mount_state & MINIX_ERROR_FS))
  115. printk("MINIX-fs warning: remounting fs with errors, "
  116. "running fsck is recommended\n");
  117. }
  118. return 0;
  119. }
  120. static int minix_fill_super(struct super_block *s, void *data, int silent)
  121. {
  122. struct buffer_head *bh;
  123. struct buffer_head **map;
  124. struct minix_super_block *ms;
  125. int i, block;
  126. struct inode *root_inode;
  127. struct minix_sb_info *sbi;
  128. sbi = kzalloc(sizeof(struct minix_sb_info), GFP_KERNEL);
  129. if (!sbi)
  130. return -ENOMEM;
  131. s->s_fs_info = sbi;
  132. /* N.B. These should be compile-time tests.
  133. Unfortunately that is impossible. */
  134. if (32 != sizeof (struct minix_inode))
  135. panic("bad V1 i-node size");
  136. if (64 != sizeof(struct minix2_inode))
  137. panic("bad V2 i-node size");
  138. if (!sb_set_blocksize(s, BLOCK_SIZE))
  139. goto out_bad_hblock;
  140. if (!(bh = sb_bread(s, 1)))
  141. goto out_bad_sb;
  142. ms = (struct minix_super_block *) bh->b_data;
  143. sbi->s_ms = ms;
  144. sbi->s_sbh = bh;
  145. sbi->s_mount_state = ms->s_state;
  146. sbi->s_ninodes = ms->s_ninodes;
  147. sbi->s_nzones = ms->s_nzones;
  148. sbi->s_imap_blocks = ms->s_imap_blocks;
  149. sbi->s_zmap_blocks = ms->s_zmap_blocks;
  150. sbi->s_firstdatazone = ms->s_firstdatazone;
  151. sbi->s_log_zone_size = ms->s_log_zone_size;
  152. sbi->s_max_size = ms->s_max_size;
  153. s->s_magic = ms->s_magic;
  154. if (s->s_magic == MINIX_SUPER_MAGIC) {
  155. sbi->s_version = MINIX_V1;
  156. sbi->s_dirsize = 16;
  157. sbi->s_namelen = 14;
  158. sbi->s_link_max = MINIX_LINK_MAX;
  159. } else if (s->s_magic == MINIX_SUPER_MAGIC2) {
  160. sbi->s_version = MINIX_V1;
  161. sbi->s_dirsize = 32;
  162. sbi->s_namelen = 30;
  163. sbi->s_link_max = MINIX_LINK_MAX;
  164. } else if (s->s_magic == MINIX2_SUPER_MAGIC) {
  165. sbi->s_version = MINIX_V2;
  166. sbi->s_nzones = ms->s_zones;
  167. sbi->s_dirsize = 16;
  168. sbi->s_namelen = 14;
  169. sbi->s_link_max = MINIX2_LINK_MAX;
  170. } else if (s->s_magic == MINIX2_SUPER_MAGIC2) {
  171. sbi->s_version = MINIX_V2;
  172. sbi->s_nzones = ms->s_zones;
  173. sbi->s_dirsize = 32;
  174. sbi->s_namelen = 30;
  175. sbi->s_link_max = MINIX2_LINK_MAX;
  176. } else
  177. goto out_no_fs;
  178. /*
  179. * Allocate the buffer map to keep the superblock small.
  180. */
  181. if (sbi->s_imap_blocks == 0 || sbi->s_zmap_blocks == 0)
  182. goto out_illegal_sb;
  183. i = (sbi->s_imap_blocks + sbi->s_zmap_blocks) * sizeof(bh);
  184. map = kzalloc(i, GFP_KERNEL);
  185. if (!map)
  186. goto out_no_map;
  187. sbi->s_imap = &map[0];
  188. sbi->s_zmap = &map[sbi->s_imap_blocks];
  189. block=2;
  190. for (i=0 ; i < sbi->s_imap_blocks ; i++) {
  191. if (!(sbi->s_imap[i]=sb_bread(s, block)))
  192. goto out_no_bitmap;
  193. block++;
  194. }
  195. for (i=0 ; i < sbi->s_zmap_blocks ; i++) {
  196. if (!(sbi->s_zmap[i]=sb_bread(s, block)))
  197. goto out_no_bitmap;
  198. block++;
  199. }
  200. minix_set_bit(0,sbi->s_imap[0]->b_data);
  201. minix_set_bit(0,sbi->s_zmap[0]->b_data);
  202. /* set up enough so that it can read an inode */
  203. s->s_op = &minix_sops;
  204. root_inode = iget(s, MINIX_ROOT_INO);
  205. if (!root_inode || is_bad_inode(root_inode))
  206. goto out_no_root;
  207. s->s_root = d_alloc_root(root_inode);
  208. if (!s->s_root)
  209. goto out_iput;
  210. if (!NO_TRUNCATE)
  211. s->s_root->d_op = &minix_dentry_operations;
  212. if (!(s->s_flags & MS_RDONLY)) {
  213. ms->s_state &= ~MINIX_VALID_FS;
  214. mark_buffer_dirty(bh);
  215. }
  216. if (!(sbi->s_mount_state & MINIX_VALID_FS))
  217. printk("MINIX-fs: mounting unchecked file system, "
  218. "running fsck is recommended\n");
  219. else if (sbi->s_mount_state & MINIX_ERROR_FS)
  220. printk("MINIX-fs: mounting file system with errors, "
  221. "running fsck is recommended\n");
  222. return 0;
  223. out_iput:
  224. iput(root_inode);
  225. goto out_freemap;
  226. out_no_root:
  227. if (!silent)
  228. printk("MINIX-fs: get root inode failed\n");
  229. goto out_freemap;
  230. out_no_bitmap:
  231. printk("MINIX-fs: bad superblock or unable to read bitmaps\n");
  232. out_freemap:
  233. for (i = 0; i < sbi->s_imap_blocks; i++)
  234. brelse(sbi->s_imap[i]);
  235. for (i = 0; i < sbi->s_zmap_blocks; i++)
  236. brelse(sbi->s_zmap[i]);
  237. kfree(sbi->s_imap);
  238. goto out_release;
  239. out_no_map:
  240. if (!silent)
  241. printk("MINIX-fs: can't allocate map\n");
  242. goto out_release;
  243. out_illegal_sb:
  244. if (!silent)
  245. printk("MINIX-fs: bad superblock\n");
  246. goto out_release;
  247. out_no_fs:
  248. if (!silent)
  249. printk("VFS: Can't find a Minix or Minix V2 filesystem "
  250. "on device %s\n", s->s_id);
  251. out_release:
  252. brelse(bh);
  253. goto out;
  254. out_bad_hblock:
  255. printk("MINIX-fs: blocksize too small for device\n");
  256. goto out;
  257. out_bad_sb:
  258. printk("MINIX-fs: unable to read superblock\n");
  259. out:
  260. s->s_fs_info = NULL;
  261. kfree(sbi);
  262. return -EINVAL;
  263. }
  264. static int minix_statfs(struct dentry *dentry, struct kstatfs *buf)
  265. {
  266. struct minix_sb_info *sbi = minix_sb(dentry->d_sb);
  267. buf->f_type = dentry->d_sb->s_magic;
  268. buf->f_bsize = dentry->d_sb->s_blocksize;
  269. buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size;
  270. buf->f_bfree = minix_count_free_blocks(sbi);
  271. buf->f_bavail = buf->f_bfree;
  272. buf->f_files = sbi->s_ninodes;
  273. buf->f_ffree = minix_count_free_inodes(sbi);
  274. buf->f_namelen = sbi->s_namelen;
  275. return 0;
  276. }
  277. static int minix_get_block(struct inode *inode, sector_t block,
  278. struct buffer_head *bh_result, int create)
  279. {
  280. if (INODE_VERSION(inode) == MINIX_V1)
  281. return V1_minix_get_block(inode, block, bh_result, create);
  282. else
  283. return V2_minix_get_block(inode, block, bh_result, create);
  284. }
  285. static int minix_writepage(struct page *page, struct writeback_control *wbc)
  286. {
  287. return block_write_full_page(page, minix_get_block, wbc);
  288. }
  289. static int minix_readpage(struct file *file, struct page *page)
  290. {
  291. return block_read_full_page(page,minix_get_block);
  292. }
  293. static int minix_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
  294. {
  295. return block_prepare_write(page,from,to,minix_get_block);
  296. }
  297. static sector_t minix_bmap(struct address_space *mapping, sector_t block)
  298. {
  299. return generic_block_bmap(mapping,block,minix_get_block);
  300. }
  301. static const struct address_space_operations minix_aops = {
  302. .readpage = minix_readpage,
  303. .writepage = minix_writepage,
  304. .sync_page = block_sync_page,
  305. .prepare_write = minix_prepare_write,
  306. .commit_write = generic_commit_write,
  307. .bmap = minix_bmap
  308. };
  309. static struct inode_operations minix_symlink_inode_operations = {
  310. .readlink = generic_readlink,
  311. .follow_link = page_follow_link_light,
  312. .put_link = page_put_link,
  313. .getattr = minix_getattr,
  314. };
  315. void minix_set_inode(struct inode *inode, dev_t rdev)
  316. {
  317. if (S_ISREG(inode->i_mode)) {
  318. inode->i_op = &minix_file_inode_operations;
  319. inode->i_fop = &minix_file_operations;
  320. inode->i_mapping->a_ops = &minix_aops;
  321. } else if (S_ISDIR(inode->i_mode)) {
  322. inode->i_op = &minix_dir_inode_operations;
  323. inode->i_fop = &minix_dir_operations;
  324. inode->i_mapping->a_ops = &minix_aops;
  325. } else if (S_ISLNK(inode->i_mode)) {
  326. inode->i_op = &minix_symlink_inode_operations;
  327. inode->i_mapping->a_ops = &minix_aops;
  328. } else
  329. init_special_inode(inode, inode->i_mode, rdev);
  330. }
  331. /*
  332. * The minix V1 function to read an inode.
  333. */
  334. static void V1_minix_read_inode(struct inode * inode)
  335. {
  336. struct buffer_head * bh;
  337. struct minix_inode * raw_inode;
  338. struct minix_inode_info *minix_inode = minix_i(inode);
  339. int i;
  340. raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
  341. if (!raw_inode) {
  342. make_bad_inode(inode);
  343. return;
  344. }
  345. inode->i_mode = raw_inode->i_mode;
  346. inode->i_uid = (uid_t)raw_inode->i_uid;
  347. inode->i_gid = (gid_t)raw_inode->i_gid;
  348. inode->i_nlink = raw_inode->i_nlinks;
  349. inode->i_size = raw_inode->i_size;
  350. inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = raw_inode->i_time;
  351. inode->i_mtime.tv_nsec = 0;
  352. inode->i_atime.tv_nsec = 0;
  353. inode->i_ctime.tv_nsec = 0;
  354. inode->i_blocks = 0;
  355. for (i = 0; i < 9; i++)
  356. minix_inode->u.i1_data[i] = raw_inode->i_zone[i];
  357. minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
  358. brelse(bh);
  359. }
  360. /*
  361. * The minix V2 function to read an inode.
  362. */
  363. static void V2_minix_read_inode(struct inode * inode)
  364. {
  365. struct buffer_head * bh;
  366. struct minix2_inode * raw_inode;
  367. struct minix_inode_info *minix_inode = minix_i(inode);
  368. int i;
  369. raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
  370. if (!raw_inode) {
  371. make_bad_inode(inode);
  372. return;
  373. }
  374. inode->i_mode = raw_inode->i_mode;
  375. inode->i_uid = (uid_t)raw_inode->i_uid;
  376. inode->i_gid = (gid_t)raw_inode->i_gid;
  377. inode->i_nlink = raw_inode->i_nlinks;
  378. inode->i_size = raw_inode->i_size;
  379. inode->i_mtime.tv_sec = raw_inode->i_mtime;
  380. inode->i_atime.tv_sec = raw_inode->i_atime;
  381. inode->i_ctime.tv_sec = raw_inode->i_ctime;
  382. inode->i_mtime.tv_nsec = 0;
  383. inode->i_atime.tv_nsec = 0;
  384. inode->i_ctime.tv_nsec = 0;
  385. inode->i_blocks = 0;
  386. for (i = 0; i < 10; i++)
  387. minix_inode->u.i2_data[i] = raw_inode->i_zone[i];
  388. minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
  389. brelse(bh);
  390. }
  391. /*
  392. * The global function to read an inode.
  393. */
  394. static void minix_read_inode(struct inode * inode)
  395. {
  396. if (INODE_VERSION(inode) == MINIX_V1)
  397. V1_minix_read_inode(inode);
  398. else
  399. V2_minix_read_inode(inode);
  400. }
  401. /*
  402. * The minix V1 function to synchronize an inode.
  403. */
  404. static struct buffer_head * V1_minix_update_inode(struct inode * inode)
  405. {
  406. struct buffer_head * bh;
  407. struct minix_inode * raw_inode;
  408. struct minix_inode_info *minix_inode = minix_i(inode);
  409. int i;
  410. raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
  411. if (!raw_inode)
  412. return NULL;
  413. raw_inode->i_mode = inode->i_mode;
  414. raw_inode->i_uid = fs_high2lowuid(inode->i_uid);
  415. raw_inode->i_gid = fs_high2lowgid(inode->i_gid);
  416. raw_inode->i_nlinks = inode->i_nlink;
  417. raw_inode->i_size = inode->i_size;
  418. raw_inode->i_time = inode->i_mtime.tv_sec;
  419. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  420. raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
  421. else for (i = 0; i < 9; i++)
  422. raw_inode->i_zone[i] = minix_inode->u.i1_data[i];
  423. mark_buffer_dirty(bh);
  424. return bh;
  425. }
  426. /*
  427. * The minix V2 function to synchronize an inode.
  428. */
  429. static struct buffer_head * V2_minix_update_inode(struct inode * inode)
  430. {
  431. struct buffer_head * bh;
  432. struct minix2_inode * raw_inode;
  433. struct minix_inode_info *minix_inode = minix_i(inode);
  434. int i;
  435. raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
  436. if (!raw_inode)
  437. return NULL;
  438. raw_inode->i_mode = inode->i_mode;
  439. raw_inode->i_uid = fs_high2lowuid(inode->i_uid);
  440. raw_inode->i_gid = fs_high2lowgid(inode->i_gid);
  441. raw_inode->i_nlinks = inode->i_nlink;
  442. raw_inode->i_size = inode->i_size;
  443. raw_inode->i_mtime = inode->i_mtime.tv_sec;
  444. raw_inode->i_atime = inode->i_atime.tv_sec;
  445. raw_inode->i_ctime = inode->i_ctime.tv_sec;
  446. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  447. raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
  448. else for (i = 0; i < 10; i++)
  449. raw_inode->i_zone[i] = minix_inode->u.i2_data[i];
  450. mark_buffer_dirty(bh);
  451. return bh;
  452. }
  453. static struct buffer_head *minix_update_inode(struct inode *inode)
  454. {
  455. if (INODE_VERSION(inode) == MINIX_V1)
  456. return V1_minix_update_inode(inode);
  457. else
  458. return V2_minix_update_inode(inode);
  459. }
  460. static int minix_write_inode(struct inode * inode, int wait)
  461. {
  462. brelse(minix_update_inode(inode));
  463. return 0;
  464. }
  465. int minix_sync_inode(struct inode * inode)
  466. {
  467. int err = 0;
  468. struct buffer_head *bh;
  469. bh = minix_update_inode(inode);
  470. if (bh && buffer_dirty(bh))
  471. {
  472. sync_dirty_buffer(bh);
  473. if (buffer_req(bh) && !buffer_uptodate(bh))
  474. {
  475. printk("IO error syncing minix inode [%s:%08lx]\n",
  476. inode->i_sb->s_id, inode->i_ino);
  477. err = -1;
  478. }
  479. }
  480. else if (!bh)
  481. err = -1;
  482. brelse (bh);
  483. return err;
  484. }
  485. int minix_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
  486. {
  487. generic_fillattr(dentry->d_inode, stat);
  488. if (INODE_VERSION(dentry->d_inode) == MINIX_V1)
  489. stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size);
  490. else
  491. stat->blocks = (BLOCK_SIZE / 512) * V2_minix_blocks(stat->size);
  492. stat->blksize = BLOCK_SIZE;
  493. return 0;
  494. }
  495. /*
  496. * The function that is called for file truncation.
  497. */
  498. void minix_truncate(struct inode * inode)
  499. {
  500. if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
  501. return;
  502. if (INODE_VERSION(inode) == MINIX_V1)
  503. V1_minix_truncate(inode);
  504. else
  505. V2_minix_truncate(inode);
  506. }
  507. static int minix_get_sb(struct file_system_type *fs_type,
  508. int flags, const char *dev_name, void *data, struct vfsmount *mnt)
  509. {
  510. return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super,
  511. mnt);
  512. }
  513. static struct file_system_type minix_fs_type = {
  514. .owner = THIS_MODULE,
  515. .name = "minix",
  516. .get_sb = minix_get_sb,
  517. .kill_sb = kill_block_super,
  518. .fs_flags = FS_REQUIRES_DEV,
  519. };
  520. static int __init init_minix_fs(void)
  521. {
  522. int err = init_inodecache();
  523. if (err)
  524. goto out1;
  525. err = register_filesystem(&minix_fs_type);
  526. if (err)
  527. goto out;
  528. return 0;
  529. out:
  530. destroy_inodecache();
  531. out1:
  532. return err;
  533. }
  534. static void __exit exit_minix_fs(void)
  535. {
  536. unregister_filesystem(&minix_fs_type);
  537. destroy_inodecache();
  538. }
  539. module_init(init_minix_fs)
  540. module_exit(exit_minix_fs)
  541. MODULE_LICENSE("GPL");