diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -917,11 +917,13 @@ */ if (bp->bio_cmd == BIO_FLUSH) { - (void) vn_start_write(vp, &mp, V_WAIT); - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - error = VOP_FSYNC(vp, MNT_WAIT, td); - VOP_UNLOCK(vp); - vn_finished_write(mp); + do { + (void) vn_start_write(vp, &mp, V_WAIT); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + error = VOP_FSYNC(vp, MNT_WAIT, td); + VOP_UNLOCK(vp); + vn_finished_write(mp); + } while (error == ERELOOKUP); return (error); } else if (bp->bio_cmd == BIO_DELETE) { error = vn_deallocate(vp, &off, &len, 0, diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1233,8 +1233,22 @@ res = vm_object_page_clean(object, offset, offset + size, flags); VM_OBJECT_WUNLOCK(object); - if (fsync_after) + if (fsync_after) { error = VOP_FSYNC(vp, MNT_WAIT, curthread); + for (;;) { + if (error != ERELOOKUP) + break; + VOP_UNLOCK(vp); + vn_finished_write(mp); + /* + * Allow SU/bufdaemon to handle more + * dependencies meantime. + */ + (void) vn_start_write(vp, &mp, V_WAIT); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + error = VOP_FSYNC(vp, MNT_WAIT, curthread); + } + } VOP_UNLOCK(vp); vn_finished_write(mp); if (error != 0)