summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>2006-05-05 21:27:31 +0000
committertegge <tegge@FreeBSD.org>2006-05-05 21:27:31 +0000
commitfeee636809396137c14151eccf9993c016cfc4c1 (patch)
treead925f017b93b2cbc68f19da57740d5d9af461bb /sys/ufs/ffs
parentce79e019da722f1599b58071d568b1c5333e0205 (diff)
downloadFreeBSD-src-feee636809396137c14151eccf9993c016cfc4c1.zip
FreeBSD-src-feee636809396137c14151eccf9993c016cfc4c1.tar.gz
Return error if vnode was reclaimed while it was temporarily unlocked.
Add missing calls to vn_finished_write() in error handling.
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_rawread.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/ufs/ffs/ffs_rawread.c b/sys/ufs/ffs/ffs_rawread.c
index ec0d4fe..eca31fc 100644
--- a/sys/ufs/ffs/ffs_rawread.c
+++ b/sys/ufs/ffs/ffs_rawread.c
@@ -129,8 +129,16 @@ ffs_rawread_sync(struct vnode *vp, struct thread *td)
upgraded = 0;
- /* Attempt to msync mmap() regions to clean dirty mmap */
VI_LOCK(vp);
+ /* Check if vnode was reclaimed while unlocked. */
+ if ((vp->v_iflag & VI_DOOMED) != 0) {
+ VI_UNLOCK(vp);
+ if (upgraded != 0)
+ VOP_LOCK(vp, LK_DOWNGRADE, td);
+ vn_finished_write(mp);
+ return (EIO);
+ }
+ /* Attempt to msync mmap() regions to clean dirty mmap */
if ((vp->v_iflag & VI_OBJDIRTY) != 0) {
VI_UNLOCK(vp);
if (vp->v_object != NULL) {
@@ -150,6 +158,7 @@ ffs_rawread_sync(struct vnode *vp, struct thread *td)
VI_UNLOCK(vp);
if (upgraded != 0)
VOP_LOCK(vp, LK_DOWNGRADE, td);
+ vn_finished_write(mp);
return (error);
}
/* Flush dirty buffers */
@@ -159,6 +168,7 @@ ffs_rawread_sync(struct vnode *vp, struct thread *td)
if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) {
if (upgraded != 0)
VOP_LOCK(vp, LK_DOWNGRADE, td);
+ vn_finished_write(mp);
return (error);
}
VI_LOCK(vp);
OpenPOWER on IntegriCloud