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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to