Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 May 2012 10:54:42 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r235781 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201205221054.q4MAsgsm099492@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Tue May 22 10:54:42 2012
New Revision: 235781
URL: http://svn.freebsd.org/changeset/base/235781

Log:
  Fix enforcement of file size limit with O_APPEND on ZFS.
  
  vn_rlimit_fsize takes uio->uio_offset and uio->uio_resid into account
  when determining whether given write would exceed RLIMIT_FSIZE.
  
  When APPEND flag is specified, ZFS updates uio->uio_offset to point to the
  end of file.
  
  But this happens after a call to vn_rlimit_fsize, so vn_rlimit_fsize check
  can be rendered ineffective by thread that opens some file with O_APPEND
  and lseeks below RLIMIT_FSIZE before calling write.
  
  Submitted by:	Mateusz Guzik <mjguzik at gmail dot com>
  MFC after:	2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue May 22 09:59:49 2012	(r235780)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue May 22 10:54:42 2012	(r235781)
@@ -838,6 +838,12 @@ zfs_write(vnode_t *vp, uio_t *uio, int i
 		rl = zfs_range_lock(zp, woff, n, RL_WRITER);
 	}
 
+	if (vn_rlimit_fsize(vp, uio, uio->uio_td)) {
+		zfs_range_unlock(rl);
+		ZFS_EXIT(zfsvfs);
+		return (EFBIG);
+	}
+
 	if (woff >= limit) {
 		zfs_range_unlock(rl);
 		ZFS_EXIT(zfsvfs);
@@ -5696,9 +5702,6 @@ zfs_freebsd_write(ap)
 	} */ *ap;
 {
 
-	if (vn_rlimit_fsize(ap->a_vp, ap->a_uio, ap->a_uio->uio_td))
-		return (EFBIG);
-
 	return (zfs_write(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag),
 	    ap->a_cred, NULL));
 }



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