xref: /minix3/minix/fs/isofs/mount.c (revision 77e79d33746fa2b709086b9caa51b1415d66c801)
1c2f99d7cSDavid van Moolenbroek #include "inc.h"
2c2f99d7cSDavid van Moolenbroek #include <minix/vfsif.h>
3c2f99d7cSDavid van Moolenbroek 
fs_mount(dev_t dev,unsigned int __unused flags,struct fsdriver_node * root_node,unsigned int * res_flags)4c2f99d7cSDavid van Moolenbroek int fs_mount(dev_t dev, unsigned int __unused flags,
5c2f99d7cSDavid van Moolenbroek 	struct fsdriver_node *root_node, unsigned int *res_flags)
6c2f99d7cSDavid van Moolenbroek {
7c2f99d7cSDavid van Moolenbroek 	int r;
8c2f99d7cSDavid van Moolenbroek 
9c2f99d7cSDavid van Moolenbroek 	fs_dev = dev;
10c2f99d7cSDavid van Moolenbroek 
11c2f99d7cSDavid van Moolenbroek 	/* Open the device the file system lives on in read only mode */
12c2f99d7cSDavid van Moolenbroek 	if (bdev_open(fs_dev, BDEV_R_BIT) != OK)
13c2f99d7cSDavid van Moolenbroek 		return EINVAL;
14c2f99d7cSDavid van Moolenbroek 
15c2f99d7cSDavid van Moolenbroek 	/* Read the superblock */
16c2f99d7cSDavid van Moolenbroek 	r = read_vds(&v_pri, fs_dev);
17c2f99d7cSDavid van Moolenbroek 	if (r != OK) {
18c2f99d7cSDavid van Moolenbroek 		bdev_close(fs_dev);
19c2f99d7cSDavid van Moolenbroek 		return r;
20c2f99d7cSDavid van Moolenbroek 	}
21c2f99d7cSDavid van Moolenbroek 
22c2f99d7cSDavid van Moolenbroek 	/* Return some root inode properties */
23c2f99d7cSDavid van Moolenbroek 	root_node->fn_ino_nr = v_pri.inode_root->i_stat.st_ino;
24c2f99d7cSDavid van Moolenbroek 	root_node->fn_mode = v_pri.inode_root->i_stat.st_mode;
25c2f99d7cSDavid van Moolenbroek 	root_node->fn_size = v_pri.inode_root->i_stat.st_size;
26c2f99d7cSDavid van Moolenbroek 	root_node->fn_uid = SYS_UID; /* Always root */
27*77e79d33SDavid van Moolenbroek 	root_node->fn_gid = SYS_GID; /* wheel */
28c2f99d7cSDavid van Moolenbroek 	root_node->fn_dev = NO_DEV;
29c2f99d7cSDavid van Moolenbroek 
30c2f99d7cSDavid van Moolenbroek 	*res_flags = RES_NOFLAGS;
31c2f99d7cSDavid van Moolenbroek 
32c2f99d7cSDavid van Moolenbroek 	return r;
33c2f99d7cSDavid van Moolenbroek }
34c2f99d7cSDavid van Moolenbroek 
fs_mountpt(ino_t ino_nr)35c2f99d7cSDavid van Moolenbroek int fs_mountpt(ino_t ino_nr)
36c2f99d7cSDavid van Moolenbroek {
37c2f99d7cSDavid van Moolenbroek 	/*
38c2f99d7cSDavid van Moolenbroek 	 * This function looks up the mount point, it checks the condition
39c2f99d7cSDavid van Moolenbroek 	 * whether the partition can be mounted on the inode or not.
40c2f99d7cSDavid van Moolenbroek 	 */
41c2f99d7cSDavid van Moolenbroek 	struct inode *rip;
42c2f99d7cSDavid van Moolenbroek 
43b1d06847SJean-Baptiste Boric 	if ((rip = get_inode(ino_nr)) == NULL)
44c2f99d7cSDavid van Moolenbroek 		return EINVAL;
45c2f99d7cSDavid van Moolenbroek 
46c2f99d7cSDavid van Moolenbroek 	if (rip->i_mountpoint)
47c2f99d7cSDavid van Moolenbroek 		return EBUSY;
48c2f99d7cSDavid van Moolenbroek 
49c2f99d7cSDavid van Moolenbroek 	/* The inode must be a directory. */
50c2f99d7cSDavid van Moolenbroek 	if ((rip->i_stat.st_mode & I_TYPE) != I_DIRECTORY)
51c2f99d7cSDavid van Moolenbroek 		return ENOTDIR;
52c2f99d7cSDavid van Moolenbroek 
53c2f99d7cSDavid van Moolenbroek 	rip->i_mountpoint = TRUE;
54c2f99d7cSDavid van Moolenbroek 
55c2f99d7cSDavid van Moolenbroek 	return OK;
56c2f99d7cSDavid van Moolenbroek }
57c2f99d7cSDavid van Moolenbroek 
fs_unmount(void)58c2f99d7cSDavid van Moolenbroek void fs_unmount(void)
59c2f99d7cSDavid van Moolenbroek {
60c2f99d7cSDavid van Moolenbroek 	release_vol_pri_desc(&v_pri);	/* Release the super block */
61c2f99d7cSDavid van Moolenbroek 
62c2f99d7cSDavid van Moolenbroek 	bdev_close(fs_dev);
63c2f99d7cSDavid van Moolenbroek 
64c2f99d7cSDavid van Moolenbroek 	if (check_inodes() == FALSE)
65b1d06847SJean-Baptiste Boric 		puts("ISOFS: unmounting with in-use inodes!\n");
66c2f99d7cSDavid van Moolenbroek }
67