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