X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/378393581903b274cb7a4d18e0d978071a6b592d..21362eb3e66fd2c787aee132bce100a44d71a99c:/bsd/nfs/nfs_vnops.c diff --git a/bsd/nfs/nfs_vnops.c b/bsd/nfs/nfs_vnops.c index b5d0b9c6f..5488aa9d6 100644 --- a/bsd/nfs/nfs_vnops.c +++ b/bsd/nfs/nfs_vnops.c @@ -1,23 +1,29 @@ /* * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ /* @@ -1766,7 +1772,7 @@ nfs_writerpc( kauth_cred_t cred, proc_t p, int *iomode, - int *must_commit) + uint64_t *wverfp) { register u_long *tl; register caddr_t cp; @@ -1776,7 +1782,7 @@ nfs_writerpc( struct nfsmount *nmp; int error = 0, len, tsiz, updatemtime = 0, wccpostattr = 0, rlen, commit; int v3, committed = NFSV3WRITE_FILESYNC; - u_int64_t xid; + u_int64_t xid, wverf; mount_t mp; #if DIAGNOSTIC @@ -1788,7 +1794,6 @@ nfs_writerpc( if (!nmp) return (ENXIO); v3 = NFS_ISV3(vp); - *must_commit = 0; // LP64todo - fix this tsiz = uio_uio_resid(uiop); if (((u_int64_t)uiop->uio_offset + (unsigned int)tsiz > 0xffffffff) && !v3) { @@ -1858,15 +1863,14 @@ nfs_writerpc( else if (committed == NFSV3WRITE_DATASYNC && commit == NFSV3WRITE_UNSTABLE) committed = commit; + fxdr_hyper(tl, &wverf); + if (wverfp) + *wverfp = wverf; if ((nmp->nm_state & NFSSTA_HASWRITEVERF) == 0) { - bcopy((caddr_t)tl, (caddr_t)nmp->nm_verf, - NFSX_V3WRITEVERF); + nmp->nm_verf = wverf; nmp->nm_state |= NFSSTA_HASWRITEVERF; - } else if (bcmp((caddr_t)tl, - (caddr_t)nmp->nm_verf, NFSX_V3WRITEVERF)) { - *must_commit = 1; - bcopy((caddr_t)tl, (caddr_t)nmp->nm_verf, - NFSX_V3WRITEVERF); + } else if (wverf != nmp->nm_verf) { + nmp->nm_verf = wverf; } } } else { @@ -3700,8 +3704,8 @@ nfs_commit(vp, offset, count, cred, procp) int error = 0, wccpostattr = 0; struct timespec premtime = { 0, 0 }; mbuf_t mreq, mrep, md, mb, mb2; - u_int64_t xid; - + u_int64_t xid, wverf; + FSDBG(521, vp, offset, count, nmp->nm_state); if (!nmp) return (ENXIO); @@ -3723,10 +3727,9 @@ nfs_commit(vp, offset, count, cred, procp) } if (!error) { nfsm_dissect(tl, u_long *, NFSX_V3WRITEVERF); - if (bcmp((caddr_t)nmp->nm_verf, (caddr_t)tl, - NFSX_V3WRITEVERF)) { - bcopy((caddr_t)tl, (caddr_t)nmp->nm_verf, - NFSX_V3WRITEVERF); + fxdr_hyper(tl, &wverf); + if (wverf != nmp->nm_verf) { + nmp->nm_verf = wverf; error = NFSERR_STALEWRITEVERF; } } @@ -3841,6 +3844,8 @@ nfs_flushcommits(vnode_t vp, proc_t p, int nowait) error = nfs_buf_acquire(bp, NBAC_NOWAIT, 0, 0); if (error) continue; + if (ISSET(bp->nb_flags, NB_NEEDCOMMIT)) + nfs_buf_check_write_verifier(np, bp); if (((bp->nb_flags & (NB_DELWRI | NB_NEEDCOMMIT)) != (NB_DELWRI | NB_NEEDCOMMIT))) { nfs_buf_drop(bp); @@ -3949,8 +3954,6 @@ nfs_flushcommits(vnode_t vp, proc_t p, int nowait) break; } } - if (retv == NFSERR_STALEWRITEVERF) - nfs_clearcommit(vnode_mount(vp)); /* * Now, either mark the blocks I/O done or mark the @@ -4089,6 +4092,8 @@ again: nfs_buf_drop(bp); continue; } + if (ISSET(bp->nb_flags, NB_NEEDCOMMIT)) + nfs_buf_check_write_verifier(np, bp); if (!ISSET(bp->nb_flags, NB_DELWRI)) panic("nfs_flush: not dirty"); FSDBG(525, bp, passone, bp->nb_lflags, bp->nb_flags); @@ -4145,12 +4150,12 @@ again: goto again; } - if ((waitfor == MNT_WAIT) && !LIST_EMPTY(&np->n_dirtyblkhd)) { - goto again; - } - /* if we have no dirty blocks, we can clear the modified flag */ - if (LIST_EMPTY(&np->n_dirtyblkhd)) + if (waitfor == MNT_WAIT) { + if (!LIST_EMPTY(&np->n_dirtyblkhd)) + goto again; + /* if we have no dirty blocks, we can clear the modified flag */ np->n_flag &= ~NMODIFIED; + } FSDBG(526, np->n_flag, np->n_error, 0, 0); if (!ignore_writeerr && (np->n_flag & NWRITEERR)) { @@ -4850,7 +4855,7 @@ nfs_pageout(ap) struct nfsbuf *bp; struct nfsmount *nmp = VFSTONFS(vnode_mount(vp)); daddr64_t lbn; - int error = 0, iomode, must_commit; + int error = 0, iomode; off_t off; vm_offset_t ioaddr; struct uio auio; @@ -5049,9 +5054,7 @@ nfs_pageout(ap) /* NMODIFIED would be set here if doing unstable writes */ iomode = NFSV3WRITE_FILESYNC; - error = nfs_writerpc(vp, &auio, cred, p, &iomode, &must_commit); - if (must_commit) - nfs_clearcommit(vnode_mount(vp)); + error = nfs_writerpc(vp, &auio, cred, p, &iomode, NULL); vnode_writedone(vp); if (error) goto cleanup;