67 lines
1.4 KiB
C
67 lines
1.4 KiB
C
#include "inc.h"
|
|
#include <minix/vfsif.h>
|
|
|
|
int fs_mount(dev_t dev, unsigned int __unused flags,
|
|
struct fsdriver_node *root_node, unsigned int *res_flags)
|
|
{
|
|
int r;
|
|
|
|
fs_dev = dev;
|
|
|
|
/* Open the device the file system lives on in read only mode */
|
|
if (bdev_open(fs_dev, BDEV_R_BIT) != OK)
|
|
return EINVAL;
|
|
|
|
/* Read the superblock */
|
|
r = read_vds(&v_pri, fs_dev);
|
|
if (r != OK) {
|
|
bdev_close(fs_dev);
|
|
return r;
|
|
}
|
|
|
|
/* Return some root inode properties */
|
|
root_node->fn_ino_nr = v_pri.inode_root->i_stat.st_ino;
|
|
root_node->fn_mode = v_pri.inode_root->i_stat.st_mode;
|
|
root_node->fn_size = v_pri.inode_root->i_stat.st_size;
|
|
root_node->fn_uid = SYS_UID; /* Always root */
|
|
root_node->fn_gid = SYS_GID; /* operator */
|
|
root_node->fn_dev = NO_DEV;
|
|
|
|
*res_flags = RES_NOFLAGS;
|
|
|
|
return r;
|
|
}
|
|
|
|
int fs_mountpt(ino_t ino_nr)
|
|
{
|
|
/*
|
|
* This function looks up the mount point, it checks the condition
|
|
* whether the partition can be mounted on the inode or not.
|
|
*/
|
|
struct inode *rip;
|
|
|
|
if ((rip = find_inode(ino_nr)) == NULL)
|
|
return EINVAL;
|
|
|
|
if (rip->i_mountpoint)
|
|
return EBUSY;
|
|
|
|
/* The inode must be a directory. */
|
|
if ((rip->i_stat.st_mode & I_TYPE) != I_DIRECTORY)
|
|
return ENOTDIR;
|
|
|
|
rip->i_mountpoint = TRUE;
|
|
|
|
return OK;
|
|
}
|
|
|
|
void fs_unmount(void)
|
|
{
|
|
release_vol_pri_desc(&v_pri); /* Release the super block */
|
|
|
|
bdev_close(fs_dev);
|
|
|
|
if (check_inodes() == FALSE)
|
|
printf("ISOFS: unmounting with in-use inodes!\n");
|
|
}
|