Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / block / drbd / drbd_worker.c
index 64563bf..0f9956f 100644 (file)
@@ -326,14 +326,9 @@ void drbd_csum_bio(struct crypto_shash *tfm, struct bio *bio, void *digest)
        bio_for_each_segment(bvec, bio, iter) {
                u8 *src;
 
-               src = kmap_atomic(bvec.bv_page);
-               crypto_shash_update(desc, src + bvec.bv_offset, bvec.bv_len);
-               kunmap_atomic(src);
-
-               /* REQ_OP_WRITE_SAME has only one segment,
-                * checksum the payload only once. */
-               if (bio_op(bio) == REQ_OP_WRITE_SAME)
-                       break;
+               src = bvec_kmap_local(&bvec);
+               crypto_shash_update(desc, src, bvec.bv_len);
+               kunmap_local(src);
        }
        crypto_shash_final(desc, digest);
        shash_desc_zero(desc);
@@ -1523,9 +1518,9 @@ int w_restart_disk_io(struct drbd_work *w, int cancel)
        if (bio_data_dir(req->master_bio) == WRITE && req->rq_state & RQ_IN_ACT_LOG)
                drbd_al_begin_io(device, &req->i);
 
-       req->private_bio = bio_clone_fast(req->master_bio, GFP_NOIO,
+       req->private_bio = bio_alloc_clone(device->ldev->backing_bdev,
+                                          req->master_bio, GFP_NOIO,
                                          &drbd_io_bio_set);
-       bio_set_dev(req->private_bio, device->ldev->backing_bdev);
        req->private_bio->bi_private = req;
        req->private_bio->bi_end_io = drbd_request_endio;
        submit_bio_noacct(req->private_bio);