Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Nov 2020 17:03:26 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r368191 - head/sys/ufs/ffs
Message-ID:  <202011301703.0AUH3Q4J084649@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Nov 30 17:03:26 2020
New Revision: 368191
URL: https://svnweb.freebsd.org/changeset/base/368191

Log:
  ffs: do not read full direct blocks if they are going to be overwritten.
  
  BA_CLRBUF specifies that existing context of the block will be
  completely overwritten by caller, so there is no reason to spend io
  fetching existing data.  We do the same for indirect blocks.
  
  Reported by:	tmunro
  Reviewed by:	mckusick, tmunro
  Tested by:	pho, tmunro
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D27353

Modified:
  head/sys/ufs/ffs/ffs_balloc.c

Modified: head/sys/ufs/ffs/ffs_balloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_balloc.c	Mon Nov 30 17:00:36 2020	(r368190)
+++ head/sys/ufs/ffs/ffs_balloc.c	Mon Nov 30 17:03:26 2020	(r368191)
@@ -172,9 +172,17 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, i
 			panic("ffs_balloc_ufs1: BA_METAONLY for direct block");
 		nb = dp->di_db[lbn];
 		if (nb != 0 && ip->i_size >= smalllblktosize(fs, lbn + 1)) {
-			error = bread(vp, lbn, fs->fs_bsize, NOCRED, &bp);
-			if (error) {
-				return (error);
+			if ((flags & BA_CLRBUF) != 0) {
+				error = bread(vp, lbn, fs->fs_bsize, NOCRED,
+				    &bp);
+				if (error != 0)
+					return (error);
+			} else {
+				bp = getblk(vp, lbn, fs->fs_bsize, 0, 0,
+				    gbflags);
+				if (bp == NULL)
+					return (EIO);
+				vfs_bio_clrbuf(bp);
 			}
 			bp->b_blkno = fsbtodb(fs, nb);
 			*bpp = bp;
@@ -768,10 +776,17 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, i
 			panic("ffs_balloc_ufs2: BA_METAONLY for direct block");
 		nb = dp->di_db[lbn];
 		if (nb != 0 && ip->i_size >= smalllblktosize(fs, lbn + 1)) {
-			error = bread_gb(vp, lbn, fs->fs_bsize, NOCRED,
-			    gbflags, &bp);
-			if (error) {
-				return (error);
+			if ((flags & BA_CLRBUF) != 0) {
+				error = bread_gb(vp, lbn, fs->fs_bsize, NOCRED,
+				    gbflags, &bp);
+				if (error != 0)
+					return (error);
+			} else {
+				bp = getblk(vp, lbn, fs->fs_bsize, 0, 0,
+				    gbflags);
+				if (bp == NULL)
+					return (EIO);
+				vfs_bio_clrbuf(bp);
 			}
 			bp->b_blkno = fsbtodb(fs, nb);
 			*bpp = bp;



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