From owner-svn-src-head@FreeBSD.ORG Sun Mar 25 00:02:38 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 44740106566B; Sun, 25 Mar 2012 00:02:38 +0000 (UTC) (envelope-from mckusick@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2587D8FC1A; Sun, 25 Mar 2012 00:02:38 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2P02ckw054529; Sun, 25 Mar 2012 00:02:38 GMT (envelope-from mckusick@svn.freebsd.org) Received: (from mckusick@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2P02bU3054520; Sun, 25 Mar 2012 00:02:37 GMT (envelope-from mckusick@svn.freebsd.org) Message-Id: <201203250002.q2P02bU3054520@svn.freebsd.org> From: Kirk McKusick Date: Sun, 25 Mar 2012 00:02:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233438 - head/sys/ufs/ffs X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Mar 2012 00:02:38 -0000 Author: mckusick Date: Sun Mar 25 00:02:37 2012 New Revision: 233438 URL: http://svn.freebsd.org/changeset/base/233438 Log: Add a third flags argument to ffs_syncvnode to avoid a possible conflict with MNT_WAIT flags that passed in its second argument. This will be MFC'ed together with r232351. Discussed with: kib Modified: head/sys/ufs/ffs/ffs_balloc.c head/sys/ufs/ffs/ffs_extern.h head/sys/ufs/ffs/ffs_inode.c head/sys/ufs/ffs/ffs_rawread.c head/sys/ufs/ffs/ffs_snapshot.c head/sys/ufs/ffs/ffs_softdep.c head/sys/ufs/ffs/ffs_vfsops.c head/sys/ufs/ffs/ffs_vnops.c Modified: head/sys/ufs/ffs/ffs_balloc.c ============================================================================== --- head/sys/ufs/ffs/ffs_balloc.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_balloc.c Sun Mar 25 00:02:37 2012 (r233438) @@ -450,7 +450,7 @@ fail: * * XXX Still have to journal the free below */ - (void) ffs_syncvnode(vp, MNT_WAIT); + (void) ffs_syncvnode(vp, MNT_WAIT, 0); for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns; blkp < allocblk; blkp++, lbns_remfree++) { /* @@ -497,7 +497,7 @@ fail: dp->di_blocks -= btodb(deallocated); ip->i_flag |= IN_CHANGE | IN_UPDATE; } - (void) ffs_syncvnode(vp, MNT_WAIT); + (void) ffs_syncvnode(vp, MNT_WAIT, 0); /* * After the buffers are invalidated and on-disk pointers are * cleared, free the blocks. @@ -994,7 +994,7 @@ fail: * * XXX Still have to journal the free below */ - (void) ffs_syncvnode(vp, MNT_WAIT); + (void) ffs_syncvnode(vp, MNT_WAIT, 0); for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns; blkp < allocblk; blkp++, lbns_remfree++) { /* @@ -1041,7 +1041,7 @@ fail: dp->di_blocks -= btodb(deallocated); ip->i_flag |= IN_CHANGE | IN_UPDATE; } - (void) ffs_syncvnode(vp, MNT_WAIT); + (void) ffs_syncvnode(vp, MNT_WAIT, 0); /* * After the buffers are invalidated and on-disk pointers are * cleared, free the blocks. Modified: head/sys/ufs/ffs/ffs_extern.h ============================================================================== --- head/sys/ufs/ffs/ffs_extern.h Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_extern.h Sun Mar 25 00:02:37 2012 (r233438) @@ -92,7 +92,7 @@ void ffs_snapshot_mount(struct mount *mp void ffs_snapshot_unmount(struct mount *mp); void process_deferred_inactive(struct mount *mp); void ffs_sync_snap(struct mount *, int); -int ffs_syncvnode(struct vnode *vp, int waitfor); +int ffs_syncvnode(struct vnode *vp, int waitfor, int flags); int ffs_truncate(struct vnode *, off_t, int, struct ucred *, struct thread *); int ffs_update(struct vnode *, int); int ffs_valloc(struct vnode *, int, struct ucred *, struct vnode **); @@ -168,12 +168,11 @@ void softdep_freework(struct workhead *) #define FLUSH_BLOCKS 3 #define FLUSH_BLOCKS_WAIT 4 /* - * Flag to ffs_syncinode() to request flushing of data only, + * Flag to ffs_syncvnode() to request flushing of data only, * but skip the ffs_update() on the inode itself. Used to avoid * deadlock when flushing snapshot inodes while holding snaplk. - * Avoid bit conflicts with MNT_WAIT values in sys/mount.h */ -#define NO_INO_UPDT 0x10 +#define NO_INO_UPDT 0x00000001 int ffs_rdonly(struct inode *); Modified: head/sys/ufs/ffs/ffs_inode.c ============================================================================== --- head/sys/ufs/ffs/ffs_inode.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_inode.c Sun Mar 25 00:02:37 2012 (r233438) @@ -228,7 +228,7 @@ ffs_truncate(vp, length, flags, cred, td goto extclean; needextclean = 1; } else { - if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) + if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) return (error); #ifdef QUOTA (void) chkdq(ip, -extblocks, NOCRED, 0); @@ -321,7 +321,7 @@ ffs_truncate(vp, length, flags, cred, td * rarely, we solve the problem by syncing the file * so that it will have no data structures left. */ - if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) + if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) return (error); } else { flags = IO_NORMAL | (needextclean ? IO_EXT: 0); @@ -366,7 +366,7 @@ ffs_truncate(vp, length, flags, cred, td */ if (DOINGSOFTDEP(vp) && lbn < NDADDR && fragroundup(fs, blkoff(fs, length)) < fs->fs_bsize && - (error = ffs_syncvnode(vp, MNT_WAIT)) != 0) + (error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) return (error); ip->i_size = length; DIP_SET(ip, i_size, length); Modified: head/sys/ufs/ffs/ffs_rawread.c ============================================================================== --- head/sys/ufs/ffs/ffs_rawread.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_rawread.c Sun Mar 25 00:02:37 2012 (r233438) @@ -163,7 +163,7 @@ ffs_rawread_sync(struct vnode *vp) /* Flush dirty buffers */ if (bo->bo_dirty.bv_cnt > 0) { BO_UNLOCK(bo); - if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) { + if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) { if (upgraded != 0) VOP_LOCK(vp, LK_DOWNGRADE); vn_finished_write(mp); Modified: head/sys/ufs/ffs/ffs_snapshot.c ============================================================================== --- head/sys/ufs/ffs/ffs_snapshot.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_snapshot.c Sun Mar 25 00:02:37 2012 (r233438) @@ -362,7 +362,7 @@ restart: goto out; bawrite(nbp); if (cg % 10 == 0) - ffs_syncvnode(vp, MNT_WAIT); + ffs_syncvnode(vp, MNT_WAIT, 0); } /* * Copy all the cylinder group maps. Although the @@ -385,7 +385,7 @@ restart: error = cgaccount(cg, vp, nbp, 1); bawrite(nbp); if (cg % 10 == 0) - ffs_syncvnode(vp, MNT_WAIT); + ffs_syncvnode(vp, MNT_WAIT, 0); if (error) goto out; } @@ -400,7 +400,7 @@ restart: * Since we have marked it as a snapshot it is safe to * unlock it as no process will be allowed to write to it. */ - if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) + if ((error = ffs_syncvnode(vp, MNT_WAIT, 0)) != 0) goto out; VOP_UNLOCK(vp, 0); /* @@ -861,7 +861,7 @@ out: MNT_IUNLOCK(mp); if (error) (void) ffs_truncate(vp, (off_t)0, 0, NOCRED, td); - (void) ffs_syncvnode(vp, MNT_WAIT); + (void) ffs_syncvnode(vp, MNT_WAIT, 0); if (error) vput(vp); else @@ -1714,7 +1714,7 @@ ffs_snapremove(vp) * may find indirect pointers using the magic BLK_* values. */ if (DOINGSOFTDEP(vp)) - ffs_syncvnode(vp, MNT_WAIT); + ffs_syncvnode(vp, MNT_WAIT, 0); #ifdef QUOTA /* * Reenable disk quotas for ex-snapshot file. @@ -1908,7 +1908,7 @@ retry: bawrite(cbp); if ((vtype == VDIR || dopersistence) && ip->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); continue; } /* @@ -1919,7 +1919,7 @@ retry: bawrite(cbp); if ((vtype == VDIR || dopersistence) && ip->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); break; } savedcbp = cbp; @@ -1937,7 +1937,7 @@ retry: bawrite(savedcbp); if ((vtype == VDIR || dopersistence) && VTOI(vp)->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); } /* * If we have been unable to allocate a block in which to do @@ -2000,7 +2000,7 @@ ffs_snapshot_mount(mp) } else { reason = "old format snapshot"; (void)ffs_truncate(vp, (off_t)0, 0, NOCRED, td); - (void)ffs_syncvnode(vp, MNT_WAIT); + (void)ffs_syncvnode(vp, MNT_WAIT, 0); } printf("ffs_snapshot_mount: %s inode %d\n", reason, fs->fs_snapinum[snaploc]); @@ -2401,7 +2401,7 @@ ffs_copyonwrite(devvp, bp) bawrite(cbp); if ((devvp == bp->b_vp || bp->b_vp->v_type == VDIR || dopersistence) && ip->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); else launched_async_io = 1; continue; @@ -2414,7 +2414,7 @@ ffs_copyonwrite(devvp, bp) bawrite(cbp); if ((devvp == bp->b_vp || bp->b_vp->v_type == VDIR || dopersistence) && ip->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); else launched_async_io = 1; break; @@ -2434,7 +2434,7 @@ ffs_copyonwrite(devvp, bp) bawrite(savedcbp); if ((devvp == bp->b_vp || bp->b_vp->v_type == VDIR || dopersistence) && VTOI(vp)->i_effnlink > 0) - (void) ffs_syncvnode(vp, MNT_WAIT|NO_INO_UPDT); + (void) ffs_syncvnode(vp, MNT_WAIT, NO_INO_UPDT); else launched_async_io = 1; } @@ -2484,7 +2484,7 @@ ffs_sync_snap(mp, waitfor) } TAILQ_FOREACH(ip, &sn->sn_head, i_nextsnap) { vp = ITOV(ip); - ffs_syncvnode(vp, waitfor|NO_INO_UPDT); + ffs_syncvnode(vp, waitfor, NO_INO_UPDT); } lockmgr(&sn->sn_lock, LK_RELEASE, NULL); } Modified: head/sys/ufs/ffs/ffs_softdep.c ============================================================================== --- head/sys/ufs/ffs/ffs_softdep.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_softdep.c Sun Mar 25 00:02:37 2012 (r233438) @@ -2848,7 +2848,7 @@ softdep_prealloc(vp, waitok) * work attached to it. */ if ((curthread->td_pflags & TDP_COWINPROGRESS) == 0) - ffs_syncvnode(vp, waitok); + ffs_syncvnode(vp, waitok, 0); ACQUIRE_LOCK(&lk); process_removes(vp); process_truncates(vp); @@ -2887,8 +2887,8 @@ softdep_prelink(dvp, vp) stat_journal_low++; FREE_LOCK(&lk); if (vp) - ffs_syncvnode(vp, MNT_NOWAIT); - ffs_syncvnode(dvp, MNT_WAIT); + ffs_syncvnode(vp, MNT_NOWAIT, 0); + ffs_syncvnode(dvp, MNT_WAIT, 0); ACQUIRE_LOCK(&lk); /* Process vp before dvp as it may create .. removes. */ if (vp) { @@ -11841,8 +11841,8 @@ restart: pagedep_new_block = pagedep->pd_state & NEWBLOCK; FREE_LOCK(&lk); locked = 0; - if (pagedep_new_block && - (error = ffs_syncvnode(pvp, MNT_WAIT))) { + if (pagedep_new_block && (error = + ffs_syncvnode(pvp, MNT_WAIT, 0))) { vput(pvp); return (error); } @@ -12683,7 +12683,7 @@ retry: MNT_ILOCK(mp); continue; } - (void) ffs_syncvnode(lvp, MNT_NOWAIT); + (void) ffs_syncvnode(lvp, MNT_NOWAIT, 0); vput(lvp); MNT_ILOCK(mp); } @@ -12856,7 +12856,7 @@ clear_remove(td) softdep_error("clear_remove: vget", error); goto finish_write; } - if ((error = ffs_syncvnode(vp, MNT_NOWAIT))) + if ((error = ffs_syncvnode(vp, MNT_NOWAIT, 0))) softdep_error("clear_remove: fsync", error); bo = &vp->v_bufobj; BO_LOCK(bo); @@ -12939,10 +12939,10 @@ clear_inodedeps(td) } vfs_unbusy(mp); if (ino == lastino) { - if ((error = ffs_syncvnode(vp, MNT_WAIT))) + if ((error = ffs_syncvnode(vp, MNT_WAIT, 0))) softdep_error("clear_inodedeps: fsync1", error); } else { - if ((error = ffs_syncvnode(vp, MNT_NOWAIT))) + if ((error = ffs_syncvnode(vp, MNT_NOWAIT, 0))) softdep_error("clear_inodedeps: fsync2", error); BO_LOCK(&vp->v_bufobj); drain_output(vp); Modified: head/sys/ufs/ffs/ffs_vfsops.c ============================================================================== --- head/sys/ufs/ffs/ffs_vfsops.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_vfsops.c Sun Mar 25 00:02:37 2012 (r233438) @@ -1505,7 +1505,7 @@ loop: } continue; } - if ((error = ffs_syncvnode(vp, waitfor)) != 0) + if ((error = ffs_syncvnode(vp, waitfor, 0)) != 0) allerror = error; vput(vp); MNT_ILOCK(mp); Modified: head/sys/ufs/ffs/ffs_vnops.c ============================================================================== --- head/sys/ufs/ffs/ffs_vnops.c Sat Mar 24 23:10:18 2012 (r233437) +++ head/sys/ufs/ffs/ffs_vnops.c Sun Mar 25 00:02:37 2012 (r233438) @@ -184,7 +184,7 @@ ffs_fsync(struct vop_fsync_args *ap) vp = ap->a_vp; bo = &vp->v_bufobj; retry: - error = ffs_syncvnode(vp, ap->a_waitfor); + error = ffs_syncvnode(vp, ap->a_waitfor, 0); if (error) return (error); if (ap->a_waitfor == MNT_WAIT && DOINGSOFTDEP(vp)) { @@ -209,17 +209,15 @@ retry: } int -ffs_syncvnode(struct vnode *vp, int waitfor) +ffs_syncvnode(struct vnode *vp, int waitfor, int flags) { struct inode *ip; struct bufobj *bo; struct buf *bp; struct buf *nbp; ufs_lbn_t lbn; - int error, wait, passes, noupdate; + int error, wait, passes; - noupdate = waitfor & NO_INO_UPDT; - waitfor &= ~NO_INO_UPDT; ip = VTOI(vp); ip->i_flag &= ~IN_NEEDSYNC; bo = &vp->v_bufobj; @@ -302,7 +300,7 @@ next: } if (waitfor != MNT_WAIT) { BO_UNLOCK(bo); - if (noupdate) + if ((flags & NO_INO_UPDT) != 0) return (0); else return (ffs_update(vp, 0)); @@ -322,7 +320,7 @@ next: */ if (bo->bo_dirty.bv_cnt > 0) { /* Write the inode after sync passes to flush deps. */ - if (wait && DOINGSOFTDEP(vp) && noupdate == 0) { + if (wait && DOINGSOFTDEP(vp) && (flags & NO_INO_UPDT) == 0) { BO_UNLOCK(bo); ffs_update(vp, 1); BO_LOCK(bo); @@ -338,7 +336,7 @@ next: } BO_UNLOCK(bo); error = 0; - if (noupdate == 0) + if ((flags & NO_INO_UPDT) == 0) error = ffs_update(vp, 1); if (DOINGSUJ(vp)) softdep_journal_fsync(VTOI(vp));