git: 498314627946 - main - ffs: do not call softdep_prealloc() from UFS_BALLOC()
Konstantin Belousov
kib at FreeBSD.org
Wed Feb 24 07:56:59 UTC 2021
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=49831462794690155ce8dbe02679e6d9390f3d7d
commit 49831462794690155ce8dbe02679e6d9390f3d7d
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-02-18 14:51:50 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-02-24 07:54:50 +0000
ffs: do not call softdep_prealloc() from UFS_BALLOC()
Do it in ffs_write(), where we can gracefuly handle relock and its
consequences. In particular, recheck the v_data to see if the vnode
reclamation ended, and return EBADF when we cannot proceed with the
write.
Reviewed by: mckusick
Reported by: pho
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
---
sys/ufs/ffs/ffs_balloc.c | 5 -----
sys/ufs/ffs/ffs_vnops.c | 5 +++++
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/sys/ufs/ffs/ffs_balloc.c b/sys/ufs/ffs/ffs_balloc.c
index daa897dfe032..1b53a90a48c4 100644
--- a/sys/ufs/ffs/ffs_balloc.c
+++ b/sys/ufs/ffs/ffs_balloc.c
@@ -128,8 +128,6 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
return (EFBIG);
gbflags = (flags & BA_UNMAPPED) != 0 ? GB_UNMAPPED : 0;
- if (DOINGSOFTDEP(vp))
- softdep_prealloc(vp, MNT_WAIT);
/*
* If the next write will extend the file into a new block,
* and the file is currently composed of a fragment
@@ -621,9 +619,6 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
return (EFBIG);
gbflags = (flags & BA_UNMAPPED) != 0 ? GB_UNMAPPED : 0;
- if (DOINGSOFTDEP(vp))
- softdep_prealloc(vp, MNT_WAIT);
-
/*
* Check for allocating external data.
*/
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 686bfddcb0ea..db14d2099be9 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -834,6 +834,11 @@ ffs_write(ap)
int blkoffset, error, flags, ioflag, size, xfersize;
vp = ap->a_vp;
+ if (DOINGSUJ(vp))
+ softdep_prealloc(vp, MNT_WAIT);
+ if (vp->v_data == NULL)
+ return (EBADF);
+
uio = ap->a_uio;
ioflag = ap->a_ioflag;
if (ap->a_ioflag & IO_EXT)
More information about the dev-commits-src-all
mailing list