1*44626Smckusick /* 2*44626Smckusick * $Id: ifs_ops.c,v 5.2 90/06/23 22:19:28 jsp Rel $ 3*44626Smckusick * 4*44626Smckusick * Copyright (c) 1989 Jan-Simon Pendry 5*44626Smckusick * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 6*44626Smckusick * Copyright (c) 1989 The Regents of the University of California. 7*44626Smckusick * All rights reserved. 8*44626Smckusick * 9*44626Smckusick * This code is derived from software contributed to Berkeley by 10*44626Smckusick * Jan-Simon Pendry at Imperial College, London. 11*44626Smckusick * 12*44626Smckusick * %sccs.include.redist.c% 13*44626Smckusick * 14*44626Smckusick * @(#)ifs_ops.c 5.1 (Berkeley) 06/29/90 15*44626Smckusick */ 16*44626Smckusick 17*44626Smckusick #include "am.h" 18*44626Smckusick 19*44626Smckusick #ifdef HAS_IFS 20*44626Smckusick 21*44626Smckusick /* 22*44626Smckusick * Inheritance file system. 23*44626Smckusick * This implements a filesystem restart. 24*44626Smckusick * 25*44626Smckusick * This is a *gross* hack - it knows far too 26*44626Smckusick * much about the way other parts of the 27*44626Smckusick * sytem work. See restart.c too. 28*44626Smckusick */ 29*44626Smckusick static char not_a_filesystem[] = "Attempting to inherit not-a-filesystem"; 30*44626Smckusick /* 31*44626Smckusick * This should never be called. 32*44626Smckusick */ 33*44626Smckusick static int ifs_match() 34*44626Smckusick { 35*44626Smckusick plog(XLOG_FATAL, "ifs_match called!"); 36*44626Smckusick return FALSE; 37*44626Smckusick } 38*44626Smckusick 39*44626Smckusick static int ifs_init(mf) 40*44626Smckusick mntfs *mf; 41*44626Smckusick { 42*44626Smckusick mntfs *mf_link = (mntfs *) mf->mf_private; 43*44626Smckusick if (mf_link == 0) { 44*44626Smckusick plog(XLOG_FATAL, not_a_filesystem); 45*44626Smckusick return EINVAL; 46*44626Smckusick } 47*44626Smckusick /* 48*44626Smckusick * Fill in attribute fields 49*44626Smckusick */ 50*44626Smckusick mf_link->mf_fattr.type = NFLNK; 51*44626Smckusick mf_link->mf_fattr.mode = NFSMODE_LNK | 0777; 52*44626Smckusick mf_link->mf_fattr.nlink = 1; 53*44626Smckusick mf_link->mf_fattr.size = MAXPATHLEN / 4; 54*44626Smckusick if (mf_link->mf_ops->fs_init) 55*44626Smckusick return (*mf_link->mf_ops->fs_init)(mf_link); 56*44626Smckusick return 0; 57*44626Smckusick } 58*44626Smckusick 59*44626Smckusick /*ARGSUSED*/ 60*44626Smckusick static int ifs_mount(mp) 61*44626Smckusick am_node *mp; 62*44626Smckusick { 63*44626Smckusick mntfs *mf = mp->am_mnt; 64*44626Smckusick 65*44626Smckusick /* 66*44626Smckusick * Take the linked mount point and 67*44626Smckusick * propogate. 68*44626Smckusick */ 69*44626Smckusick mntfs *mf_link = (mntfs *) mf->mf_private; 70*44626Smckusick if (mf_link == 0) { 71*44626Smckusick plog(XLOG_FATAL, not_a_filesystem); 72*44626Smckusick return EINVAL; /*XXX*/ 73*44626Smckusick } 74*44626Smckusick 75*44626Smckusick mf_link->mf_fo = mf->mf_fo; 76*44626Smckusick mf_link->mf_fattr.fileid = mf->mf_fattr.fileid; 77*44626Smckusick 78*44626Smckusick /* 79*44626Smckusick * Discard the old map. 80*44626Smckusick * Don't call am_unmounted since this 81*44626Smckusick * node was never really mounted in the 82*44626Smckusick * first place. 83*44626Smckusick */ 84*44626Smckusick mf->mf_private = 0; 85*44626Smckusick free_mntfs(mf); 86*44626Smckusick /* 87*44626Smckusick * Free the dangling reference 88*44626Smckusick * to the mount link. 89*44626Smckusick */ 90*44626Smckusick free_mntfs(mf_link); 91*44626Smckusick /* 92*44626Smckusick * Get a hold of the other entry 93*44626Smckusick */ 94*44626Smckusick mp->am_mnt = mf = mf_link; 95*44626Smckusick mf->mf_flags &= ~MFF_RESTART; 96*44626Smckusick 97*44626Smckusick /* Say what happened */ 98*44626Smckusick plog(XLOG_INFO, "restarting %s on %s", mf->mf_info, mf->mf_mount); 99*44626Smckusick 100*44626Smckusick /* 101*44626Smckusick * XXX - must do the am_mounted call here 102*44626Smckusick */ 103*44626Smckusick if (mf->mf_ops->fs_flags & FS_MBACKGROUND) 104*44626Smckusick am_mounted(mp); 105*44626Smckusick 106*44626Smckusick new_ttl(mp); 107*44626Smckusick 108*44626Smckusick return 0; 109*44626Smckusick } 110*44626Smckusick 111*44626Smckusick /*ARGSUSED*/ 112*44626Smckusick static int ifs_umount(mp) 113*44626Smckusick am_node *mp; 114*44626Smckusick { 115*44626Smckusick /* 116*44626Smckusick * Always succeed 117*44626Smckusick */ 118*44626Smckusick return 0; 119*44626Smckusick } 120*44626Smckusick 121*44626Smckusick /* 122*44626Smckusick * Ops structure 123*44626Smckusick */ 124*44626Smckusick am_ops ifs_ops = { 125*44626Smckusick "inherit", 126*44626Smckusick ifs_match, 127*44626Smckusick ifs_init, 128*44626Smckusick ifs_mount, 129*44626Smckusick ifs_umount, 130*44626Smckusick efs_lookuppn, 131*44626Smckusick efs_readdir, 132*44626Smckusick 0, /* ifs_readlink */ 133*44626Smckusick 0, /* ifs_mounted */ 134*44626Smckusick 0, /* ifs_umounted */ 135*44626Smckusick find_afs_srvr, 136*44626Smckusick FS_DISCARD 137*44626Smckusick }; 138*44626Smckusick 139*44626Smckusick #endif /* HAS_IFS */ 140