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_subs.c 8.8 (Berkeley) 5/22/95 |
37 * $FreeBSD: head/sys/nfs/nfs_common.c 54480 1999-12-12 06:09:57Z dillon $ |
38 */ 39 40/* 41 * These functions support the macros and help fiddle mbuf chains for 42 * the nfs op functions. They do things like create the rpc header and 43 * copy data between mbuf chains and uio lists. 44 */ 45#include <sys/param.h> --- 1306 unchanged lines hidden (view full) --- 1352 } 1353 if (vap->va_size != np->n_size) { 1354 if (vap->va_type == VREG) { 1355 if (np->n_flag & NMODIFIED) { 1356 if (vap->va_size < np->n_size) 1357 vap->va_size = np->n_size; 1358 else 1359 np->n_size = vap->va_size; |
1360 } else { |
1361 np->n_size = vap->va_size; |
1362 } |
1363 vnode_pager_setsize(vp, np->n_size); |
1364 } else { |
1365 np->n_size = vap->va_size; |
1366 } |
1367 } 1368 np->n_attrstamp = time_second; 1369 if (vaper != NULL) { 1370 bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(*vap)); 1371 if (np->n_flag & NCHG) { 1372 if (np->n_flag & NACC) 1373 vaper->va_atime = np->n_atim; 1374 if (np->n_flag & NUPD) --- 66 unchanged lines hidden (view full) --- 1441 nfsstats.attrcache_hits++; 1442 if (vap->va_size != np->n_size) { 1443 if (vap->va_type == VREG) { 1444 if (np->n_flag & NMODIFIED) { 1445 if (vap->va_size < np->n_size) 1446 vap->va_size = np->n_size; 1447 else 1448 np->n_size = vap->va_size; |
1449 } else { |
1450 np->n_size = vap->va_size; |
1451 } |
1452 vnode_pager_setsize(vp, np->n_size); |
1453 } else { |
1454 np->n_size = vap->va_size; |
1455 } |
1456 } 1457 bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(struct vattr)); 1458 if (np->n_flag & NCHG) { 1459 if (np->n_flag & NACC) 1460 vaper->va_atime = np->n_atim; 1461 if (np->n_flag & NUPD) 1462 vaper->va_mtime = np->n_mtim; 1463 } --- 685 unchanged lines hidden (view full) --- 2149 if (np->n_cookies.lh_first) 2150 np->n_cookies.lh_first->ndm_eocookie = 0; 2151} 2152 2153/* 2154 * The write verifier has changed (probably due to a server reboot), so all 2155 * B_NEEDCOMMIT blocks will have to be written again. Since they are on the 2156 * dirty block list as B_DELWRI, all this takes is clearing the B_NEEDCOMMIT |
2157 * and B_CLUSTEROK flags. Once done the new write verifier can be set for the 2158 * mount point. 2159 * 2160 * B_CLUSTEROK must be cleared along with B_NEEDCOMMIT because stage 1 data 2161 * writes are not clusterable. |
2162 */ 2163void 2164nfs_clearcommit(mp) 2165 struct mount *mp; 2166{ 2167 register struct vnode *vp, *nvp; 2168 register struct buf *bp, *nbp; 2169 int s; --- 4 unchanged lines hidden (view full) --- 2174 if (vp->v_mount != mp) /* Paranoia */ 2175 goto loop; 2176 nvp = vp->v_mntvnodes.le_next; 2177 for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 2178 nbp = TAILQ_NEXT(bp, b_vnbufs); 2179 if (BUF_REFCNT(bp) == 0 && 2180 (bp->b_flags & (B_DELWRI | B_NEEDCOMMIT)) 2181 == (B_DELWRI | B_NEEDCOMMIT)) |
2182 bp->b_flags &= ~(B_NEEDCOMMIT | B_CLUSTEROK); |
2183 } 2184 } 2185 splx(s); 2186} 2187 2188#ifndef NFS_NOSERVER 2189/* 2190 * Map errnos to NFS error numbers. For Version 3 also filter out error --- 79 unchanged lines hidden --- |