Re: [PATCH v5 3/8] nbd: reset write cache on disconnect
"yu kuai" <[email protected]> Sun, 2 Aug 2026 20:02:17 +0800
| Newsgroups | org.kernel.vger.linux-block |
|---|---|
| Message-ID | <[email protected]> |
Hi, =E5=9C=A8 2026/8/2 19:51, yu kuai =E5=86=99=E9=81=93: > Hi, > > =E5=9C=A8 2026/7/30 16:20, Yang Erkun =E5=86=99=E9=81=93: >> An inactive nbd device may refuse any I/O operations. The nbd_config_put >> function calls invalidate_disk, which sets the device capacity to zero >> to reject all read and write I/O. For zero-sector flush I/O requests >> from blkdev_issue_flush, if the write cache is disabled, the zero-sector >> flush I/O immediately returns 0 in submit_bio_noacct. However, since >> nbd_config_put does not clear the write cache state, an inactive nbd >> device might still have the write cache enabled. In this situation, >> zero-sector flush I/O will return -EIO because there is no active socket= . >> Although this does not cause any bugs, resetting the write cache state >> would make the behavior consistent. > I don't think this make sense, at this point nbd->config_refs is 0, which= means > there is no opener for the device, so how can there still be outstanding = read/write > or flush IO? I see what you want to do after checking the next patch. However, since a d= isconnected nbd device can be reused later, the stale BLK_FEAT flags from the last conn= ection looks like a real problem. So, I think it's better to reset queue_limits to defau= lt, the same as add_disk(). > >> Signed-off-by: Yang Erkun <[email protected]> >> --- >> drivers/block/nbd.c | 5 +++++ >> 1 file changed, 5 insertions(+) >> >> diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c >> index 7ec85f94f742..da4b48ef3c79 100644 >> --- a/drivers/block/nbd.c >> +++ b/drivers/block/nbd.c >> @@ -1469,8 +1469,13 @@ static void nbd_config_put(struct nbd_device *nbd= ) >> if (refcount_dec_and_mutex_lock(&nbd->config_refs, >> &nbd->config_lock)) { >> struct nbd_config *config =3D nbd->config; >> + struct queue_limits lim; >> nbd_dev_dbg_close(nbd); >> invalidate_disk(nbd->disk); >> + /* reset write cache */ >> + lim =3D queue_limits_start_update(nbd->disk->queue); >> + lim.features &=3D ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA); >> + queue_limits_commit_update(nbd->disk->queue, &lim); >> if (nbd->config->bytesize) >> kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); >> if (test_and_clear_bit(NBD_RT_HAS_PID_FILE, --=20 Thanks, Kuai