aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2022-09-18 11:48:40 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2022-10-08 00:29:36 +0000
commit55b41282d698bed4b3bb75b74265992c2cf5f42b (patch)
treeacb0a27117a3c2ba3e724542e0ff088156fc8dc7
parentf0ebdb4254e81feb726a58a38a399a95f307f656 (diff)
downloadsrc-55b41282d698bed4b3bb75b74265992c2cf5f42b.tar.gz
src-55b41282d698bed4b3bb75b74265992c2cf5f42b.zip
FFS: truncate write if it would exceed the fs max file size or RLIMIT_FSIZE
PR: 164793 (cherry picked from commit 87525ef94007c792c6745db7938251a663ca5706)
-rw-r--r--sys/ufs/ffs/ffs_vnops.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index a37b0f6e679c..bfba15a55872 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -838,7 +838,7 @@ ffs_write(
struct buf *bp;
ufs_lbn_t lbn;
off_t osize;
- ssize_t resid;
+ ssize_t resid, r;
int seqcount;
int blkoffset, error, flags, ioflag, size, xfersize;
@@ -887,15 +887,17 @@ ffs_write(
KASSERT(uio->uio_resid >= 0, ("ffs_write: uio->uio_resid < 0"));
KASSERT(uio->uio_offset >= 0, ("ffs_write: uio->uio_offset < 0"));
fs = ITOFS(ip);
- if ((uoff_t)uio->uio_offset + uio->uio_resid > fs->fs_maxfilesize)
- return (EFBIG);
+
/*
* Maybe this should be above the vnode op call, but so long as
* file servers have no limits, I don't think it matters.
*/
- error = vn_rlimit_fsize(vp, uio, uio->uio_td);
- if (error != 0)
+ error = vn_rlimit_fsizex(vp, uio, fs->fs_maxfilesize, &r,
+ uio->uio_td);
+ if (error != 0) {
+ vn_rlimit_fsizex_res(uio, r);
return (error);
+ }
resid = uio->uio_resid;
osize = ip->i_size;
@@ -1035,6 +1037,7 @@ ffs_write(
if (ffs_fsfail_cleanup(VFSTOUFS(vp->v_mount), error))
error = ENXIO;
}
+ vn_rlimit_fsizex_res(uio, r);
return (error);
}