Revert "Fix zvol+btrfs hang"
After the dmu_req_copy change, bi_io_vecs are not touched, so this is no
longer needed.
This reverts commit e26ade5101
.
Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #2124
This commit is contained in:
parent
215b4634c7
commit
22760eebef
|
@ -1053,57 +1053,11 @@ out:
|
||||||
return (offset);
|
return (offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
dmu_bio_put(struct bio *bio)
|
|
||||||
{
|
|
||||||
struct bio *bio_next;
|
|
||||||
|
|
||||||
while (bio) {
|
|
||||||
bio_next = bio->bi_next;
|
|
||||||
bio_put(bio);
|
|
||||||
bio = bio_next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
dmu_bio_clone(struct bio *bio, struct bio **bio_copy)
|
|
||||||
{
|
|
||||||
struct bio *bio_root = NULL;
|
|
||||||
struct bio *bio_last = NULL;
|
|
||||||
struct bio *bio_new;
|
|
||||||
|
|
||||||
if (bio == NULL)
|
|
||||||
return (EINVAL);
|
|
||||||
|
|
||||||
while (bio) {
|
|
||||||
bio_new = bio_clone(bio, GFP_NOIO);
|
|
||||||
if (bio_new == NULL) {
|
|
||||||
dmu_bio_put(bio_root);
|
|
||||||
return (ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bio_last) {
|
|
||||||
bio_last->bi_next = bio_new;
|
|
||||||
bio_last = bio_new;
|
|
||||||
} else {
|
|
||||||
bio_root = bio_new;
|
|
||||||
bio_last = bio_new;
|
|
||||||
}
|
|
||||||
|
|
||||||
bio = bio->bi_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
*bio_copy = bio_root;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
||||||
{
|
{
|
||||||
uint64_t size = blk_rq_bytes(req);
|
uint64_t size = blk_rq_bytes(req);
|
||||||
uint64_t offset = blk_rq_pos(req) << 9;
|
uint64_t offset = blk_rq_pos(req) << 9;
|
||||||
struct bio *bio_saved = req->bio;
|
|
||||||
dmu_buf_t **dbp;
|
dmu_buf_t **dbp;
|
||||||
int numbufs, i, err;
|
int numbufs, i, err;
|
||||||
size_t req_offset;
|
size_t req_offset;
|
||||||
|
@ -1117,17 +1071,6 @@ dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
||||||
if (err)
|
if (err)
|
||||||
return (err);
|
return (err);
|
||||||
|
|
||||||
/*
|
|
||||||
* Clone the bio list so the bv->bv_offset and bv->bv_len members
|
|
||||||
* can be safely modified. The original bio list is relinked in to
|
|
||||||
* the request when the function exits. This is required because
|
|
||||||
* some file systems blindly assume that these values will remain
|
|
||||||
* constant between bio_submit() and the IO completion callback.
|
|
||||||
*/
|
|
||||||
err = dmu_bio_clone(bio_saved, &req->bio);
|
|
||||||
if (err)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
req_offset = 0;
|
req_offset = 0;
|
||||||
for (i = 0; i < numbufs; i++) {
|
for (i = 0; i < numbufs; i++) {
|
||||||
int tocpy, didcpy, bufoff;
|
int tocpy, didcpy, bufoff;
|
||||||
|
@ -1154,10 +1097,6 @@ dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
||||||
req_offset += didcpy;
|
req_offset += didcpy;
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dmu_bio_put(req->bio);
|
|
||||||
req->bio = bio_saved;
|
|
||||||
error:
|
|
||||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||||
|
|
||||||
return (err);
|
return (err);
|
||||||
|
@ -1168,7 +1107,6 @@ dmu_write_req(objset_t *os, uint64_t object, struct request *req, dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
uint64_t size = blk_rq_bytes(req);
|
uint64_t size = blk_rq_bytes(req);
|
||||||
uint64_t offset = blk_rq_pos(req) << 9;
|
uint64_t offset = blk_rq_pos(req) << 9;
|
||||||
struct bio *bio_saved = req->bio;
|
|
||||||
dmu_buf_t **dbp;
|
dmu_buf_t **dbp;
|
||||||
int numbufs, i, err;
|
int numbufs, i, err;
|
||||||
size_t req_offset;
|
size_t req_offset;
|
||||||
|
@ -1181,17 +1119,6 @@ dmu_write_req(objset_t *os, uint64_t object, struct request *req, dmu_tx_t *tx)
|
||||||
if (err)
|
if (err)
|
||||||
return (err);
|
return (err);
|
||||||
|
|
||||||
/*
|
|
||||||
* Clone the bio list so the bv->bv_offset and bv->bv_len members
|
|
||||||
* can be safely modified. The original bio list is relinked in to
|
|
||||||
* the request when the function exits. This is required because
|
|
||||||
* some file systems blindly assume that these values will remain
|
|
||||||
* constant between bio_submit() and the IO completion callback.
|
|
||||||
*/
|
|
||||||
err = dmu_bio_clone(bio_saved, &req->bio);
|
|
||||||
if (err)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
req_offset = 0;
|
req_offset = 0;
|
||||||
for (i = 0; i < numbufs; i++) {
|
for (i = 0; i < numbufs; i++) {
|
||||||
int tocpy, didcpy, bufoff;
|
int tocpy, didcpy, bufoff;
|
||||||
|
@ -1229,11 +1156,7 @@ dmu_write_req(objset_t *os, uint64_t object, struct request *req, dmu_tx_t *tx)
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dmu_bio_put(req->bio);
|
|
||||||
req->bio = bio_saved;
|
|
||||||
error:
|
|
||||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||||
|
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue