[Midnightbsd-cvs] src [8606] trunk/sys: make it possible to atomically resume writes on the mount and account the write start
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun Sep 25 13:29:58 EDT 2016
Revision: 8606
http://svnweb.midnightbsd.org/src/?rev=8606
Author: laffer1
Date: 2016-09-25 13:29:58 -0400 (Sun, 25 Sep 2016)
Log Message:
-----------
make it possible to atomically resume writes on the mount and account the write start
Modified Paths:
--------------
trunk/sys/kern/vfs_vnops.c
trunk/sys/sys/vnode.h
trunk/sys/ufs/ffs/ffs_snapshot.c
Modified: trunk/sys/kern/vfs_vnops.c
===================================================================
--- trunk/sys/kern/vfs_vnops.c 2016-09-25 17:28:11 UTC (rev 8605)
+++ trunk/sys/kern/vfs_vnops.c 2016-09-25 17:29:58 UTC (rev 8606)
@@ -1408,6 +1408,40 @@
* proceed. If a suspend request is in progress, we wait until the
* suspension is over, and then proceed.
*/
+static int
+vn_start_write_locked(struct mount *mp, int flags)
+{
+ int error;
+
+ mtx_assert(MNT_MTX(mp), MA_OWNED);
+ error = 0;
+
+ /*
+ * Check on status of suspension.
+ */
+ if ((curthread->td_pflags & TDP_IGNSUSP) == 0 ||
+ mp->mnt_susp_owner != curthread) {
+ while ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0) {
+ if (flags & V_NOWAIT) {
+ error = EWOULDBLOCK;
+ goto unlock;
+ }
+ error = msleep(&mp->mnt_flag, MNT_MTX(mp),
+ (PUSER - 1) | (flags & PCATCH), "suspfs", 0);
+ if (error)
+ goto unlock;
+ }
+ }
+ if (flags & V_XSLEEP)
+ goto unlock;
+ mp->mnt_writeopcount++;
+unlock:
+ if (error != 0 || (flags & V_XSLEEP) != 0)
+ MNT_REL(mp);
+ MNT_IUNLOCK(mp);
+ return (error);
+}
+
int
vn_start_write(vp, mpp, flags)
struct vnode *vp;
@@ -1444,30 +1478,7 @@
if (vp == NULL)
MNT_REF(mp);
- /*
- * Check on status of suspension.
- */
- if ((curthread->td_pflags & TDP_IGNSUSP) == 0 ||
- mp->mnt_susp_owner != curthread) {
- while ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0) {
- if (flags & V_NOWAIT) {
- error = EWOULDBLOCK;
- goto unlock;
- }
- error = msleep(&mp->mnt_flag, MNT_MTX(mp),
- (PUSER - 1) | (flags & PCATCH), "suspfs", 0);
- if (error)
- goto unlock;
- }
- }
- if (flags & V_XSLEEP)
- goto unlock;
- mp->mnt_writeopcount++;
-unlock:
- if (error != 0 || (flags & V_XSLEEP) != 0)
- MNT_REL(mp);
- MNT_IUNLOCK(mp);
- return (error);
+ return (vn_start_write_locked(mp, flags));
}
/*
@@ -1613,8 +1624,7 @@
* Request a filesystem to resume write operations.
*/
void
-vfs_write_resume(mp)
- struct mount *mp;
+vfs_write_resume_flags(struct mount *mp, int flags)
{
MNT_ILOCK(mp);
@@ -1626,12 +1636,27 @@
wakeup(&mp->mnt_writeopcount);
wakeup(&mp->mnt_flag);
curthread->td_pflags &= ~TDP_IGNSUSP;
+ if ((flags & VR_START_WRITE) != 0) {
+ MNT_REF(mp);
+ mp->mnt_writeopcount++;
+ }
MNT_IUNLOCK(mp);
VFS_SUSP_CLEAN(mp);
- } else
+ } else if ((flags & VR_START_WRITE) != 0) {
+ MNT_REF(mp);
+ vn_start_write_locked(mp, 0);
+ } else {
MNT_IUNLOCK(mp);
+ }
}
+void
+vfs_write_resume(struct mount *mp)
+{
+
+ vfs_write_resume_flags(mp, 0);
+}
+
/*
* Implement kqueues for files by translating it to vnode operation.
*/
Modified: trunk/sys/sys/vnode.h
===================================================================
--- trunk/sys/sys/vnode.h 2016-09-25 17:28:11 UTC (rev 8605)
+++ trunk/sys/sys/vnode.h 2016-09-25 17:29:58 UTC (rev 8606)
@@ -393,6 +393,8 @@
#define V_NOWAIT 0x0002 /* vn_start_write: don't sleep for suspend */
#define V_XSLEEP 0x0004 /* vn_start_write: just return after sleep */
+#define VR_START_WRITE 0x0001 /* vfs_write_resume: start write atomically */
+
#define VREF(vp) vref(vp)
#ifdef DIAGNOSTIC
@@ -701,6 +703,7 @@
int vfs_cache_lookup(struct vop_lookup_args *ap);
void vfs_timestamp(struct timespec *);
void vfs_write_resume(struct mount *mp);
+void vfs_write_resume_flags(struct mount *mp, int flags);
int vfs_write_suspend(struct mount *mp);
int vop_stdbmap(struct vop_bmap_args *);
int vop_stdfsync(struct vop_fsync_args *);
Modified: trunk/sys/ufs/ffs/ffs_snapshot.c
===================================================================
--- trunk/sys/ufs/ffs/ffs_snapshot.c 2016-09-25 17:28:11 UTC (rev 8605)
+++ trunk/sys/ufs/ffs/ffs_snapshot.c 2016-09-25 17:29:58 UTC (rev 8606)
@@ -686,8 +686,7 @@
/*
* Resume operation on filesystem.
*/
- vfs_write_resume(vp->v_mount);
- vn_start_write(NULL, &wrtmp, V_WAIT);
+ vfs_write_resume_flags(vp->v_mount, VR_START_WRITE);
if (collectsnapstats && starttime.tv_sec > 0) {
nanotime(&endtime);
timespecsub(&endtime, &starttime);
More information about the Midnightbsd-cvs
mailing list