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
This commit is contained in:
Ka Ho Ng 2021-08-12 22:58:52 +08:00
parent ce92f5a91b
commit a638dc4ebc
5 changed files with 20 additions and 8 deletions

View file

@ -27,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.Dd May 11, 2021 .Dd August 11, 2021
.Dt VOP_DEALLOCATE 9 .Dt VOP_DEALLOCATE 9
.Os .Os
.Sh NAME .Sh NAME
@ -42,6 +42,7 @@
.Fa "off_t *offset" .Fa "off_t *offset"
.Fa "off_t *len" .Fa "off_t *len"
.Fa "int flags" .Fa "int flags"
.Fa "int ioflag"
.Fa "struct ucred *cred" .Fa "struct ucred *cred"
.Fc .Fc
.Sh DESCRIPTION .Sh DESCRIPTION
@ -61,6 +62,8 @@ The length of the range to deallocate storage in the file.
.It Fa flags .It Fa flags
The flags of this call. The flags of this call.
This should be set to 0 for now. This should be set to 0 for now.
.It Fa ioflag
Directives and hints to be given to the file system.
.It Fa cred .It Fa cred
The credentials of the caller. The credentials of the caller.
.El .El

View file

@ -67,7 +67,7 @@ This must be greater than 0.
The control flags of the operation. The control flags of the operation.
This should be set to 0 for now. This should be set to 0 for now.
.It Fa ioflag .It Fa ioflag
The control flags of vnode locking. Directives and hints to be given to the file system.
.It Fa active_cred .It Fa active_cred
The user credentials of the calling thread. The user credentials of the calling thread.
.It Fa file_cred .It Fa file_cred
@ -76,7 +76,8 @@ The credentials installed on the file description pointing to the vnode or NOCRE
.Pp .Pp
The The
.Fn ioflag .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 .Bl -tag -width IO_RANGELOCKED
.It Dv IO_NODELOCKED .It Dv IO_NODELOCKED
The vnode was locked before the call. The vnode was locked before the call.
@ -84,6 +85,10 @@ The vnode was locked before the call.
Rangelock was owned around the call. Rangelock was owned around the call.
.It Dv IO_NOMACCHECK .It Dv IO_NOMACCHECK
Skip MAC checking in the call. Skip MAC checking in the call.
.It Dv IO_SYNC
Do I/O synchronously.
.It Dv IO_DIRECT
Attempt to bypass buffer cache.
.El .El
.Pp .Pp
.Fa *offset .Fa *offset

View file

@ -1074,7 +1074,7 @@ vop_stdallocate(struct vop_allocate_args *ap)
static int static int
vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp, 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 iosize;
int error = 0; 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_rw = UIO_WRITE;
auio.uio_td = td; auio.uio_td = td;
error = VOP_WRITE(vp, &auio, 0, cred); error = VOP_WRITE(vp, &auio, ioflag, cred);
if (error != 0) { if (error != 0) {
len -= xfersize - auio.uio_resid; len -= xfersize - auio.uio_resid;
offset += xfersize - auio.uio_resid; offset += xfersize - auio.uio_resid;
@ -1175,7 +1175,7 @@ vop_stddeallocate(struct vop_deallocate_args *ap)
/* Fill zeroes */ /* Fill zeroes */
xfersize = rem = omin(noff - offset, len); 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) { if (error) {
len -= xfersize - rem; len -= xfersize - rem;
goto out; goto out;

View file

@ -3509,7 +3509,7 @@ vn_deallocate_impl(struct vnode *vp, off_t *offset, off_t *length, int flags,
vp); vp);
#endif #endif
if (error == 0) if (error == 0)
error = VOP_DEALLOCATE(vp, &off, &len, flags, error = VOP_DEALLOCATE(vp, &off, &len, flags, ioflag,
active_cred); active_cred);
if ((ioflag & IO_NODELOCKED) == 0) { 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; int error;
struct vnode *vp; struct vnode *vp;
int ioflag;
vp = fp->f_vnode; 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) if (vp->v_type != VREG)
return (ENODEV); return (ENODEV);
ioflag = get_write_ioflag(fp);
switch (cmd) { switch (cmd) {
case SPACECTL_DEALLOC: 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); active_cred, fp->f_cred);
break; break;
default: default:

View file

@ -808,6 +808,7 @@ vop_deallocate {
INOUT off_t *offset; INOUT off_t *offset;
INOUT off_t *len; INOUT off_t *len;
IN int flags; IN int flags;
IN int ioflag;
IN struct ucred *cred; IN struct ucred *cred;
}; };