Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Aug 2021 15:06:28 GMT
From:      Ka Ho Ng <khng@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: a638dc4ebc8e - main - vfs: Add ioflag to VOP_DEALLOCATE(9)
Message-ID:  <202108121506.17CF6S6U059055@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by khng:

URL: https://cgit.FreeBSD.org/src/commit/?id=a638dc4ebc8eaa90a87ee053b7104ee4511f4491

commit a638dc4ebc8eaa90a87ee053b7104ee4511f4491
Author:     Ka Ho Ng <khng@FreeBSD.org>
AuthorDate: 2021-08-12 14:58:52 +0000
Commit:     Ka Ho Ng <khng@FreeBSD.org>
CommitDate: 2021-08-12 15:03:49 +0000

    vfs: Add ioflag to VOP_DEALLOCATE(9)
    
    The addition of ioflag allows callers passing
    IO_SYNC/IO_DATASYNC/IO_DIRECT down to the file system implementation.
    The vop_stddeallocate fallback implementation is updated to pass the
    ioflag to the file system implementation. vn_deallocate(9) internally is
    also changed to pass ioflag to the VOP_DEALLOCATE call.
    
    Sponsored by:   The FreeBSD Foundation
    Reviewed by:    kib, markj
    Differential Revision:  https://reviews.freebsd.org/D31500
---
 share/man/man9/VOP_DEALLOCATE.9 | 5 ++++-
 share/man/man9/vn_deallocate.9  | 9 +++++++--
 sys/kern/vfs_default.c          | 6 +++---
 sys/kern/vfs_vnops.c            | 7 +++++--
 sys/kern/vnode_if.src           | 1 +
 5 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/share/man/man9/VOP_DEALLOCATE.9 b/share/man/man9/VOP_DEALLOCATE.9
index 1c7f80cfbc6c..dbfe048f2235 100644
--- a/share/man/man9/VOP_DEALLOCATE.9
+++ b/share/man/man9/VOP_DEALLOCATE.9
@@ -27,7 +27,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd May 11, 2021
+.Dd August 11, 2021
 .Dt VOP_DEALLOCATE 9
 .Os
 .Sh NAME
@@ -42,6 +42,7 @@
 .Fa "off_t *offset"
 .Fa "off_t *len"
 .Fa "int flags"
+.Fa "int ioflag"
 .Fa "struct ucred *cred"
 .Fc
 .Sh DESCRIPTION
@@ -61,6 +62,8 @@ The length of the range to deallocate storage in the file.
 .It Fa flags
 The flags of this call.
 This should be set to 0 for now.
+.It Fa ioflag
+Directives and hints to be given to the file system.
 .It Fa cred
 The credentials of the caller.
 .El
diff --git a/share/man/man9/vn_deallocate.9 b/share/man/man9/vn_deallocate.9
index 60bcb9049e40..29edcd57ff5d 100644
--- a/share/man/man9/vn_deallocate.9
+++ b/share/man/man9/vn_deallocate.9
@@ -67,7 +67,7 @@ This must be greater than 0.
 The control flags of the operation.
 This should be set to 0 for now.
 .It Fa ioflag
-The control flags of vnode locking.
+Directives and hints to be given to the file system.
 .It Fa active_cred
 The user credentials of the calling thread.
 .It Fa file_cred
@@ -76,7 +76,8 @@ The credentials installed on the file description pointing to the vnode or NOCRE
 .Pp
 The
 .Fn ioflag
-argument may be one or more of the following flags:
+argument gives directives and hints to the file system.
+It may include one or more of the following flags:
 .Bl -tag -width IO_RANGELOCKED
 .It Dv IO_NODELOCKED
 The vnode was locked before the call.
@@ -84,6 +85,10 @@ The vnode was locked before the call.
 Rangelock was owned around the call.
 .It Dv IO_NOMACCHECK
 Skip MAC checking in the call.
+.It Dv IO_SYNC
+Do I/O synchronously.
+.It Dv IO_DIRECT
+Attempt to bypass buffer cache.
 .El
 .Pp
 .Fa *offset
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index c42d5a795935..d9328cd39b00 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1074,7 +1074,7 @@ vop_stdallocate(struct vop_allocate_args *ap)
 
 static int
 vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp,
-    struct ucred *cred)
+    int ioflag, struct ucred *cred)
 {
 	int iosize;
 	int error = 0;
@@ -1110,7 +1110,7 @@ vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp,
 		auio.uio_rw = UIO_WRITE;
 		auio.uio_td = td;
 
-		error = VOP_WRITE(vp, &auio, 0, cred);
+		error = VOP_WRITE(vp, &auio, ioflag, cred);
 		if (error != 0) {
 			len -= xfersize - auio.uio_resid;
 			offset += xfersize - auio.uio_resid;
@@ -1175,7 +1175,7 @@ vop_stddeallocate(struct vop_deallocate_args *ap)
 
 		/* Fill zeroes */
 		xfersize = rem = omin(noff - offset, len);
-		error = vp_zerofill(vp, &va, &offset, &rem, cred);
+		error = vp_zerofill(vp, &va, &offset, &rem, ap->a_ioflag, cred);
 		if (error) {
 			len -= xfersize - rem;
 			goto out;
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 5572c324469b..3fce590519a8 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -3509,7 +3509,7 @@ vn_deallocate_impl(struct vnode *vp, off_t *offset, off_t *length, int flags,
 			    vp);
 #endif
 		if (error == 0)
-			error = VOP_DEALLOCATE(vp, &off, &len, flags,
+			error = VOP_DEALLOCATE(vp, &off, &len, flags, ioflag,
 			    active_cred);
 
 		if ((ioflag & IO_NODELOCKED) == 0) {
@@ -3548,6 +3548,7 @@ vn_fspacectl(struct file *fp, int cmd, off_t *offset, off_t *length, int flags,
 {
 	int error;
 	struct vnode *vp;
+	int ioflag;
 
 	vp = fp->f_vnode;
 
@@ -3557,9 +3558,11 @@ vn_fspacectl(struct file *fp, int cmd, off_t *offset, off_t *length, int flags,
 	if (vp->v_type != VREG)
 		return (ENODEV);
 
+	ioflag = get_write_ioflag(fp);
+
 	switch (cmd) {
 	case SPACECTL_DEALLOC:
-		error = vn_deallocate_impl(vp, offset, length, flags, 0,
+		error = vn_deallocate_impl(vp, offset, length, flags, ioflag,
 		    active_cred, fp->f_cred);
 		break;
 	default:
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 97ac1cff6705..ff57d1c9a28e 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -808,6 +808,7 @@ vop_deallocate {
 	INOUT off_t *offset;
 	INOUT off_t *len;
 	IN int flags;
+	IN int ioflag;
 	IN struct ucred *cred;
 };
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202108121506.17CF6S6U059055>