When allocating a pbuf for the cluster write, do not sleep waiting
for the available pbuf when passed vnode is backing md(4). Other i/o directed to the same md device might already hold pbufs, and then we could deadlock since only our progress can free a pbuf needed for wakeup. Obtained from: projects/vm6 Reminded and tested by: pho MFC after: 1 week
This commit is contained in:
parent
c9735f9537
commit
1ca79c111c
@ -837,7 +837,9 @@ cluster_wbuild(struct vnode *vp, long size, daddr_t start_lbn, int len,
|
||||
(tbp->b_bcount != tbp->b_bufsize) ||
|
||||
(tbp->b_bcount != size) ||
|
||||
(len == 1) ||
|
||||
((bp = getpbuf(&cluster_pbuf_freecnt)) == NULL)) {
|
||||
((bp = (vp->v_vflag & VV_MD) != 0 ?
|
||||
trypbuf(&cluster_pbuf_freecnt) :
|
||||
getpbuf(&cluster_pbuf_freecnt)) == NULL)) {
|
||||
totalwritten += tbp->b_bufsize;
|
||||
bawrite(tbp);
|
||||
++start_lbn;
|
||||
|
Loading…
Reference in New Issue
Block a user