git: 7317bd0de973 - stable/13 - Explicitly initialize rather than reading newly allocated UFS inodes.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 04 Dec 2022 06:10:58 UTC
The branch stable/13 has been updated by mckusick:
URL: https://cgit.FreeBSD.org/src/commit/?id=7317bd0de9731c787f58103bedc049dee7d18db9
commit 7317bd0de9731c787f58103bedc049dee7d18db9
Author: Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2022-08-13 20:50:08 +0000
Commit: Kirk McKusick <mckusick@FreeBSD.org>
CommitDate: 2022-12-04 05:52:11 +0000
Explicitly initialize rather than reading newly allocated UFS inodes.
(cherry picked from commit 6b9d4fbb7fe550788d82168e7beeabcd5ad238ce)
Sponsored by: The FreeBSD Foundation
---
sys/ufs/ffs/ffs_alloc.c | 2 +-
sys/ufs/ffs/ffs_extern.h | 1 +
sys/ufs/ffs/ffs_vfsops.c | 54 +++++++++++++++++++++++++++---------------------
3 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 6eaec9edf17b..4b0c7b108cb6 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1159,7 +1159,7 @@ retry:
* return the error.
*/
if ((error = ffs_vgetf(pvp->v_mount, ino, LK_EXCLUSIVE, vpp,
- FFSV_FORCEINSMQ | FFSV_REPLACE)) != 0) {
+ FFSV_FORCEINSMQ | FFSV_REPLACE | FFSV_NEWINODE)) != 0) {
ffs_vfree(pvp, ino, mode);
return (error);
}
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index c835239986ba..1ea473e69f52 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -130,6 +130,7 @@ int ffs_breadz(struct ufsmount *, struct vnode *, daddr_t, daddr_t, int,
doomed */
#define FFSV_FORCEINODEDEP 0x0008 /* Force allocation of inodedep, ignore
MNT_SOFTDEP */
+#define FFSV_NEWINODE 0x0010 /* Newly allocated inode */
/*
* Flags to ffs_reload
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 2d5db7722a0f..3dc6f6d9ee23 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1948,40 +1948,48 @@ ffs_vgetf(struct mount *mp,
MPASS((ffs_flags & FFSV_REPLACE) == 0);
return (0);
}
-
- /* Read in the disk contents for the inode, copy into the inode. */
- dbn = fsbtodb(fs, ino_to_fsba(fs, ino));
- error = ffs_breadz(ump, ump->um_devvp, dbn, dbn, (int)fs->fs_bsize,
- NULL, NULL, 0, NOCRED, 0, NULL, &bp);
- if (error != 0) {
- /*
- * The inode does not contain anything useful, so it would
- * be misleading to leave it on its hash chain. With mode
- * still zero, it will be unlinked and returned to the free
- * list by vput().
- */
- vgone(vp);
- vput(vp);
- *vpp = NULL;
- return (error);
- }
if (I_IS_UFS1(ip))
ip->i_din1 = uma_zalloc(uma_ufs1, M_WAITOK);
else
ip->i_din2 = uma_zalloc(uma_ufs2, M_WAITOK);
- if ((error = ffs_load_inode(bp, ip, fs, ino)) != 0) {
+
+ if ((ffs_flags & FFSV_NEWINODE) != 0) {
+ /* New inode, just zero out its contents. */
+ if (I_IS_UFS1(ip))
+ memset(ip->i_din1, 0, sizeof(struct ufs1_dinode));
+ else
+ memset(ip->i_din2, 0, sizeof(struct ufs2_dinode));
+ } else {
+ /* Read the disk contents for the inode, copy into the inode. */
+ dbn = fsbtodb(fs, ino_to_fsba(fs, ino));
+ error = ffs_breadz(ump, ump->um_devvp, dbn, dbn,
+ (int)fs->fs_bsize, NULL, NULL, 0, NOCRED, 0, NULL, &bp);
+ if (error != 0) {
+ /*
+ * The inode does not contain anything useful, so it
+ * would be misleading to leave it on its hash chain.
+ * With mode still zero, it will be unlinked and
+ * returned to the free list by vput().
+ */
+ vgone(vp);
+ vput(vp);
+ *vpp = NULL;
+ return (error);
+ }
+ if ((error = ffs_load_inode(bp, ip, fs, ino)) != 0) {
+ bqrelse(bp);
+ vgone(vp);
+ vput(vp);
+ *vpp = NULL;
+ return (error);
+ }
bqrelse(bp);
- vgone(vp);
- vput(vp);
- *vpp = NULL;
- return (error);
}
if (DOINGSOFTDEP(vp) && (!fs->fs_ronly ||
(ffs_flags & FFSV_FORCEINODEDEP) != 0))
softdep_load_inodeblock(ip);
else
ip->i_effnlink = ip->i_nlink;
- bqrelse(bp);
/*
* Initialize the vnode from the inode, check for aliases.