inode.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * linux/fs/minix/inode.c
  4. *
  5. * Copyright (C) 1991, 1992 Linus Torvalds
  6. *
  7. * Copyright (C) 1996 Gertjan van Wingerde
  8. * Minix V2 fs support.
  9. *
  10. * Modified for 680x0 by Andreas Schwab
  11. * Updated to filesystem version 3 by Daniel Aragones
  12. */
  13. #include <linux/module.h>
  14. #include "minix.h"
  15. #include <linux/buffer_head.h>
  16. #include <linux/slab.h>
  17. #include <linux/init.h>
  18. #include <linux/highuid.h>
  19. #include <linux/mpage.h>
  20. #include <linux/vfs.h>
  21. #include <linux/writeback.h>
  22. #include <linux/fs_context.h>
  23. static int minix_write_inode(struct inode *inode,
  24. struct writeback_control *wbc);
  25. static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
  26. void __minix_error_inode(struct inode *inode, const char *function,
  27. unsigned int line, const char *fmt, ...)
  28. {
  29. struct va_format vaf;
  30. va_list args;
  31. va_start(args, fmt);
  32. vaf.fmt = fmt;
  33. vaf.va = &args;
  34. printk(KERN_CRIT "minix-fs error (device %s): %s:%d: "
  35. "inode #%lu: comm %s: %pV\n",
  36. inode->i_sb->s_id, function, line, inode->i_ino,
  37. current->comm, &vaf);
  38. va_end(args);
  39. }
  40. static void minix_evict_inode(struct inode *inode)
  41. {
  42. truncate_inode_pages_final(&inode->i_data);
  43. if (!inode->i_nlink) {
  44. inode->i_size = 0;
  45. minix_truncate(inode);
  46. }
  47. invalidate_inode_buffers(inode);
  48. clear_inode(inode);
  49. if (!inode->i_nlink)
  50. minix_free_inode(inode);
  51. }
  52. static void minix_put_super(struct super_block *sb)
  53. {
  54. int i;
  55. struct minix_sb_info *sbi = minix_sb(sb);
  56. if (!sb_rdonly(sb)) {
  57. if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */
  58. sbi->s_ms->s_state = sbi->s_mount_state;
  59. mark_buffer_dirty(sbi->s_sbh);
  60. }
  61. for (i = 0; i < sbi->s_imap_blocks; i++)
  62. brelse(sbi->s_imap[i]);
  63. for (i = 0; i < sbi->s_zmap_blocks; i++)
  64. brelse(sbi->s_zmap[i]);
  65. brelse (sbi->s_sbh);
  66. kfree(sbi->s_imap);
  67. sb->s_fs_info = NULL;
  68. kfree(sbi);
  69. }
  70. static struct kmem_cache * minix_inode_cachep;
  71. static struct inode *minix_alloc_inode(struct super_block *sb)
  72. {
  73. struct minix_inode_info *ei;
  74. ei = alloc_inode_sb(sb, minix_inode_cachep, GFP_KERNEL);
  75. if (!ei)
  76. return NULL;
  77. return &ei->vfs_inode;
  78. }
  79. static void minix_free_in_core_inode(struct inode *inode)
  80. {
  81. kmem_cache_free(minix_inode_cachep, minix_i(inode));
  82. }
  83. static void init_once(void *foo)
  84. {
  85. struct minix_inode_info *ei = (struct minix_inode_info *) foo;
  86. inode_init_once(&ei->vfs_inode);
  87. }
  88. static int __init init_inodecache(void)
  89. {
  90. minix_inode_cachep = kmem_cache_create("minix_inode_cache",
  91. sizeof(struct minix_inode_info),
  92. 0, (SLAB_RECLAIM_ACCOUNT|
  93. SLAB_ACCOUNT),
  94. init_once);
  95. if (minix_inode_cachep == NULL)
  96. return -ENOMEM;
  97. return 0;
  98. }
  99. static void destroy_inodecache(void)
  100. {
  101. /*
  102. * Make sure all delayed rcu free inodes are flushed before we
  103. * destroy cache.
  104. */
  105. rcu_barrier();
  106. kmem_cache_destroy(minix_inode_cachep);
  107. }
  108. static const struct super_operations minix_sops = {
  109. .alloc_inode = minix_alloc_inode,
  110. .free_inode = minix_free_in_core_inode,
  111. .write_inode = minix_write_inode,
  112. .evict_inode = minix_evict_inode,
  113. .put_super = minix_put_super,
  114. .statfs = minix_statfs,
  115. };
  116. static int minix_reconfigure(struct fs_context *fc)
  117. {
  118. struct minix_super_block * ms;
  119. struct super_block *sb = fc->root->d_sb;
  120. struct minix_sb_info * sbi = sb->s_fs_info;
  121. sync_filesystem(sb);
  122. ms = sbi->s_ms;
  123. if ((bool)(fc->sb_flags & SB_RDONLY) == sb_rdonly(sb))
  124. return 0;
  125. if (fc->sb_flags & SB_RDONLY) {
  126. if (ms->s_state & MINIX_VALID_FS ||
  127. !(sbi->s_mount_state & MINIX_VALID_FS))
  128. return 0;
  129. /* Mounting a rw partition read-only. */
  130. if (sbi->s_version != MINIX_V3)
  131. ms->s_state = sbi->s_mount_state;
  132. mark_buffer_dirty(sbi->s_sbh);
  133. } else {
  134. /* Mount a partition which is read-only, read-write. */
  135. if (sbi->s_version != MINIX_V3) {
  136. sbi->s_mount_state = ms->s_state;
  137. ms->s_state &= ~MINIX_VALID_FS;
  138. } else {
  139. sbi->s_mount_state = MINIX_VALID_FS;
  140. }
  141. mark_buffer_dirty(sbi->s_sbh);
  142. if (!(sbi->s_mount_state & MINIX_VALID_FS))
  143. printk("MINIX-fs warning: remounting unchecked fs, "
  144. "running fsck is recommended\n");
  145. else if ((sbi->s_mount_state & MINIX_ERROR_FS))
  146. printk("MINIX-fs warning: remounting fs with errors, "
  147. "running fsck is recommended\n");
  148. }
  149. return 0;
  150. }
  151. static bool minix_check_superblock(struct super_block *sb)
  152. {
  153. struct minix_sb_info *sbi = minix_sb(sb);
  154. unsigned long block;
  155. if (sbi->s_log_zone_size != 0) {
  156. printk("minix-fs error: zone size must equal block size. "
  157. "s_log_zone_size > 0 is not supported.\n");
  158. return false;
  159. }
  160. if (sbi->s_ninodes < 1 || sbi->s_firstdatazone <= 4 ||
  161. sbi->s_firstdatazone >= sbi->s_nzones)
  162. return false;
  163. /* Apparently minix can create filesystems that allocate more blocks for
  164. * the bitmaps than needed. We simply ignore that, but verify it didn't
  165. * create one with not enough blocks and bail out if so.
  166. */
  167. block = minix_blocks_needed(sbi->s_ninodes, sb->s_blocksize);
  168. if (sbi->s_imap_blocks < block) {
  169. printk("MINIX-fs: file system does not have enough "
  170. "imap blocks allocated. Refusing to mount.\n");
  171. return false;
  172. }
  173. block = minix_blocks_needed(
  174. (sbi->s_nzones - sbi->s_firstdatazone + 1),
  175. sb->s_blocksize);
  176. if (sbi->s_zmap_blocks < block) {
  177. printk("MINIX-fs: file system does not have enough "
  178. "zmap blocks allocated. Refusing to mount.\n");
  179. return false;
  180. }
  181. /*
  182. * s_max_size must not exceed the block mapping limitation. This check
  183. * is only needed for V1 filesystems, since V2/V3 support an extra level
  184. * of indirect blocks which places the limit well above U32_MAX.
  185. */
  186. if (sbi->s_version == MINIX_V1 &&
  187. sb->s_maxbytes > (7 + 512 + 512*512) * BLOCK_SIZE)
  188. return false;
  189. return true;
  190. }
  191. static int minix_fill_super(struct super_block *s, struct fs_context *fc)
  192. {
  193. struct buffer_head *bh;
  194. struct buffer_head **map;
  195. struct minix_super_block *ms;
  196. struct minix3_super_block *m3s = NULL;
  197. unsigned long i, block;
  198. struct inode *root_inode;
  199. struct minix_sb_info *sbi;
  200. int ret = -EINVAL;
  201. int silent = fc->sb_flags & SB_SILENT;
  202. sbi = kzalloc_obj(struct minix_sb_info);
  203. if (!sbi)
  204. return -ENOMEM;
  205. s->s_fs_info = sbi;
  206. BUILD_BUG_ON(32 != sizeof (struct minix_inode));
  207. BUILD_BUG_ON(64 != sizeof(struct minix2_inode));
  208. if (!sb_set_blocksize(s, BLOCK_SIZE))
  209. goto out_bad_hblock;
  210. if (!(bh = sb_bread(s, 1)))
  211. goto out_bad_sb;
  212. ms = (struct minix_super_block *) bh->b_data;
  213. sbi->s_ms = ms;
  214. sbi->s_sbh = bh;
  215. sbi->s_mount_state = ms->s_state;
  216. sbi->s_ninodes = ms->s_ninodes;
  217. sbi->s_nzones = ms->s_nzones;
  218. sbi->s_imap_blocks = ms->s_imap_blocks;
  219. sbi->s_zmap_blocks = ms->s_zmap_blocks;
  220. sbi->s_firstdatazone = ms->s_firstdatazone;
  221. sbi->s_log_zone_size = ms->s_log_zone_size;
  222. s->s_maxbytes = ms->s_max_size;
  223. s->s_magic = ms->s_magic;
  224. if (s->s_magic == MINIX_SUPER_MAGIC) {
  225. sbi->s_version = MINIX_V1;
  226. sbi->s_dirsize = 16;
  227. sbi->s_namelen = 14;
  228. s->s_max_links = MINIX_LINK_MAX;
  229. } else if (s->s_magic == MINIX_SUPER_MAGIC2) {
  230. sbi->s_version = MINIX_V1;
  231. sbi->s_dirsize = 32;
  232. sbi->s_namelen = 30;
  233. s->s_max_links = MINIX_LINK_MAX;
  234. } else if (s->s_magic == MINIX2_SUPER_MAGIC) {
  235. sbi->s_version = MINIX_V2;
  236. sbi->s_nzones = ms->s_zones;
  237. sbi->s_dirsize = 16;
  238. sbi->s_namelen = 14;
  239. s->s_max_links = MINIX2_LINK_MAX;
  240. } else if (s->s_magic == MINIX2_SUPER_MAGIC2) {
  241. sbi->s_version = MINIX_V2;
  242. sbi->s_nzones = ms->s_zones;
  243. sbi->s_dirsize = 32;
  244. sbi->s_namelen = 30;
  245. s->s_max_links = MINIX2_LINK_MAX;
  246. } else if ( *(__u16 *)(bh->b_data + 24) == MINIX3_SUPER_MAGIC) {
  247. m3s = (struct minix3_super_block *) bh->b_data;
  248. s->s_magic = m3s->s_magic;
  249. sbi->s_imap_blocks = m3s->s_imap_blocks;
  250. sbi->s_zmap_blocks = m3s->s_zmap_blocks;
  251. sbi->s_firstdatazone = m3s->s_firstdatazone;
  252. sbi->s_log_zone_size = m3s->s_log_zone_size;
  253. s->s_maxbytes = m3s->s_max_size;
  254. sbi->s_ninodes = m3s->s_ninodes;
  255. sbi->s_nzones = m3s->s_zones;
  256. sbi->s_dirsize = 64;
  257. sbi->s_namelen = 60;
  258. sbi->s_version = MINIX_V3;
  259. sbi->s_mount_state = MINIX_VALID_FS;
  260. sb_set_blocksize(s, m3s->s_blocksize);
  261. s->s_max_links = MINIX2_LINK_MAX;
  262. } else
  263. goto out_no_fs;
  264. if (!minix_check_superblock(s))
  265. goto out_illegal_sb;
  266. /*
  267. * Allocate the buffer map to keep the superblock small.
  268. */
  269. i = (sbi->s_imap_blocks + sbi->s_zmap_blocks) * sizeof(bh);
  270. map = kzalloc(i, GFP_KERNEL);
  271. if (!map)
  272. goto out_no_map;
  273. sbi->s_imap = &map[0];
  274. sbi->s_zmap = &map[sbi->s_imap_blocks];
  275. block=2;
  276. for (i=0 ; i < sbi->s_imap_blocks ; i++) {
  277. if (!(sbi->s_imap[i]=sb_bread(s, block)))
  278. goto out_no_bitmap;
  279. block++;
  280. }
  281. for (i=0 ; i < sbi->s_zmap_blocks ; i++) {
  282. if (!(sbi->s_zmap[i]=sb_bread(s, block)))
  283. goto out_no_bitmap;
  284. block++;
  285. }
  286. minix_set_bit(0,sbi->s_imap[0]->b_data);
  287. minix_set_bit(0,sbi->s_zmap[0]->b_data);
  288. /* set up enough so that it can read an inode */
  289. s->s_op = &minix_sops;
  290. s->s_time_min = 0;
  291. s->s_time_max = U32_MAX;
  292. root_inode = minix_iget(s, MINIX_ROOT_INO);
  293. if (IS_ERR(root_inode)) {
  294. ret = PTR_ERR(root_inode);
  295. goto out_no_root;
  296. }
  297. ret = -ENOMEM;
  298. s->s_root = d_make_root(root_inode);
  299. if (!s->s_root)
  300. goto out_no_root;
  301. if (!sb_rdonly(s)) {
  302. if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */
  303. ms->s_state &= ~MINIX_VALID_FS;
  304. mark_buffer_dirty(bh);
  305. }
  306. if (!(sbi->s_mount_state & MINIX_VALID_FS))
  307. printk("MINIX-fs: mounting unchecked file system, "
  308. "running fsck is recommended\n");
  309. else if (sbi->s_mount_state & MINIX_ERROR_FS)
  310. printk("MINIX-fs: mounting file system with errors, "
  311. "running fsck is recommended\n");
  312. return 0;
  313. out_no_root:
  314. if (!silent)
  315. printk("MINIX-fs: get root inode failed\n");
  316. goto out_freemap;
  317. out_no_bitmap:
  318. printk("MINIX-fs: bad superblock or unable to read bitmaps\n");
  319. out_freemap:
  320. for (i = 0; i < sbi->s_imap_blocks; i++)
  321. brelse(sbi->s_imap[i]);
  322. for (i = 0; i < sbi->s_zmap_blocks; i++)
  323. brelse(sbi->s_zmap[i]);
  324. kfree(sbi->s_imap);
  325. goto out_release;
  326. out_no_map:
  327. ret = -ENOMEM;
  328. if (!silent)
  329. printk("MINIX-fs: can't allocate map\n");
  330. goto out_release;
  331. out_illegal_sb:
  332. if (!silent)
  333. printk("MINIX-fs: bad superblock\n");
  334. goto out_release;
  335. out_no_fs:
  336. if (!silent)
  337. printk("VFS: Can't find a Minix filesystem V1 | V2 | V3 "
  338. "on device %s.\n", s->s_id);
  339. out_release:
  340. brelse(bh);
  341. goto out;
  342. out_bad_hblock:
  343. printk("MINIX-fs: blocksize too small for device\n");
  344. goto out;
  345. out_bad_sb:
  346. printk("MINIX-fs: unable to read superblock\n");
  347. out:
  348. s->s_fs_info = NULL;
  349. kfree(sbi);
  350. return ret;
  351. }
  352. static int minix_get_tree(struct fs_context *fc)
  353. {
  354. return get_tree_bdev(fc, minix_fill_super);
  355. }
  356. static const struct fs_context_operations minix_context_ops = {
  357. .get_tree = minix_get_tree,
  358. .reconfigure = minix_reconfigure,
  359. };
  360. static int minix_init_fs_context(struct fs_context *fc)
  361. {
  362. fc->ops = &minix_context_ops;
  363. return 0;
  364. }
  365. static int minix_statfs(struct dentry *dentry, struct kstatfs *buf)
  366. {
  367. struct super_block *sb = dentry->d_sb;
  368. struct minix_sb_info *sbi = minix_sb(sb);
  369. u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
  370. buf->f_type = sb->s_magic;
  371. buf->f_bsize = sb->s_blocksize;
  372. buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size;
  373. buf->f_bfree = minix_count_free_blocks(sb);
  374. buf->f_bavail = buf->f_bfree;
  375. buf->f_files = sbi->s_ninodes;
  376. buf->f_ffree = minix_count_free_inodes(sb);
  377. buf->f_namelen = sbi->s_namelen;
  378. buf->f_fsid = u64_to_fsid(id);
  379. return 0;
  380. }
  381. static int minix_get_block(struct inode *inode, sector_t block,
  382. struct buffer_head *bh_result, int create)
  383. {
  384. if (INODE_VERSION(inode) == MINIX_V1)
  385. return V1_minix_get_block(inode, block, bh_result, create);
  386. else
  387. return V2_minix_get_block(inode, block, bh_result, create);
  388. }
  389. static int minix_writepages(struct address_space *mapping,
  390. struct writeback_control *wbc)
  391. {
  392. return mpage_writepages(mapping, wbc, minix_get_block);
  393. }
  394. static int minix_read_folio(struct file *file, struct folio *folio)
  395. {
  396. return block_read_full_folio(folio, minix_get_block);
  397. }
  398. int minix_prepare_chunk(struct folio *folio, loff_t pos, unsigned len)
  399. {
  400. return __block_write_begin(folio, pos, len, minix_get_block);
  401. }
  402. static void minix_write_failed(struct address_space *mapping, loff_t to)
  403. {
  404. struct inode *inode = mapping->host;
  405. if (to > inode->i_size) {
  406. truncate_pagecache(inode, inode->i_size);
  407. minix_truncate(inode);
  408. }
  409. }
  410. static int minix_write_begin(const struct kiocb *iocb,
  411. struct address_space *mapping,
  412. loff_t pos, unsigned len,
  413. struct folio **foliop, void **fsdata)
  414. {
  415. int ret;
  416. ret = block_write_begin(mapping, pos, len, foliop, minix_get_block);
  417. if (unlikely(ret))
  418. minix_write_failed(mapping, pos + len);
  419. return ret;
  420. }
  421. static sector_t minix_bmap(struct address_space *mapping, sector_t block)
  422. {
  423. return generic_block_bmap(mapping,block,minix_get_block);
  424. }
  425. static const struct address_space_operations minix_aops = {
  426. .dirty_folio = block_dirty_folio,
  427. .invalidate_folio = block_invalidate_folio,
  428. .read_folio = minix_read_folio,
  429. .writepages = minix_writepages,
  430. .write_begin = minix_write_begin,
  431. .write_end = generic_write_end,
  432. .migrate_folio = buffer_migrate_folio,
  433. .bmap = minix_bmap,
  434. .direct_IO = noop_direct_IO
  435. };
  436. static const struct inode_operations minix_symlink_inode_operations = {
  437. .get_link = page_get_link,
  438. .getattr = minix_getattr,
  439. };
  440. void minix_set_inode(struct inode *inode, dev_t rdev)
  441. {
  442. if (S_ISREG(inode->i_mode)) {
  443. inode->i_op = &minix_file_inode_operations;
  444. inode->i_fop = &minix_file_operations;
  445. inode->i_mapping->a_ops = &minix_aops;
  446. } else if (S_ISDIR(inode->i_mode)) {
  447. inode->i_op = &minix_dir_inode_operations;
  448. inode->i_fop = &minix_dir_operations;
  449. inode->i_mapping->a_ops = &minix_aops;
  450. } else if (S_ISLNK(inode->i_mode)) {
  451. inode->i_op = &minix_symlink_inode_operations;
  452. inode_nohighmem(inode);
  453. inode->i_mapping->a_ops = &minix_aops;
  454. } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
  455. S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
  456. init_special_inode(inode, inode->i_mode, rdev);
  457. } else {
  458. printk(KERN_DEBUG "MINIX-fs: Invalid file type 0%04o for inode %lu.\n",
  459. inode->i_mode, inode->i_ino);
  460. make_bad_inode(inode);
  461. }
  462. }
  463. /*
  464. * The minix V1 function to read an inode.
  465. */
  466. static struct inode *V1_minix_iget(struct inode *inode)
  467. {
  468. struct buffer_head * bh;
  469. struct minix_inode * raw_inode;
  470. struct minix_inode_info *minix_inode = minix_i(inode);
  471. int i;
  472. raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
  473. if (!raw_inode) {
  474. iget_failed(inode);
  475. return ERR_PTR(-EIO);
  476. }
  477. if (raw_inode->i_nlinks == 0) {
  478. printk("MINIX-fs: deleted inode referenced: %lu\n",
  479. inode->i_ino);
  480. brelse(bh);
  481. iget_failed(inode);
  482. return ERR_PTR(-ESTALE);
  483. }
  484. inode->i_mode = raw_inode->i_mode;
  485. i_uid_write(inode, raw_inode->i_uid);
  486. i_gid_write(inode, raw_inode->i_gid);
  487. set_nlink(inode, raw_inode->i_nlinks);
  488. inode->i_size = raw_inode->i_size;
  489. inode_set_mtime_to_ts(inode,
  490. inode_set_atime_to_ts(inode, inode_set_ctime(inode, raw_inode->i_time, 0)));
  491. inode->i_blocks = 0;
  492. for (i = 0; i < 9; i++)
  493. minix_inode->u.i1_data[i] = raw_inode->i_zone[i];
  494. minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
  495. brelse(bh);
  496. unlock_new_inode(inode);
  497. return inode;
  498. }
  499. /*
  500. * The minix V2 function to read an inode.
  501. */
  502. static struct inode *V2_minix_iget(struct inode *inode)
  503. {
  504. struct buffer_head * bh;
  505. struct minix2_inode * raw_inode;
  506. struct minix_inode_info *minix_inode = minix_i(inode);
  507. int i;
  508. raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
  509. if (!raw_inode) {
  510. iget_failed(inode);
  511. return ERR_PTR(-EIO);
  512. }
  513. if (raw_inode->i_nlinks == 0) {
  514. printk("MINIX-fs: deleted inode referenced: %lu\n",
  515. inode->i_ino);
  516. brelse(bh);
  517. iget_failed(inode);
  518. return ERR_PTR(-ESTALE);
  519. }
  520. inode->i_mode = raw_inode->i_mode;
  521. i_uid_write(inode, raw_inode->i_uid);
  522. i_gid_write(inode, raw_inode->i_gid);
  523. set_nlink(inode, raw_inode->i_nlinks);
  524. inode->i_size = raw_inode->i_size;
  525. inode_set_mtime(inode, raw_inode->i_mtime, 0);
  526. inode_set_atime(inode, raw_inode->i_atime, 0);
  527. inode_set_ctime(inode, raw_inode->i_ctime, 0);
  528. inode->i_blocks = 0;
  529. for (i = 0; i < 10; i++)
  530. minix_inode->u.i2_data[i] = raw_inode->i_zone[i];
  531. minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
  532. brelse(bh);
  533. unlock_new_inode(inode);
  534. return inode;
  535. }
  536. /*
  537. * The global function to read an inode.
  538. */
  539. struct inode *minix_iget(struct super_block *sb, unsigned long ino)
  540. {
  541. struct inode *inode;
  542. inode = iget_locked(sb, ino);
  543. if (!inode)
  544. return ERR_PTR(-ENOMEM);
  545. if (!(inode_state_read_once(inode) & I_NEW))
  546. return inode;
  547. if (INODE_VERSION(inode) == MINIX_V1)
  548. return V1_minix_iget(inode);
  549. else
  550. return V2_minix_iget(inode);
  551. }
  552. /*
  553. * The minix V1 function to synchronize an inode.
  554. */
  555. static struct buffer_head * V1_minix_update_inode(struct inode * inode)
  556. {
  557. struct buffer_head * bh;
  558. struct minix_inode * raw_inode;
  559. struct minix_inode_info *minix_inode = minix_i(inode);
  560. int i;
  561. raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
  562. if (!raw_inode)
  563. return NULL;
  564. raw_inode->i_mode = inode->i_mode;
  565. raw_inode->i_uid = fs_high2lowuid(i_uid_read(inode));
  566. raw_inode->i_gid = fs_high2lowgid(i_gid_read(inode));
  567. raw_inode->i_nlinks = inode->i_nlink;
  568. raw_inode->i_size = inode->i_size;
  569. raw_inode->i_time = inode_get_mtime_sec(inode);
  570. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  571. raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
  572. else for (i = 0; i < 9; i++)
  573. raw_inode->i_zone[i] = minix_inode->u.i1_data[i];
  574. mark_buffer_dirty(bh);
  575. return bh;
  576. }
  577. /*
  578. * The minix V2 function to synchronize an inode.
  579. */
  580. static struct buffer_head * V2_minix_update_inode(struct inode * inode)
  581. {
  582. struct buffer_head * bh;
  583. struct minix2_inode * raw_inode;
  584. struct minix_inode_info *minix_inode = minix_i(inode);
  585. int i;
  586. raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
  587. if (!raw_inode)
  588. return NULL;
  589. raw_inode->i_mode = inode->i_mode;
  590. raw_inode->i_uid = fs_high2lowuid(i_uid_read(inode));
  591. raw_inode->i_gid = fs_high2lowgid(i_gid_read(inode));
  592. raw_inode->i_nlinks = inode->i_nlink;
  593. raw_inode->i_size = inode->i_size;
  594. raw_inode->i_mtime = inode_get_mtime_sec(inode);
  595. raw_inode->i_atime = inode_get_atime_sec(inode);
  596. raw_inode->i_ctime = inode_get_ctime_sec(inode);
  597. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  598. raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
  599. else for (i = 0; i < 10; i++)
  600. raw_inode->i_zone[i] = minix_inode->u.i2_data[i];
  601. mark_buffer_dirty(bh);
  602. return bh;
  603. }
  604. static int minix_write_inode(struct inode *inode, struct writeback_control *wbc)
  605. {
  606. int err = 0;
  607. struct buffer_head *bh;
  608. if (INODE_VERSION(inode) == MINIX_V1)
  609. bh = V1_minix_update_inode(inode);
  610. else
  611. bh = V2_minix_update_inode(inode);
  612. if (!bh)
  613. return -EIO;
  614. if (wbc->sync_mode == WB_SYNC_ALL && buffer_dirty(bh)) {
  615. sync_dirty_buffer(bh);
  616. if (buffer_req(bh) && !buffer_uptodate(bh)) {
  617. printk("IO error syncing minix inode [%s:%08lx]\n",
  618. inode->i_sb->s_id, inode->i_ino);
  619. err = -EIO;
  620. }
  621. }
  622. brelse (bh);
  623. return err;
  624. }
  625. int minix_getattr(struct mnt_idmap *idmap, const struct path *path,
  626. struct kstat *stat, u32 request_mask, unsigned int flags)
  627. {
  628. struct super_block *sb = path->dentry->d_sb;
  629. struct inode *inode = d_inode(path->dentry);
  630. generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
  631. if (INODE_VERSION(inode) == MINIX_V1)
  632. stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb);
  633. else
  634. stat->blocks = (sb->s_blocksize / 512) * V2_minix_blocks(stat->size, sb);
  635. stat->blksize = sb->s_blocksize;
  636. return 0;
  637. }
  638. /*
  639. * The function that is called for file truncation.
  640. */
  641. void minix_truncate(struct inode * inode)
  642. {
  643. if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
  644. return;
  645. if (INODE_VERSION(inode) == MINIX_V1)
  646. V1_minix_truncate(inode);
  647. else
  648. V2_minix_truncate(inode);
  649. }
  650. static struct file_system_type minix_fs_type = {
  651. .owner = THIS_MODULE,
  652. .name = "minix",
  653. .kill_sb = kill_block_super,
  654. .fs_flags = FS_REQUIRES_DEV,
  655. .init_fs_context = minix_init_fs_context,
  656. };
  657. MODULE_ALIAS_FS("minix");
  658. static int __init init_minix_fs(void)
  659. {
  660. int err = init_inodecache();
  661. if (err)
  662. goto out1;
  663. err = register_filesystem(&minix_fs_type);
  664. if (err)
  665. goto out;
  666. return 0;
  667. out:
  668. destroy_inodecache();
  669. out1:
  670. return err;
  671. }
  672. static void __exit exit_minix_fs(void)
  673. {
  674. unregister_filesystem(&minix_fs_type);
  675. destroy_inodecache();
  676. }
  677. module_init(init_minix_fs)
  678. module_exit(exit_minix_fs)
  679. MODULE_DESCRIPTION("Minix file system");
  680. MODULE_LICENSE("GPL");