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