1/* $NetBSD$ */ 2 3/* 4 * Copyright (c) 1997-2009 Erez Zadok 5 * Copyright (c) 1989 Jan-Simon Pendry 6 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 7 * Copyright (c) 1989 The Regents of the University of California. 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to Berkeley by 11 * Jan-Simon Pendry at Imperial College, London. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. All advertising materials mentioning features or use of this software 22 * must display the following acknowledgment: 23 * This product includes software developed by the University of 24 * California, Berkeley and its contributors. 25 * 4. Neither the name of the University nor the names of its contributors 26 * may be used to endorse or promote products derived from this software 27 * without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * 42 * File: am-utils/amd/srvr_amfs_auto.c 43 * 44 */ 45 46/* 47 * Automount FS server ("localhost") modeling 48 */ 49 50#ifdef HAVE_CONFIG_H 51# include <config.h> 52#endif /* HAVE_CONFIG_H */ 53#include <am_defs.h> 54#include <amd.h> 55 56/* globals */ 57 58/* statics */ 59static qelem amfs_auto_srvr_list = {&amfs_auto_srvr_list, &amfs_auto_srvr_list}; 60static fserver *localhost; 61 62 63/* 64 * Find an nfs server for the local host 65 */ 66fserver * 67amfs_generic_find_srvr(mntfs *mf) 68{ 69 fserver *fs = localhost; 70 71 if (!fs) { 72 fs = ALLOC(struct fserver); 73 fs->fs_refc = 0; 74 fs->fs_host = strdup("localhost"); 75 fs->fs_ip = NULL; 76 fs->fs_cid = 0; 77 fs->fs_pinger = AM_PINGER; 78 fs->fs_flags = FSF_VALID | FSF_PING_UNINIT; 79 fs->fs_type = "local"; 80 fs->fs_private = NULL; 81 fs->fs_prfree = NULL; 82 83 ins_que(&fs->fs_q, &amfs_auto_srvr_list); 84 85 srvrlog(fs, "starts up"); 86 87 localhost = fs; 88 } 89 fs->fs_refc++; 90 91 return fs; 92} 93 94 95/***************************************************************************** 96 *** GENERIC ROUTINES FOLLOW 97 *****************************************************************************/ 98 99/* 100 * Wakeup anything waiting for this server 101 */ 102void 103wakeup_srvr(fserver *fs) 104{ 105 fs->fs_flags &= ~FSF_WANT; 106 wakeup((voidp) fs); 107} 108 109 110/* 111 * Called when final ttl of server has expired 112 */ 113static void 114timeout_srvr(voidp v) 115{ 116 fserver *fs = v; 117 118 /* 119 * If the reference count is still zero then 120 * we are free to remove this node 121 */ 122 if (fs->fs_refc == 0) { 123 dlog("Deleting file server %s", fs->fs_host); 124 if (fs->fs_flags & FSF_WANT) 125 wakeup_srvr(fs); 126 127 /* 128 * Remove from queue. 129 */ 130 rem_que(&fs->fs_q); 131 /* 132 * (Possibly) call the private free routine. 133 */ 134 if (fs->fs_private && fs->fs_prfree) 135 (*fs->fs_prfree) (fs->fs_private); 136 137 /* 138 * Free the net address 139 */ 140 if (fs->fs_ip) 141 XFREE(fs->fs_ip); 142 143 /* 144 * Free the host name. 145 */ 146 XFREE(fs->fs_host); 147 148 /* 149 * Discard the fserver object. 150 */ 151 XFREE(fs); 152 } 153} 154 155 156/* 157 * Free a file server 158 */ 159void 160free_srvr(fserver *fs) 161{ 162 if (--fs->fs_refc == 0) { 163 /* 164 * The reference count is now zero, 165 * so arrange for this node to be 166 * removed in AM_TTL seconds if no 167 * other mntfs is referencing it. 168 */ 169 int ttl = (FSRV_ERROR(fs) || FSRV_ISDOWN(fs)) ? 19 : AM_TTL; 170 171 dlog("Last hard reference to file server %s - will timeout in %ds", fs->fs_host, ttl); 172 if (fs->fs_cid) { 173 untimeout(fs->fs_cid); 174 /* 175 * Turn off pinging - XXX 176 */ 177 fs->fs_flags &= ~FSF_PINGING; 178 } 179 180 /* 181 * Keep structure lying around for a while 182 */ 183 fs->fs_cid = timeout(ttl, timeout_srvr, (voidp) fs); 184 185 /* 186 * Mark the fileserver down and invalid again 187 */ 188 fs->fs_flags &= ~FSF_VALID; 189 fs->fs_flags |= FSF_DOWN; 190 } 191} 192 193 194/* 195 * Make a duplicate fserver reference 196 */ 197fserver * 198dup_srvr(fserver *fs) 199{ 200 fs->fs_refc++; 201 return fs; 202} 203 204 205/* 206 * Log state change 207 */ 208void 209srvrlog(fserver *fs, char *state) 210{ 211 plog(XLOG_INFO, "file server %s, type %s, state %s", fs->fs_host, fs->fs_type, state); 212} 213