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:
Konstantin Belousov 2013-08-27 01:31:12 +00:00
parent c9735f9537
commit 1ca79c111c

View File

@ -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;