mirror of
https://github.com/freebsd/freebsd-src
synced 2024-11-05 18:22:52 +00:00
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
This commit is contained in:
parent
cc9958bf22
commit
4983146279
2 changed files with 5 additions and 5 deletions
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue