svn commit: r346065 - in head/sys: fs/fuse fs/msdosfs kern sys

2019-09-03 Thread Konstantin Belousov
Author: kib
Date: Tue Apr  9 20:20:04 2019
New Revision: 346065
URL: https://svnweb.freebsd.org/changeset/base/346065

Log:
  Add vn_fsync_buf().
  
  Provide a convenience function to avoid the hack with filling fake
  struct vop_fsync_args and then calling vop_stdfsync().
  
  Sponsored by: The FreeBSD Foundation
  MFC after:1 week

Modified:
  head/sys/fs/fuse/fuse_io.c
  head/sys/fs/msdosfs/msdosfs_fat.c
  head/sys/kern/vfs_default.c
  head/sys/kern/vfs_vnops.c
  head/sys/sys/vnode.h

Modified: head/sys/fs/fuse/fuse_io.c
==
--- head/sys/fs/fuse/fuse_io.c  Tue Apr  9 19:55:02 2019(r346064)
+++ head/sys/fs/fuse/fuse_io.c  Tue Apr  9 20:20:04 2019(r346065)
@@ -771,13 +771,8 @@ fuse_io_strategy(struct vnode *vp, struct buf *bp)
 int
 fuse_io_flushbuf(struct vnode *vp, int waitfor, struct thread *td)
 {
-   struct vop_fsync_args a = {
-   .a_vp = vp,
-   .a_waitfor = waitfor,
-   .a_td = td,
-   };
 
-   return (vop_stdfsync());
+   return (vn_fsync_buf(vp, waitfor));
 }
 
 /*

Modified: head/sys/fs/msdosfs/msdosfs_fat.c
==
--- head/sys/fs/msdosfs/msdosfs_fat.c   Tue Apr  9 19:55:02 2019
(r346064)
+++ head/sys/fs/msdosfs/msdosfs_fat.c   Tue Apr  9 20:20:04 2019
(r346065)
@@ -980,7 +980,6 @@ extendfile(struct denode *dep, u_long count, struct bu
u_long cn, got;
struct msdosfsmount *pmp = dep->de_pmp;
struct buf *bp;
-   struct vop_fsync_args fsync_ap;
daddr_t blkno;
 
/*
@@ -1092,12 +1091,8 @@ extendfile(struct denode *dep, u_long count, struct bu
bdwrite(bp);
}
if (vm_page_count_severe() ||
-   buf_dirty_count_severe()) {
-   fsync_ap.a_vp = DETOV(dep);
-   fsync_ap.a_waitfor = MNT_WAIT;
-   fsync_ap.a_td = curthread;
-   vop_stdfsync(_ap);
-   }
+   buf_dirty_count_severe())
+   vn_fsync_buf(DETOV(dep), MNT_WAIT);
}
}
}

Modified: head/sys/kern/vfs_default.c
==
--- head/sys/kern/vfs_default.c Tue Apr  9 19:55:02 2019(r346064)
+++ head/sys/kern/vfs_default.c Tue Apr  9 20:20:04 2019(r346065)
@@ -638,98 +638,8 @@ vop_stdfsync(ap)
struct thread *a_td;
} */ *ap;
 {
-   struct vnode *vp;
-   struct buf *bp, *nbp;
-   struct bufobj *bo;
-   struct mount *mp;
-   int error, maxretry;
 
-   error = 0;
-   maxretry = 1; /* large, arbitrarily chosen */
-   vp = ap->a_vp;
-   mp = NULL;
-   if (vp->v_type == VCHR) {
-   VI_LOCK(vp);
-   mp = vp->v_rdev->si_mountpt;
-   VI_UNLOCK(vp);
-   }
-   bo = >v_bufobj;
-   BO_LOCK(bo);
-loop1:
-   /*
-* MARK/SCAN initialization to avoid infinite loops.
-*/
-TAILQ_FOREACH(bp, >bo_dirty.bv_hd, b_bobufs) {
-bp->b_vflags &= ~BV_SCANNED;
-   bp->b_error = 0;
-   }
-
-   /*
-* Flush all dirty buffers associated with a vnode.
-*/
-loop2:
-   TAILQ_FOREACH_SAFE(bp, >bo_dirty.bv_hd, b_bobufs, nbp) {
-   if ((bp->b_vflags & BV_SCANNED) != 0)
-   continue;
-   bp->b_vflags |= BV_SCANNED;
-   if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) {
-   if (ap->a_waitfor != MNT_WAIT)
-   continue;
-   if (BUF_LOCK(bp,
-   LK_EXCLUSIVE | LK_INTERLOCK | LK_SLEEPFAIL,
-   BO_LOCKPTR(bo)) != 0) {
-   BO_LOCK(bo);
-   goto loop1;
-   }
-   BO_LOCK(bo);
-   }
-   BO_UNLOCK(bo);
-   KASSERT(bp->b_bufobj == bo,
-   ("bp %p wrong b_bufobj %p should be %p",
-   bp, bp->b_bufobj, bo));
-   if ((bp->b_flags & B_DELWRI) == 0)
-   panic("fsync: not dirty");
-   if ((vp->v_object != NULL) && (bp->b_flags & B_CLUSTEROK)) {
-   vfs_bio_awrite(bp);
-   } else {
-   bremfree(bp);
-   bawrite(bp);
-   }
-   if (maxretry < 1000)
-   pause("dirty", hz < 1000 ? 1 : hz / 1000);
-   BO_LOCK(bo);
-   goto loop2;
-   }
-

svn commit: r346065 - in head/sys: fs/fuse fs/msdosfs kern sys

2019-04-09 Thread Konstantin Belousov
Author: kib
Date: Tue Apr  9 20:20:04 2019
New Revision: 346065
URL: https://svnweb.freebsd.org/changeset/base/346065

Log:
  Add vn_fsync_buf().
  
  Provide a convenience function to avoid the hack with filling fake
  struct vop_fsync_args and then calling vop_stdfsync().
  
  Sponsored by: The FreeBSD Foundation
  MFC after:1 week

Modified:
  head/sys/fs/fuse/fuse_io.c
  head/sys/fs/msdosfs/msdosfs_fat.c
  head/sys/kern/vfs_default.c
  head/sys/kern/vfs_vnops.c
  head/sys/sys/vnode.h

Modified: head/sys/fs/fuse/fuse_io.c
==
--- head/sys/fs/fuse/fuse_io.c  Tue Apr  9 19:55:02 2019(r346064)
+++ head/sys/fs/fuse/fuse_io.c  Tue Apr  9 20:20:04 2019(r346065)
@@ -771,13 +771,8 @@ fuse_io_strategy(struct vnode *vp, struct buf *bp)
 int
 fuse_io_flushbuf(struct vnode *vp, int waitfor, struct thread *td)
 {
-   struct vop_fsync_args a = {
-   .a_vp = vp,
-   .a_waitfor = waitfor,
-   .a_td = td,
-   };
 
-   return (vop_stdfsync());
+   return (vn_fsync_buf(vp, waitfor));
 }
 
 /*

Modified: head/sys/fs/msdosfs/msdosfs_fat.c
==
--- head/sys/fs/msdosfs/msdosfs_fat.c   Tue Apr  9 19:55:02 2019
(r346064)
+++ head/sys/fs/msdosfs/msdosfs_fat.c   Tue Apr  9 20:20:04 2019
(r346065)
@@ -980,7 +980,6 @@ extendfile(struct denode *dep, u_long count, struct bu
u_long cn, got;
struct msdosfsmount *pmp = dep->de_pmp;
struct buf *bp;
-   struct vop_fsync_args fsync_ap;
daddr_t blkno;
 
/*
@@ -1092,12 +1091,8 @@ extendfile(struct denode *dep, u_long count, struct bu
bdwrite(bp);
}
if (vm_page_count_severe() ||
-   buf_dirty_count_severe()) {
-   fsync_ap.a_vp = DETOV(dep);
-   fsync_ap.a_waitfor = MNT_WAIT;
-   fsync_ap.a_td = curthread;
-   vop_stdfsync(_ap);
-   }
+   buf_dirty_count_severe())
+   vn_fsync_buf(DETOV(dep), MNT_WAIT);
}
}
}

Modified: head/sys/kern/vfs_default.c
==
--- head/sys/kern/vfs_default.c Tue Apr  9 19:55:02 2019(r346064)
+++ head/sys/kern/vfs_default.c Tue Apr  9 20:20:04 2019(r346065)
@@ -638,98 +638,8 @@ vop_stdfsync(ap)
struct thread *a_td;
} */ *ap;
 {
-   struct vnode *vp;
-   struct buf *bp, *nbp;
-   struct bufobj *bo;
-   struct mount *mp;
-   int error, maxretry;
 
-   error = 0;
-   maxretry = 1; /* large, arbitrarily chosen */
-   vp = ap->a_vp;
-   mp = NULL;
-   if (vp->v_type == VCHR) {
-   VI_LOCK(vp);
-   mp = vp->v_rdev->si_mountpt;
-   VI_UNLOCK(vp);
-   }
-   bo = >v_bufobj;
-   BO_LOCK(bo);
-loop1:
-   /*
-* MARK/SCAN initialization to avoid infinite loops.
-*/
-TAILQ_FOREACH(bp, >bo_dirty.bv_hd, b_bobufs) {
-bp->b_vflags &= ~BV_SCANNED;
-   bp->b_error = 0;
-   }
-
-   /*
-* Flush all dirty buffers associated with a vnode.
-*/
-loop2:
-   TAILQ_FOREACH_SAFE(bp, >bo_dirty.bv_hd, b_bobufs, nbp) {
-   if ((bp->b_vflags & BV_SCANNED) != 0)
-   continue;
-   bp->b_vflags |= BV_SCANNED;
-   if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) {
-   if (ap->a_waitfor != MNT_WAIT)
-   continue;
-   if (BUF_LOCK(bp,
-   LK_EXCLUSIVE | LK_INTERLOCK | LK_SLEEPFAIL,
-   BO_LOCKPTR(bo)) != 0) {
-   BO_LOCK(bo);
-   goto loop1;
-   }
-   BO_LOCK(bo);
-   }
-   BO_UNLOCK(bo);
-   KASSERT(bp->b_bufobj == bo,
-   ("bp %p wrong b_bufobj %p should be %p",
-   bp, bp->b_bufobj, bo));
-   if ((bp->b_flags & B_DELWRI) == 0)
-   panic("fsync: not dirty");
-   if ((vp->v_object != NULL) && (bp->b_flags & B_CLUSTEROK)) {
-   vfs_bio_awrite(bp);
-   } else {
-   bremfree(bp);
-   bawrite(bp);
-   }
-   if (maxretry < 1000)
-   pause("dirty", hz < 1000 ? 1 : hz / 1000);
-   BO_LOCK(bo);
-   goto loop2;
-   }
-