xref: /minix3/minix/fs/mfs/misc.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #include "fs.h"
2*433d6423SLionel Sambuc #include <assert.h>
3*433d6423SLionel Sambuc #include <minix/vfsif.h>
4*433d6423SLionel Sambuc #include <minix/bdev.h>
5*433d6423SLionel Sambuc #include "inode.h"
6*433d6423SLionel Sambuc #include "clean.h"
7*433d6423SLionel Sambuc 
8*433d6423SLionel Sambuc /*===========================================================================*
9*433d6423SLionel Sambuc  *				fs_sync					     *
10*433d6423SLionel Sambuc  *===========================================================================*/
11*433d6423SLionel Sambuc int fs_sync()
12*433d6423SLionel Sambuc {
13*433d6423SLionel Sambuc /* Perform the sync() system call.  Flush all the tables.
14*433d6423SLionel Sambuc  * The order in which the various tables are flushed is critical.  The
15*433d6423SLionel Sambuc  * blocks must be flushed last, since rw_inode() leaves its results in
16*433d6423SLionel Sambuc  * the block cache.
17*433d6423SLionel Sambuc  */
18*433d6423SLionel Sambuc   struct inode *rip;
19*433d6423SLionel Sambuc 
20*433d6423SLionel Sambuc   assert(lmfs_nr_bufs() > 0);
21*433d6423SLionel Sambuc 
22*433d6423SLionel Sambuc   /* Write all the dirty inodes to the disk. */
23*433d6423SLionel Sambuc   for(rip = &inode[0]; rip < &inode[NR_INODES]; rip++)
24*433d6423SLionel Sambuc 	  if(rip->i_count > 0 && IN_ISDIRTY(rip)) rw_inode(rip, WRITING);
25*433d6423SLionel Sambuc 
26*433d6423SLionel Sambuc   /* Write all the dirty blocks to the disk. */
27*433d6423SLionel Sambuc   lmfs_flushall();
28*433d6423SLionel Sambuc 
29*433d6423SLionel Sambuc   return(OK);		/* sync() can't fail */
30*433d6423SLionel Sambuc }
31*433d6423SLionel Sambuc 
32*433d6423SLionel Sambuc 
33*433d6423SLionel Sambuc /*===========================================================================*
34*433d6423SLionel Sambuc  *				fs_flush				     *
35*433d6423SLionel Sambuc  *===========================================================================*/
36*433d6423SLionel Sambuc int fs_flush()
37*433d6423SLionel Sambuc {
38*433d6423SLionel Sambuc /* Flush the blocks of a device from the cache after writing any dirty blocks
39*433d6423SLionel Sambuc  * to disk.
40*433d6423SLionel Sambuc  */
41*433d6423SLionel Sambuc   dev_t dev = fs_m_in.m_vfs_fs_flush.device;
42*433d6423SLionel Sambuc   if(dev == fs_dev && lmfs_bufs_in_use() > 0) return(EBUSY);
43*433d6423SLionel Sambuc 
44*433d6423SLionel Sambuc   lmfs_flushall();
45*433d6423SLionel Sambuc   lmfs_invalidate(dev);
46*433d6423SLionel Sambuc 
47*433d6423SLionel Sambuc   return(OK);
48*433d6423SLionel Sambuc }
49*433d6423SLionel Sambuc 
50*433d6423SLionel Sambuc 
51*433d6423SLionel Sambuc /*===========================================================================*
52*433d6423SLionel Sambuc  *				fs_new_driver				     *
53*433d6423SLionel Sambuc  *===========================================================================*/
54*433d6423SLionel Sambuc int fs_new_driver(void)
55*433d6423SLionel Sambuc {
56*433d6423SLionel Sambuc /* Set a new driver endpoint for this device. */
57*433d6423SLionel Sambuc   dev_t dev;
58*433d6423SLionel Sambuc   cp_grant_id_t label_gid;
59*433d6423SLionel Sambuc   size_t label_len;
60*433d6423SLionel Sambuc   char label[sizeof(fs_dev_label)];
61*433d6423SLionel Sambuc   int r;
62*433d6423SLionel Sambuc 
63*433d6423SLionel Sambuc   dev = fs_m_in.m_vfs_fs_new_driver.device;
64*433d6423SLionel Sambuc   label_gid = fs_m_in.m_vfs_fs_new_driver.grant;
65*433d6423SLionel Sambuc   label_len = fs_m_in.m_vfs_fs_new_driver.path_len;
66*433d6423SLionel Sambuc 
67*433d6423SLionel Sambuc   if (label_len > sizeof(label))
68*433d6423SLionel Sambuc 	return(EINVAL);
69*433d6423SLionel Sambuc 
70*433d6423SLionel Sambuc   r = sys_safecopyfrom(fs_m_in.m_source, label_gid, (vir_bytes) 0,
71*433d6423SLionel Sambuc 	(vir_bytes) label, label_len);
72*433d6423SLionel Sambuc 
73*433d6423SLionel Sambuc   if (r != OK) {
74*433d6423SLionel Sambuc 	printf("MFS: fs_new_driver safecopyfrom failed (%d)\n", r);
75*433d6423SLionel Sambuc 	return(EINVAL);
76*433d6423SLionel Sambuc   }
77*433d6423SLionel Sambuc 
78*433d6423SLionel Sambuc   bdev_driver(dev, label);
79*433d6423SLionel Sambuc 
80*433d6423SLionel Sambuc   return(OK);
81*433d6423SLionel Sambuc }
82*433d6423SLionel Sambuc 
83*433d6423SLionel Sambuc int fs_bpeek(void)
84*433d6423SLionel Sambuc {
85*433d6423SLionel Sambuc 	return lmfs_do_bpeek(&fs_m_in);
86*433d6423SLionel Sambuc }
87