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);
|
||||
}
|
||||
|
||||
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
|
||||
dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
||||
{
|
||||
uint64_t size = blk_rq_bytes(req);
|
||||
uint64_t offset = blk_rq_pos(req) << 9;
|
||||
struct bio *bio_saved = req->bio;
|
||||
dmu_buf_t **dbp;
|
||||
int numbufs, i, err;
|
||||
size_t req_offset;
|
||||
|
@ -1117,17 +1071,6 @@ dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
|||
if (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;
|
||||
for (i = 0; i < numbufs; i++) {
|
||||
int tocpy, didcpy, bufoff;
|
||||
|
@ -1154,10 +1097,6 @@ dmu_read_req(objset_t *os, uint64_t object, struct request *req)
|
|||
req_offset += didcpy;
|
||||
err = 0;
|
||||
}
|
||||
|
||||
dmu_bio_put(req->bio);
|
||||
req->bio = bio_saved;
|
||||
error:
|
||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||
|
||||
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 offset = blk_rq_pos(req) << 9;
|
||||
struct bio *bio_saved = req->bio;
|
||||
dmu_buf_t **dbp;
|
||||
int numbufs, i, err;
|
||||
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)
|
||||
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;
|
||||
for (i = 0; i < numbufs; i++) {
|
||||
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;
|
||||
}
|
||||
|
||||
dmu_bio_put(req->bio);
|
||||
req->bio = bio_saved;
|
||||
error:
|
||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||
|
||||
return (err);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue