diff options
author | tegge <tegge@FreeBSD.org> | 2006-05-05 21:27:31 +0000 |
---|---|---|
committer | tegge <tegge@FreeBSD.org> | 2006-05-05 21:27:31 +0000 |
commit | feee636809396137c14151eccf9993c016cfc4c1 (patch) | |
tree | ad925f017b93b2cbc68f19da57740d5d9af461bb /sys/ufs | |
parent | ce79e019da722f1599b58071d568b1c5333e0205 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/ufs/ffs/ffs_rawread.c | 12 |
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); |