xref: /minix3/minix/lib/libpuffs/mount.c (revision ba736c796854b82e29da17267614db0a449419db)
1*ba736c79SDavid van Moolenbroek /* Created (MFS based):
2*ba736c79SDavid van Moolenbroek  *   June 2011 (Evgeniy Ivanov)
3*ba736c79SDavid van Moolenbroek  */
4*ba736c79SDavid van Moolenbroek 
5*ba736c79SDavid van Moolenbroek #include "fs.h"
6*ba736c79SDavid van Moolenbroek #include <fcntl.h>
7*ba736c79SDavid van Moolenbroek #include <minix/vfsif.h>
8*ba736c79SDavid van Moolenbroek 
9*ba736c79SDavid van Moolenbroek /*===========================================================================*
10*ba736c79SDavid van Moolenbroek  *				fs_mount				     *
11*ba736c79SDavid van Moolenbroek  *===========================================================================*/
fs_mount(dev_t __unused dev,unsigned int flags,struct fsdriver_node * root_node,unsigned int * res_flags)12*ba736c79SDavid van Moolenbroek int fs_mount(dev_t __unused dev, unsigned int flags,
13*ba736c79SDavid van Moolenbroek 	struct fsdriver_node *root_node, unsigned int *res_flags)
14*ba736c79SDavid van Moolenbroek {
15*ba736c79SDavid van Moolenbroek   struct vattr *root_va;
16*ba736c79SDavid van Moolenbroek 
17*ba736c79SDavid van Moolenbroek   is_readonly_fs = !!(flags & REQ_RDONLY);
18*ba736c79SDavid van Moolenbroek 
19*ba736c79SDavid van Moolenbroek   /* Open root pnode */
20*ba736c79SDavid van Moolenbroek   global_pu->pu_pn_root->pn_count = 1;
21*ba736c79SDavid van Moolenbroek 
22*ba736c79SDavid van Moolenbroek   /* Root pnode properties */
23*ba736c79SDavid van Moolenbroek   root_va = &global_pu->pu_pn_root->pn_va;
24*ba736c79SDavid van Moolenbroek   root_node->fn_ino_nr = root_va->va_fileid;
25*ba736c79SDavid van Moolenbroek   root_node->fn_mode = root_va->va_mode;
26*ba736c79SDavid van Moolenbroek   root_node->fn_size = root_va->va_size;
27*ba736c79SDavid van Moolenbroek   root_node->fn_uid = root_va->va_uid;
28*ba736c79SDavid van Moolenbroek   root_node->fn_gid = root_va->va_gid;
29*ba736c79SDavid van Moolenbroek   root_node->fn_dev = NO_DEV;
30*ba736c79SDavid van Moolenbroek 
31*ba736c79SDavid van Moolenbroek   *res_flags = RES_NOFLAGS;
32*ba736c79SDavid van Moolenbroek 
33*ba736c79SDavid van Moolenbroek   mounted = TRUE;
34*ba736c79SDavid van Moolenbroek 
35*ba736c79SDavid van Moolenbroek   return(OK);
36*ba736c79SDavid van Moolenbroek }
37*ba736c79SDavid van Moolenbroek 
38*ba736c79SDavid van Moolenbroek 
39*ba736c79SDavid van Moolenbroek /*===========================================================================*
40*ba736c79SDavid van Moolenbroek  *				fs_mountpt				     *
41*ba736c79SDavid van Moolenbroek  *===========================================================================*/
fs_mountpt(ino_t ino_nr)42*ba736c79SDavid van Moolenbroek int fs_mountpt(ino_t ino_nr)
43*ba736c79SDavid van Moolenbroek {
44*ba736c79SDavid van Moolenbroek /* This function looks up the mount point, it checks the condition whether
45*ba736c79SDavid van Moolenbroek  * the partition can be mounted on the pnode or not.
46*ba736c79SDavid van Moolenbroek  */
47*ba736c79SDavid van Moolenbroek   int r = OK;
48*ba736c79SDavid van Moolenbroek   struct puffs_node *pn;
49*ba736c79SDavid van Moolenbroek   mode_t bits;
50*ba736c79SDavid van Moolenbroek 
51*ba736c79SDavid van Moolenbroek   if ((pn = puffs_pn_nodewalk(global_pu, find_inode_cb, &ino_nr)) == NULL)
52*ba736c79SDavid van Moolenbroek 	return(EINVAL);
53*ba736c79SDavid van Moolenbroek 
54*ba736c79SDavid van Moolenbroek   if (pn->pn_mountpoint) r = EBUSY;
55*ba736c79SDavid van Moolenbroek 
56*ba736c79SDavid van Moolenbroek   /* It may not be special. */
57*ba736c79SDavid van Moolenbroek   bits = pn->pn_va.va_mode & I_TYPE;
58*ba736c79SDavid van Moolenbroek   if(bits == I_BLOCK_SPECIAL || bits == I_CHAR_SPECIAL) r = ENOTDIR;
59*ba736c79SDavid van Moolenbroek 
60*ba736c79SDavid van Moolenbroek   if (r == OK)
61*ba736c79SDavid van Moolenbroek 	pn->pn_mountpoint = TRUE;
62*ba736c79SDavid van Moolenbroek 
63*ba736c79SDavid van Moolenbroek   return(r);
64*ba736c79SDavid van Moolenbroek }
65*ba736c79SDavid van Moolenbroek 
66*ba736c79SDavid van Moolenbroek 
67*ba736c79SDavid van Moolenbroek /*===========================================================================*
68*ba736c79SDavid van Moolenbroek  *				fs_unmount				     *
69*ba736c79SDavid van Moolenbroek  *===========================================================================*/
fs_unmount(void)70*ba736c79SDavid van Moolenbroek void fs_unmount(void)
71*ba736c79SDavid van Moolenbroek {
72*ba736c79SDavid van Moolenbroek   int error;
73*ba736c79SDavid van Moolenbroek 
74*ba736c79SDavid van Moolenbroek   /* Always force unmounting, as VFS will not tolerate failure. */
75*ba736c79SDavid van Moolenbroek   error = global_pu->pu_ops.puffs_fs_unmount(global_pu, MNT_FORCE);
76*ba736c79SDavid van Moolenbroek   if (error) {
77*ba736c79SDavid van Moolenbroek 	lpuffs_debug("user handler failed to unmount filesystem!\
78*ba736c79SDavid van Moolenbroek 		Force unmount!\n");
79*ba736c79SDavid van Moolenbroek   }
80*ba736c79SDavid van Moolenbroek 
81*ba736c79SDavid van Moolenbroek   fs_sync();
82*ba736c79SDavid van Moolenbroek 
83*ba736c79SDavid van Moolenbroek   /* Finish off the unmount. */
84*ba736c79SDavid van Moolenbroek   PU_SETSTATE(global_pu, PUFFS_STATE_UNMOUNTED);
85*ba736c79SDavid van Moolenbroek   mounted = FALSE;
86*ba736c79SDavid van Moolenbroek   global_pu->pu_pn_root->pn_count--;
87*ba736c79SDavid van Moolenbroek }
88