0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <linux/module.h>
0015 #include "minix.h"
0016 #include <linux/buffer_head.h>
0017 #include <linux/slab.h>
0018 #include <linux/init.h>
0019 #include <linux/highuid.h>
0020 #include <linux/vfs.h>
0021 #include <linux/writeback.h>
0022
0023 static int minix_write_inode(struct inode *inode,
0024 struct writeback_control *wbc);
0025 static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
0026 static int minix_remount (struct super_block * sb, int * flags, char * data);
0027
0028 static void minix_evict_inode(struct inode *inode)
0029 {
0030 truncate_inode_pages_final(&inode->i_data);
0031 if (!inode->i_nlink) {
0032 inode->i_size = 0;
0033 minix_truncate(inode);
0034 }
0035 invalidate_inode_buffers(inode);
0036 clear_inode(inode);
0037 if (!inode->i_nlink)
0038 minix_free_inode(inode);
0039 }
0040
0041 static void minix_put_super(struct super_block *sb)
0042 {
0043 int i;
0044 struct minix_sb_info *sbi = minix_sb(sb);
0045
0046 if (!sb_rdonly(sb)) {
0047 if (sbi->s_version != MINIX_V3)
0048 sbi->s_ms->s_state = sbi->s_mount_state;
0049 mark_buffer_dirty(sbi->s_sbh);
0050 }
0051 for (i = 0; i < sbi->s_imap_blocks; i++)
0052 brelse(sbi->s_imap[i]);
0053 for (i = 0; i < sbi->s_zmap_blocks; i++)
0054 brelse(sbi->s_zmap[i]);
0055 brelse (sbi->s_sbh);
0056 kfree(sbi->s_imap);
0057 sb->s_fs_info = NULL;
0058 kfree(sbi);
0059 }
0060
0061 static struct kmem_cache * minix_inode_cachep;
0062
0063 static struct inode *minix_alloc_inode(struct super_block *sb)
0064 {
0065 struct minix_inode_info *ei;
0066 ei = alloc_inode_sb(sb, minix_inode_cachep, GFP_KERNEL);
0067 if (!ei)
0068 return NULL;
0069 return &ei->vfs_inode;
0070 }
0071
0072 static void minix_free_in_core_inode(struct inode *inode)
0073 {
0074 kmem_cache_free(minix_inode_cachep, minix_i(inode));
0075 }
0076
0077 static void init_once(void *foo)
0078 {
0079 struct minix_inode_info *ei = (struct minix_inode_info *) foo;
0080
0081 inode_init_once(&ei->vfs_inode);
0082 }
0083
0084 static int __init init_inodecache(void)
0085 {
0086 minix_inode_cachep = kmem_cache_create("minix_inode_cache",
0087 sizeof(struct minix_inode_info),
0088 0, (SLAB_RECLAIM_ACCOUNT|
0089 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
0090 init_once);
0091 if (minix_inode_cachep == NULL)
0092 return -ENOMEM;
0093 return 0;
0094 }
0095
0096 static void destroy_inodecache(void)
0097 {
0098
0099
0100
0101
0102 rcu_barrier();
0103 kmem_cache_destroy(minix_inode_cachep);
0104 }
0105
0106 static const struct super_operations minix_sops = {
0107 .alloc_inode = minix_alloc_inode,
0108 .free_inode = minix_free_in_core_inode,
0109 .write_inode = minix_write_inode,
0110 .evict_inode = minix_evict_inode,
0111 .put_super = minix_put_super,
0112 .statfs = minix_statfs,
0113 .remount_fs = minix_remount,
0114 };
0115
0116 static int minix_remount (struct super_block * sb, int * flags, char * data)
0117 {
0118 struct minix_sb_info * sbi = minix_sb(sb);
0119 struct minix_super_block * ms;
0120
0121 sync_filesystem(sb);
0122 ms = sbi->s_ms;
0123 if ((bool)(*flags & SB_RDONLY) == sb_rdonly(sb))
0124 return 0;
0125 if (*flags & SB_RDONLY) {
0126 if (ms->s_state & MINIX_VALID_FS ||
0127 !(sbi->s_mount_state & MINIX_VALID_FS))
0128 return 0;
0129
0130 if (sbi->s_version != MINIX_V3)
0131 ms->s_state = sbi->s_mount_state;
0132 mark_buffer_dirty(sbi->s_sbh);
0133 } else {
0134
0135 if (sbi->s_version != MINIX_V3) {
0136 sbi->s_mount_state = ms->s_state;
0137 ms->s_state &= ~MINIX_VALID_FS;
0138 } else {
0139 sbi->s_mount_state = MINIX_VALID_FS;
0140 }
0141 mark_buffer_dirty(sbi->s_sbh);
0142
0143 if (!(sbi->s_mount_state & MINIX_VALID_FS))
0144 printk("MINIX-fs warning: remounting unchecked fs, "
0145 "running fsck is recommended\n");
0146 else if ((sbi->s_mount_state & MINIX_ERROR_FS))
0147 printk("MINIX-fs warning: remounting fs with errors, "
0148 "running fsck is recommended\n");
0149 }
0150 return 0;
0151 }
0152
0153 static bool minix_check_superblock(struct super_block *sb)
0154 {
0155 struct minix_sb_info *sbi = minix_sb(sb);
0156
0157 if (sbi->s_imap_blocks == 0 || sbi->s_zmap_blocks == 0)
0158 return false;
0159
0160
0161
0162
0163
0164
0165 if (sbi->s_version == MINIX_V1 &&
0166 sb->s_maxbytes > (7 + 512 + 512*512) * BLOCK_SIZE)
0167 return false;
0168
0169 return true;
0170 }
0171
0172 static int minix_fill_super(struct super_block *s, void *data, int silent)
0173 {
0174 struct buffer_head *bh;
0175 struct buffer_head **map;
0176 struct minix_super_block *ms;
0177 struct minix3_super_block *m3s = NULL;
0178 unsigned long i, block;
0179 struct inode *root_inode;
0180 struct minix_sb_info *sbi;
0181 int ret = -EINVAL;
0182
0183 sbi = kzalloc(sizeof(struct minix_sb_info), GFP_KERNEL);
0184 if (!sbi)
0185 return -ENOMEM;
0186 s->s_fs_info = sbi;
0187
0188 BUILD_BUG_ON(32 != sizeof (struct minix_inode));
0189 BUILD_BUG_ON(64 != sizeof(struct minix2_inode));
0190
0191 if (!sb_set_blocksize(s, BLOCK_SIZE))
0192 goto out_bad_hblock;
0193
0194 if (!(bh = sb_bread(s, 1)))
0195 goto out_bad_sb;
0196
0197 ms = (struct minix_super_block *) bh->b_data;
0198 sbi->s_ms = ms;
0199 sbi->s_sbh = bh;
0200 sbi->s_mount_state = ms->s_state;
0201 sbi->s_ninodes = ms->s_ninodes;
0202 sbi->s_nzones = ms->s_nzones;
0203 sbi->s_imap_blocks = ms->s_imap_blocks;
0204 sbi->s_zmap_blocks = ms->s_zmap_blocks;
0205 sbi->s_firstdatazone = ms->s_firstdatazone;
0206 sbi->s_log_zone_size = ms->s_log_zone_size;
0207 s->s_maxbytes = ms->s_max_size;
0208 s->s_magic = ms->s_magic;
0209 if (s->s_magic == MINIX_SUPER_MAGIC) {
0210 sbi->s_version = MINIX_V1;
0211 sbi->s_dirsize = 16;
0212 sbi->s_namelen = 14;
0213 s->s_max_links = MINIX_LINK_MAX;
0214 } else if (s->s_magic == MINIX_SUPER_MAGIC2) {
0215 sbi->s_version = MINIX_V1;
0216 sbi->s_dirsize = 32;
0217 sbi->s_namelen = 30;
0218 s->s_max_links = MINIX_LINK_MAX;
0219 } else if (s->s_magic == MINIX2_SUPER_MAGIC) {
0220 sbi->s_version = MINIX_V2;
0221 sbi->s_nzones = ms->s_zones;
0222 sbi->s_dirsize = 16;
0223 sbi->s_namelen = 14;
0224 s->s_max_links = MINIX2_LINK_MAX;
0225 } else if (s->s_magic == MINIX2_SUPER_MAGIC2) {
0226 sbi->s_version = MINIX_V2;
0227 sbi->s_nzones = ms->s_zones;
0228 sbi->s_dirsize = 32;
0229 sbi->s_namelen = 30;
0230 s->s_max_links = MINIX2_LINK_MAX;
0231 } else if ( *(__u16 *)(bh->b_data + 24) == MINIX3_SUPER_MAGIC) {
0232 m3s = (struct minix3_super_block *) bh->b_data;
0233 s->s_magic = m3s->s_magic;
0234 sbi->s_imap_blocks = m3s->s_imap_blocks;
0235 sbi->s_zmap_blocks = m3s->s_zmap_blocks;
0236 sbi->s_firstdatazone = m3s->s_firstdatazone;
0237 sbi->s_log_zone_size = m3s->s_log_zone_size;
0238 s->s_maxbytes = m3s->s_max_size;
0239 sbi->s_ninodes = m3s->s_ninodes;
0240 sbi->s_nzones = m3s->s_zones;
0241 sbi->s_dirsize = 64;
0242 sbi->s_namelen = 60;
0243 sbi->s_version = MINIX_V3;
0244 sbi->s_mount_state = MINIX_VALID_FS;
0245 sb_set_blocksize(s, m3s->s_blocksize);
0246 s->s_max_links = MINIX2_LINK_MAX;
0247 } else
0248 goto out_no_fs;
0249
0250 if (!minix_check_superblock(s))
0251 goto out_illegal_sb;
0252
0253
0254
0255
0256 i = (sbi->s_imap_blocks + sbi->s_zmap_blocks) * sizeof(bh);
0257 map = kzalloc(i, GFP_KERNEL);
0258 if (!map)
0259 goto out_no_map;
0260 sbi->s_imap = &map[0];
0261 sbi->s_zmap = &map[sbi->s_imap_blocks];
0262
0263 block=2;
0264 for (i=0 ; i < sbi->s_imap_blocks ; i++) {
0265 if (!(sbi->s_imap[i]=sb_bread(s, block)))
0266 goto out_no_bitmap;
0267 block++;
0268 }
0269 for (i=0 ; i < sbi->s_zmap_blocks ; i++) {
0270 if (!(sbi->s_zmap[i]=sb_bread(s, block)))
0271 goto out_no_bitmap;
0272 block++;
0273 }
0274
0275 minix_set_bit(0,sbi->s_imap[0]->b_data);
0276 minix_set_bit(0,sbi->s_zmap[0]->b_data);
0277
0278
0279
0280
0281
0282 block = minix_blocks_needed(sbi->s_ninodes, s->s_blocksize);
0283 if (sbi->s_imap_blocks < block) {
0284 printk("MINIX-fs: file system does not have enough "
0285 "imap blocks allocated. Refusing to mount.\n");
0286 goto out_no_bitmap;
0287 }
0288
0289 block = minix_blocks_needed(
0290 (sbi->s_nzones - sbi->s_firstdatazone + 1),
0291 s->s_blocksize);
0292 if (sbi->s_zmap_blocks < block) {
0293 printk("MINIX-fs: file system does not have enough "
0294 "zmap blocks allocated. Refusing to mount.\n");
0295 goto out_no_bitmap;
0296 }
0297
0298
0299 s->s_op = &minix_sops;
0300 s->s_time_min = 0;
0301 s->s_time_max = U32_MAX;
0302 root_inode = minix_iget(s, MINIX_ROOT_INO);
0303 if (IS_ERR(root_inode)) {
0304 ret = PTR_ERR(root_inode);
0305 goto out_no_root;
0306 }
0307
0308 ret = -ENOMEM;
0309 s->s_root = d_make_root(root_inode);
0310 if (!s->s_root)
0311 goto out_no_root;
0312
0313 if (!sb_rdonly(s)) {
0314 if (sbi->s_version != MINIX_V3)
0315 ms->s_state &= ~MINIX_VALID_FS;
0316 mark_buffer_dirty(bh);
0317 }
0318 if (!(sbi->s_mount_state & MINIX_VALID_FS))
0319 printk("MINIX-fs: mounting unchecked file system, "
0320 "running fsck is recommended\n");
0321 else if (sbi->s_mount_state & MINIX_ERROR_FS)
0322 printk("MINIX-fs: mounting file system with errors, "
0323 "running fsck is recommended\n");
0324
0325 return 0;
0326
0327 out_no_root:
0328 if (!silent)
0329 printk("MINIX-fs: get root inode failed\n");
0330 goto out_freemap;
0331
0332 out_no_bitmap:
0333 printk("MINIX-fs: bad superblock or unable to read bitmaps\n");
0334 out_freemap:
0335 for (i = 0; i < sbi->s_imap_blocks; i++)
0336 brelse(sbi->s_imap[i]);
0337 for (i = 0; i < sbi->s_zmap_blocks; i++)
0338 brelse(sbi->s_zmap[i]);
0339 kfree(sbi->s_imap);
0340 goto out_release;
0341
0342 out_no_map:
0343 ret = -ENOMEM;
0344 if (!silent)
0345 printk("MINIX-fs: can't allocate map\n");
0346 goto out_release;
0347
0348 out_illegal_sb:
0349 if (!silent)
0350 printk("MINIX-fs: bad superblock\n");
0351 goto out_release;
0352
0353 out_no_fs:
0354 if (!silent)
0355 printk("VFS: Can't find a Minix filesystem V1 | V2 | V3 "
0356 "on device %s.\n", s->s_id);
0357 out_release:
0358 brelse(bh);
0359 goto out;
0360
0361 out_bad_hblock:
0362 printk("MINIX-fs: blocksize too small for device\n");
0363 goto out;
0364
0365 out_bad_sb:
0366 printk("MINIX-fs: unable to read superblock\n");
0367 out:
0368 s->s_fs_info = NULL;
0369 kfree(sbi);
0370 return ret;
0371 }
0372
0373 static int minix_statfs(struct dentry *dentry, struct kstatfs *buf)
0374 {
0375 struct super_block *sb = dentry->d_sb;
0376 struct minix_sb_info *sbi = minix_sb(sb);
0377 u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
0378 buf->f_type = sb->s_magic;
0379 buf->f_bsize = sb->s_blocksize;
0380 buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size;
0381 buf->f_bfree = minix_count_free_blocks(sb);
0382 buf->f_bavail = buf->f_bfree;
0383 buf->f_files = sbi->s_ninodes;
0384 buf->f_ffree = minix_count_free_inodes(sb);
0385 buf->f_namelen = sbi->s_namelen;
0386 buf->f_fsid = u64_to_fsid(id);
0387
0388 return 0;
0389 }
0390
0391 static int minix_get_block(struct inode *inode, sector_t block,
0392 struct buffer_head *bh_result, int create)
0393 {
0394 if (INODE_VERSION(inode) == MINIX_V1)
0395 return V1_minix_get_block(inode, block, bh_result, create);
0396 else
0397 return V2_minix_get_block(inode, block, bh_result, create);
0398 }
0399
0400 static int minix_writepage(struct page *page, struct writeback_control *wbc)
0401 {
0402 return block_write_full_page(page, minix_get_block, wbc);
0403 }
0404
0405 static int minix_read_folio(struct file *file, struct folio *folio)
0406 {
0407 return block_read_full_folio(folio, minix_get_block);
0408 }
0409
0410 int minix_prepare_chunk(struct page *page, loff_t pos, unsigned len)
0411 {
0412 return __block_write_begin(page, pos, len, minix_get_block);
0413 }
0414
0415 static void minix_write_failed(struct address_space *mapping, loff_t to)
0416 {
0417 struct inode *inode = mapping->host;
0418
0419 if (to > inode->i_size) {
0420 truncate_pagecache(inode, inode->i_size);
0421 minix_truncate(inode);
0422 }
0423 }
0424
0425 static int minix_write_begin(struct file *file, struct address_space *mapping,
0426 loff_t pos, unsigned len,
0427 struct page **pagep, void **fsdata)
0428 {
0429 int ret;
0430
0431 ret = block_write_begin(mapping, pos, len, pagep, minix_get_block);
0432 if (unlikely(ret))
0433 minix_write_failed(mapping, pos + len);
0434
0435 return ret;
0436 }
0437
0438 static sector_t minix_bmap(struct address_space *mapping, sector_t block)
0439 {
0440 return generic_block_bmap(mapping,block,minix_get_block);
0441 }
0442
0443 static const struct address_space_operations minix_aops = {
0444 .dirty_folio = block_dirty_folio,
0445 .invalidate_folio = block_invalidate_folio,
0446 .read_folio = minix_read_folio,
0447 .writepage = minix_writepage,
0448 .write_begin = minix_write_begin,
0449 .write_end = generic_write_end,
0450 .bmap = minix_bmap,
0451 .direct_IO = noop_direct_IO
0452 };
0453
0454 static const struct inode_operations minix_symlink_inode_operations = {
0455 .get_link = page_get_link,
0456 .getattr = minix_getattr,
0457 };
0458
0459 void minix_set_inode(struct inode *inode, dev_t rdev)
0460 {
0461 if (S_ISREG(inode->i_mode)) {
0462 inode->i_op = &minix_file_inode_operations;
0463 inode->i_fop = &minix_file_operations;
0464 inode->i_mapping->a_ops = &minix_aops;
0465 } else if (S_ISDIR(inode->i_mode)) {
0466 inode->i_op = &minix_dir_inode_operations;
0467 inode->i_fop = &minix_dir_operations;
0468 inode->i_mapping->a_ops = &minix_aops;
0469 } else if (S_ISLNK(inode->i_mode)) {
0470 inode->i_op = &minix_symlink_inode_operations;
0471 inode_nohighmem(inode);
0472 inode->i_mapping->a_ops = &minix_aops;
0473 } else
0474 init_special_inode(inode, inode->i_mode, rdev);
0475 }
0476
0477
0478
0479
0480 static struct inode *V1_minix_iget(struct inode *inode)
0481 {
0482 struct buffer_head * bh;
0483 struct minix_inode * raw_inode;
0484 struct minix_inode_info *minix_inode = minix_i(inode);
0485 int i;
0486
0487 raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
0488 if (!raw_inode) {
0489 iget_failed(inode);
0490 return ERR_PTR(-EIO);
0491 }
0492 if (raw_inode->i_nlinks == 0) {
0493 printk("MINIX-fs: deleted inode referenced: %lu\n",
0494 inode->i_ino);
0495 brelse(bh);
0496 iget_failed(inode);
0497 return ERR_PTR(-ESTALE);
0498 }
0499 inode->i_mode = raw_inode->i_mode;
0500 i_uid_write(inode, raw_inode->i_uid);
0501 i_gid_write(inode, raw_inode->i_gid);
0502 set_nlink(inode, raw_inode->i_nlinks);
0503 inode->i_size = raw_inode->i_size;
0504 inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = raw_inode->i_time;
0505 inode->i_mtime.tv_nsec = 0;
0506 inode->i_atime.tv_nsec = 0;
0507 inode->i_ctime.tv_nsec = 0;
0508 inode->i_blocks = 0;
0509 for (i = 0; i < 9; i++)
0510 minix_inode->u.i1_data[i] = raw_inode->i_zone[i];
0511 minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
0512 brelse(bh);
0513 unlock_new_inode(inode);
0514 return inode;
0515 }
0516
0517
0518
0519
0520 static struct inode *V2_minix_iget(struct inode *inode)
0521 {
0522 struct buffer_head * bh;
0523 struct minix2_inode * raw_inode;
0524 struct minix_inode_info *minix_inode = minix_i(inode);
0525 int i;
0526
0527 raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
0528 if (!raw_inode) {
0529 iget_failed(inode);
0530 return ERR_PTR(-EIO);
0531 }
0532 if (raw_inode->i_nlinks == 0) {
0533 printk("MINIX-fs: deleted inode referenced: %lu\n",
0534 inode->i_ino);
0535 brelse(bh);
0536 iget_failed(inode);
0537 return ERR_PTR(-ESTALE);
0538 }
0539 inode->i_mode = raw_inode->i_mode;
0540 i_uid_write(inode, raw_inode->i_uid);
0541 i_gid_write(inode, raw_inode->i_gid);
0542 set_nlink(inode, raw_inode->i_nlinks);
0543 inode->i_size = raw_inode->i_size;
0544 inode->i_mtime.tv_sec = raw_inode->i_mtime;
0545 inode->i_atime.tv_sec = raw_inode->i_atime;
0546 inode->i_ctime.tv_sec = raw_inode->i_ctime;
0547 inode->i_mtime.tv_nsec = 0;
0548 inode->i_atime.tv_nsec = 0;
0549 inode->i_ctime.tv_nsec = 0;
0550 inode->i_blocks = 0;
0551 for (i = 0; i < 10; i++)
0552 minix_inode->u.i2_data[i] = raw_inode->i_zone[i];
0553 minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0]));
0554 brelse(bh);
0555 unlock_new_inode(inode);
0556 return inode;
0557 }
0558
0559
0560
0561
0562 struct inode *minix_iget(struct super_block *sb, unsigned long ino)
0563 {
0564 struct inode *inode;
0565
0566 inode = iget_locked(sb, ino);
0567 if (!inode)
0568 return ERR_PTR(-ENOMEM);
0569 if (!(inode->i_state & I_NEW))
0570 return inode;
0571
0572 if (INODE_VERSION(inode) == MINIX_V1)
0573 return V1_minix_iget(inode);
0574 else
0575 return V2_minix_iget(inode);
0576 }
0577
0578
0579
0580
0581 static struct buffer_head * V1_minix_update_inode(struct inode * inode)
0582 {
0583 struct buffer_head * bh;
0584 struct minix_inode * raw_inode;
0585 struct minix_inode_info *minix_inode = minix_i(inode);
0586 int i;
0587
0588 raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh);
0589 if (!raw_inode)
0590 return NULL;
0591 raw_inode->i_mode = inode->i_mode;
0592 raw_inode->i_uid = fs_high2lowuid(i_uid_read(inode));
0593 raw_inode->i_gid = fs_high2lowgid(i_gid_read(inode));
0594 raw_inode->i_nlinks = inode->i_nlink;
0595 raw_inode->i_size = inode->i_size;
0596 raw_inode->i_time = inode->i_mtime.tv_sec;
0597 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
0598 raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
0599 else for (i = 0; i < 9; i++)
0600 raw_inode->i_zone[i] = minix_inode->u.i1_data[i];
0601 mark_buffer_dirty(bh);
0602 return bh;
0603 }
0604
0605
0606
0607
0608 static struct buffer_head * V2_minix_update_inode(struct inode * inode)
0609 {
0610 struct buffer_head * bh;
0611 struct minix2_inode * raw_inode;
0612 struct minix_inode_info *minix_inode = minix_i(inode);
0613 int i;
0614
0615 raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh);
0616 if (!raw_inode)
0617 return NULL;
0618 raw_inode->i_mode = inode->i_mode;
0619 raw_inode->i_uid = fs_high2lowuid(i_uid_read(inode));
0620 raw_inode->i_gid = fs_high2lowgid(i_gid_read(inode));
0621 raw_inode->i_nlinks = inode->i_nlink;
0622 raw_inode->i_size = inode->i_size;
0623 raw_inode->i_mtime = inode->i_mtime.tv_sec;
0624 raw_inode->i_atime = inode->i_atime.tv_sec;
0625 raw_inode->i_ctime = inode->i_ctime.tv_sec;
0626 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
0627 raw_inode->i_zone[0] = old_encode_dev(inode->i_rdev);
0628 else for (i = 0; i < 10; i++)
0629 raw_inode->i_zone[i] = minix_inode->u.i2_data[i];
0630 mark_buffer_dirty(bh);
0631 return bh;
0632 }
0633
0634 static int minix_write_inode(struct inode *inode, struct writeback_control *wbc)
0635 {
0636 int err = 0;
0637 struct buffer_head *bh;
0638
0639 if (INODE_VERSION(inode) == MINIX_V1)
0640 bh = V1_minix_update_inode(inode);
0641 else
0642 bh = V2_minix_update_inode(inode);
0643 if (!bh)
0644 return -EIO;
0645 if (wbc->sync_mode == WB_SYNC_ALL && buffer_dirty(bh)) {
0646 sync_dirty_buffer(bh);
0647 if (buffer_req(bh) && !buffer_uptodate(bh)) {
0648 printk("IO error syncing minix inode [%s:%08lx]\n",
0649 inode->i_sb->s_id, inode->i_ino);
0650 err = -EIO;
0651 }
0652 }
0653 brelse (bh);
0654 return err;
0655 }
0656
0657 int minix_getattr(struct user_namespace *mnt_userns, const struct path *path,
0658 struct kstat *stat, u32 request_mask, unsigned int flags)
0659 {
0660 struct super_block *sb = path->dentry->d_sb;
0661 struct inode *inode = d_inode(path->dentry);
0662
0663 generic_fillattr(&init_user_ns, inode, stat);
0664 if (INODE_VERSION(inode) == MINIX_V1)
0665 stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb);
0666 else
0667 stat->blocks = (sb->s_blocksize / 512) * V2_minix_blocks(stat->size, sb);
0668 stat->blksize = sb->s_blocksize;
0669 return 0;
0670 }
0671
0672
0673
0674
0675 void minix_truncate(struct inode * inode)
0676 {
0677 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
0678 return;
0679 if (INODE_VERSION(inode) == MINIX_V1)
0680 V1_minix_truncate(inode);
0681 else
0682 V2_minix_truncate(inode);
0683 }
0684
0685 static struct dentry *minix_mount(struct file_system_type *fs_type,
0686 int flags, const char *dev_name, void *data)
0687 {
0688 return mount_bdev(fs_type, flags, dev_name, data, minix_fill_super);
0689 }
0690
0691 static struct file_system_type minix_fs_type = {
0692 .owner = THIS_MODULE,
0693 .name = "minix",
0694 .mount = minix_mount,
0695 .kill_sb = kill_block_super,
0696 .fs_flags = FS_REQUIRES_DEV,
0697 };
0698 MODULE_ALIAS_FS("minix");
0699
0700 static int __init init_minix_fs(void)
0701 {
0702 int err = init_inodecache();
0703 if (err)
0704 goto out1;
0705 err = register_filesystem(&minix_fs_type);
0706 if (err)
0707 goto out;
0708 return 0;
0709 out:
0710 destroy_inodecache();
0711 out1:
0712 return err;
0713 }
0714
0715 static void __exit exit_minix_fs(void)
0716 {
0717 unregister_filesystem(&minix_fs_type);
0718 destroy_inodecache();
0719 }
0720
0721 module_init(init_minix_fs)
0722 module_exit(exit_minix_fs)
0723 MODULE_LICENSE("GPL");
0724