Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Dec 2020 01:05:40 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r368402 - stable/12/sys/ufs/ffs
Message-ID:  <202012070105.0B715eq3019851@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Dec  7 01:05:39 2020
New Revision: 368402
URL: https://svnweb.freebsd.org/changeset/base/368402

Log:
  MFC r368191:
  ffs: do not read full direct blocks if they are going to be overwritten.

Modified:
  stable/12/sys/ufs/ffs/ffs_balloc.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/ufs/ffs/ffs_balloc.c
==============================================================================
--- stable/12/sys/ufs/ffs/ffs_balloc.c	Mon Dec  7 01:02:20 2020	(r368401)
+++ stable/12/sys/ufs/ffs/ffs_balloc.c	Mon Dec  7 01:05:39 2020	(r368402)
@@ -172,10 +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) {
-				brelse(bp);
-				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;
@@ -770,11 +777,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) {
-				brelse(bp);
-				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?202012070105.0B715eq3019851>