mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
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:
parent
ce92f5a91b
commit
a638dc4ebc
5 changed files with 20 additions and 8 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue