|
1 | | -/* $NetBSD: lfs_segment.c,v 1.306 2025/12/11 01:27:24 perseant Exp $ */ |
| 1 | +/* $NetBSD: lfs_segment.c,v 1.307 2026/01/20 15:30:15 perseant Exp $ */ |
2 | 2 |
|
3 | 3 | /*- |
4 | 4 | * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. |
|
60 | 60 | */ |
61 | 61 |
|
62 | 62 | #include <sys/cdefs.h> |
63 | | -__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.306 2025/12/11 01:27:24 perseant Exp $"); |
| 63 | +__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.307 2026/01/20 15:30:15 perseant Exp $"); |
64 | 64 |
|
65 | 65 | #ifdef DEBUG |
66 | 66 | # define vndebug(vp, str) do { \ |
@@ -91,6 +91,7 @@ __KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.306 2025/12/11 01:27:24 perseant E |
91 | 91 | #include <sys/mount.h> |
92 | 92 | #include <sys/kauth.h> |
93 | 93 | #include <sys/syslog.h> |
| 94 | +#include <sys/vnode_impl.h> |
94 | 95 | #include <sys/workqueue.h> |
95 | 96 |
|
96 | 97 | #include <miscfs/specfs/specdev.h> |
@@ -416,9 +417,20 @@ lfs_writevnodes_selector(void *cl, struct vnode *vp) |
416 | 417 | struct lfs_writevnodes_ctx *c = cl; |
417 | 418 | struct inode *ip; |
418 | 419 | int op = c->op; |
| 420 | + vnode_impl_t *vip = VNODE_TO_VIMPL(vp); |
419 | 421 |
|
420 | 422 | KASSERT(mutex_owned(vp->v_interlock)); |
421 | 423 |
|
| 424 | + /* |
| 425 | + * A vnode being reclaimed will be in state VS_RECLAIMING |
| 426 | + * while it attemmpts to get the segment lock. We hold the |
| 427 | + * segment lock, so we must skip these vnodes in order to |
| 428 | + * avoid a deadlock. |
| 429 | + */ |
| 430 | + if (vip->vi_state != VS_LOADED && vip->vi_state != VS_RECLAIMED |
| 431 | + && !IS_FLUSHING(c->fs, vp)) |
| 432 | + return false; |
| 433 | + |
422 | 434 | ip = VTOI(vp); |
423 | 435 | if (ip == NULL || vp->v_type == VNON || ip->i_nlink <= 0) |
424 | 436 | return false; |
|
0 commit comments