1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)nfs_serv.c 8.3 (Berkeley) 1/12/94 |
37 * $Id: nfs_serv.c,v 1.40 1997/03/29 12:40:18 bde Exp $ |
38 */ 39 40/* 41 * nfs version 2 and 3 server calls to vnode ops 42 * - these routines generally have 3 phases 43 * 1 - break down and validate rpc request in mbuf list 44 * 2 - do the vnode ops for the request 45 * (surprisingly ?? many are very similar to syscalls in vfs_syscalls.c) --- 948 unchanged lines hidden (view full) --- 994 */ 995 s = splsoftclock(); 996 owp = NULL; 997 wp = slp->ns_tq.lh_first; 998 while (wp && wp->nd_time < nfsd->nd_time) { 999 owp = wp; 1000 wp = wp->nd_tq.le_next; 1001 } |
1002 NFS_DPF(WG, ("Q%03x", nfsd->nd_retxid & 0xfff)); |
1003 if (owp) { 1004 LIST_INSERT_AFTER(owp, nfsd, nd_tq); 1005 } else { 1006 LIST_INSERT_HEAD(&slp->ns_tq, nfsd, nd_tq); 1007 } 1008 if (nfsd->nd_mrep) { 1009 wpp = NWDELAYHASH(slp, nfsd->nd_fh.fh_fid.fid_data); 1010 owp = NULL; --- 35 unchanged lines hidden (view full) --- 1046 cur_usec = (u_quad_t)time.tv_sec * 1000000 + (u_quad_t)time.tv_usec; 1047 s = splsoftclock(); 1048 for (nfsd = slp->ns_tq.lh_first; nfsd; nfsd = owp) { 1049 owp = nfsd->nd_tq.le_next; 1050 if (nfsd->nd_time > cur_usec) 1051 break; 1052 if (nfsd->nd_mreq) 1053 continue; |
1054 NFS_DPF(WG, ("P%03x", nfsd->nd_retxid & 0xfff)); |
1055 LIST_REMOVE(nfsd, nd_tq); 1056 LIST_REMOVE(nfsd, nd_hash); 1057 splx(s); 1058 mrep = nfsd->nd_mrep; 1059 nfsd->nd_mrep = NULL; 1060 cred = &nfsd->nd_cr; 1061 v3 = (nfsd->nd_flag & ND_NFSV3); 1062 forat_ret = aftat_ret = 1; --- 60 unchanged lines hidden (view full) --- 1123 } 1124 1125 /* 1126 * Loop around generating replies for all write rpcs that have 1127 * now been completed. 1128 */ 1129 swp = nfsd; 1130 do { |
1131 NFS_DPF(WG, ("R%03x", nfsd->nd_retxid & 0xfff)); |
1132 if (error) { 1133 nfsm_writereply(NFSX_WCCDATA(v3), v3); 1134 if (v3) { 1135 nfsm_srvwcc_data(forat_ret, &forat, aftat_ret, &va); 1136 } 1137 } else { 1138 nfsm_writereply(NFSX_PREOPATTR(v3) + 1139 NFSX_POSTOPORFATTR(v3) + 2 * NFSX_UNSIGNED + --- 43 unchanged lines hidden (view full) --- 1183 splx(s); 1184 1185 /* 1186 * Search for a reply to return. 1187 */ 1188 s = splsoftclock(); 1189 for (nfsd = slp->ns_tq.lh_first; nfsd; nfsd = nfsd->nd_tq.le_next) 1190 if (nfsd->nd_mreq) { |
1191 NFS_DPF(WG, ("X%03x", nfsd->nd_retxid & 0xfff)); |
1192 LIST_REMOVE(nfsd, nd_tq); 1193 *mrq = nfsd->nd_mreq; 1194 *ndp = nfsd; 1195 break; 1196 } 1197 splx(s); 1198 return (0); 1199} --- 8 unchanged lines hidden (view full) --- 1208 */ 1209static void 1210nfsrvw_coalesce(owp, nfsd) 1211 register struct nfsrv_descript *owp; 1212 register struct nfsrv_descript *nfsd; 1213{ 1214 register int overlap; 1215 register struct mbuf *mp; |
1216 struct nfsrv_descript *p; |
1217 |
1218 NFS_DPF(WG, ("C%03x-%03x", 1219 nfsd->nd_retxid & 0xfff, owp->nd_retxid & 0xfff)); |
1220 LIST_REMOVE(nfsd, nd_hash); 1221 LIST_REMOVE(nfsd, nd_tq); 1222 if (owp->nd_eoff < nfsd->nd_eoff) { 1223 overlap = owp->nd_eoff - nfsd->nd_off; 1224 if (overlap < 0) 1225 panic("nfsrv_coalesce: bad off"); 1226 if (overlap > 0) 1227 m_adj(nfsd->nd_mrep, overlap); --- 6 unchanged lines hidden (view full) --- 1234 m_freem(nfsd->nd_mrep); 1235 nfsd->nd_mrep = NULL; 1236 if (nfsd->nd_stable == NFSV3WRITE_FILESYNC) 1237 owp->nd_stable = NFSV3WRITE_FILESYNC; 1238 else if (nfsd->nd_stable == NFSV3WRITE_DATASYNC && 1239 owp->nd_stable == NFSV3WRITE_UNSTABLE) 1240 owp->nd_stable = NFSV3WRITE_DATASYNC; 1241 LIST_INSERT_HEAD(&owp->nd_coalesce, nfsd, nd_tq); |
1242 1243 /* 1244 * If nfsd had anything else coalesced into it, transfer them 1245 * to owp, otherwise their replies will never get sent. 1246 */ 1247 for (p = nfsd->nd_coalesce.lh_first; p; 1248 p = nfsd->nd_coalesce.lh_first) { 1249 LIST_REMOVE(p, nd_tq); 1250 LIST_INSERT_HEAD(&owp->nd_coalesce, p, nd_tq); 1251 } |
1252} 1253 1254/* 1255 * Sort the group list in increasing numerical order. 1256 * (Insertion sort by Chris Torek, who was grossed out by the bubble sort 1257 * that used to be here.) 1258 */ 1259void --- 2170 unchanged lines hidden --- |