svn commit: r368191 - head/sys/ufs/ffs
Konstantin Belousov
kib at FreeBSD.org
Mon Nov 30 17:03:26 UTC 2020
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;
More information about the svn-src-all
mailing list