Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / drivers / md / dm-crypt.c
index 0f48fed44a17f6ee9f36967c3be979c1e20fe7b5..d60c88df5234a0099292712cc1117dc1e65b78e0 100644 (file)
@@ -1076,7 +1076,8 @@ static void crypt_dec_pending(struct dm_crypt_io *io)
        if (io->ctx.req)
                crypt_free_req(cc, io->ctx.req, base_bio);
 
-       bio_endio(base_bio, error);
+       base_bio->bi_error = error;
+       bio_endio(base_bio);
 }
 
 /*
@@ -1096,14 +1097,12 @@ static void crypt_dec_pending(struct dm_crypt_io *io)
  * The work is done per CPU global for all dm-crypt instances.
  * They should not depend on each other and do not block.
  */
-static void crypt_endio(struct bio *clone, int error)
+static void crypt_endio(struct bio *clone)
 {
        struct dm_crypt_io *io = clone->bi_private;
        struct crypt_config *cc = io->cc;
        unsigned rw = bio_data_dir(clone);
-
-       if (unlikely(!bio_flagged(clone, BIO_UPTODATE) && !error))
-               error = -EIO;
+       int error;
 
        /*
         * free the processed pages
@@ -1111,6 +1110,7 @@ static void crypt_endio(struct bio *clone, int error)
        if (rw == WRITE)
                crypt_free_buffer_pages(cc, clone);
 
+       error = clone->bi_error;
        bio_put(clone);
 
        if (rw == READ && !error) {
@@ -1811,11 +1811,13 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        }
        cc->iv_offset = tmpll;
 
-       if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) {
+       ret = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev);
+       if (ret) {
                ti->error = "Device lookup failed";
                goto bad;
        }
 
+       ret = -EINVAL;
        if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) {
                ti->error = "Invalid device sector";
                goto bad;
@@ -2035,21 +2037,6 @@ error:
        return -EINVAL;
 }
 
-static int crypt_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
-                      struct bio_vec *biovec, int max_size)
-{
-       struct crypt_config *cc = ti->private;
-       struct request_queue *q = bdev_get_queue(cc->dev->bdev);
-
-       if (!q->merge_bvec_fn)
-               return max_size;
-
-       bvm->bi_bdev = cc->dev->bdev;
-       bvm->bi_sector = cc->start + dm_target_offset(ti, bvm->bi_sector);
-
-       return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
-}
-
 static int crypt_iterate_devices(struct dm_target *ti,
                                 iterate_devices_callout_fn fn, void *data)
 {
@@ -2070,7 +2057,6 @@ static struct target_type crypt_target = {
        .preresume = crypt_preresume,
        .resume = crypt_resume,
        .message = crypt_message,
-       .merge  = crypt_merge,
        .iterate_devices = crypt_iterate_devices,
 };