Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[platform/kernel/linux-starfive.git] / drivers / block / drbd / drbd_receiver.c
index 6df2539..08da922 100644 (file)
@@ -1279,16 +1279,16 @@ static void one_flush_endio(struct bio *bio)
 
 static void submit_one_flush(struct drbd_device *device, struct issue_flush_context *ctx)
 {
-       struct bio *bio = bio_alloc(GFP_NOIO, 0);
+       struct bio *bio = bio_alloc(device->ldev->backing_bdev, 0,
+                                   REQ_OP_FLUSH | REQ_PREFLUSH, GFP_NOIO);
        struct one_flush_context *octx = kmalloc(sizeof(*octx), GFP_NOIO);
-       if (!bio || !octx) {
-               drbd_warn(device, "Could not allocate a bio, CANNOT ISSUE FLUSH\n");
+
+       if (!octx) {
+               drbd_warn(device, "Could not allocate a octx, CANNOT ISSUE FLUSH\n");
                /* FIXME: what else can I do now?  disconnecting or detaching
                 * really does not help to improve the state of the world, either.
                 */
-               kfree(octx);
-               if (bio)
-                       bio_put(bio);
+               bio_put(bio);
 
                ctx->error = -ENOMEM;
                put_ldev(device);
@@ -1298,10 +1298,8 @@ static void submit_one_flush(struct drbd_device *device, struct issue_flush_cont
 
        octx->device = device;
        octx->ctx = ctx;
-       bio_set_dev(bio, device->ldev->backing_bdev);
        bio->bi_private = octx;
        bio->bi_end_io = one_flush_endio;
-       bio->bi_opf = REQ_OP_FLUSH | REQ_PREFLUSH;
 
        device->flush_jif = jiffies;
        set_bit(FLUSH_PENDING, &device->flags);
@@ -1606,19 +1604,7 @@ static void drbd_issue_peer_discard_or_zero_out(struct drbd_device *device, stru
        drbd_endio_write_sec_final(peer_req);
 }
 
-static void drbd_issue_peer_wsame(struct drbd_device *device,
-                                 struct drbd_peer_request *peer_req)
-{
-       struct block_device *bdev = device->ldev->backing_bdev;
-       sector_t s = peer_req->i.sector;
-       sector_t nr = peer_req->i.size >> 9;
-       if (blkdev_issue_write_same(bdev, s, nr, GFP_NOIO, peer_req->pages))
-               peer_req->flags |= EE_WAS_ERROR;
-       drbd_endio_write_sec_final(peer_req);
-}
-
-
-/*
+/**
  * drbd_submit_peer_request()
  * @device:    DRBD device.
  * @peer_req:  peer request
@@ -1646,7 +1632,6 @@ int drbd_submit_peer_request(struct drbd_device *device,
        unsigned data_size = peer_req->i.size;
        unsigned n_bios = 0;
        unsigned nr_pages = (data_size + PAGE_SIZE -1) >> PAGE_SHIFT;
-       int err = -ENOMEM;
 
        /* TRIM/DISCARD: for now, always use the helper function
         * blkdev_issue_zeroout(..., discard=true).
@@ -1654,7 +1639,7 @@ int drbd_submit_peer_request(struct drbd_device *device,
         * Correctness first, performance later.  Next step is to code an
         * asynchronous variant of the same.
         */
-       if (peer_req->flags & (EE_TRIM|EE_WRITE_SAME|EE_ZEROOUT)) {
+       if (peer_req->flags & (EE_TRIM | EE_ZEROOUT)) {
                /* wait for all pending IO completions, before we start
                 * zeroing things out. */
                conn_wait_active_ee_empty(peer_req->peer_device->connection);
@@ -1671,10 +1656,7 @@ int drbd_submit_peer_request(struct drbd_device *device,
                        spin_unlock_irq(&device->resource->req_lock);
                }
 
-               if (peer_req->flags & (EE_TRIM|EE_ZEROOUT))
-                       drbd_issue_peer_discard_or_zero_out(device, peer_req);
-               else /* EE_WRITE_SAME */
-                       drbd_issue_peer_wsame(device, peer_req);
+               drbd_issue_peer_discard_or_zero_out(device, peer_req);
                return 0;
        }
 
@@ -1687,15 +1669,10 @@ int drbd_submit_peer_request(struct drbd_device *device,
         * generated bio, but a bio allocated on behalf of the peer.
         */
 next_bio:
-       bio = bio_alloc(GFP_NOIO, nr_pages);
-       if (!bio) {
-               drbd_err(device, "submit_ee: Allocation of a bio failed (nr_pages=%u)\n", nr_pages);
-               goto fail;
-       }
+       bio = bio_alloc(device->ldev->backing_bdev, nr_pages, op | op_flags,
+                       GFP_NOIO);
        /* > peer_req->i.sector, unless this is the first bio */
        bio->bi_iter.bi_sector = sector;
-       bio_set_dev(bio, device->ldev->backing_bdev);
-       bio_set_op_attrs(bio, op, op_flags);
        bio->bi_private = peer_req;
        bio->bi_end_io = drbd_peer_request_endio;
 
@@ -1726,14 +1703,6 @@ next_bio:
                drbd_submit_bio_noacct(device, fault_type, bio);
        } while (bios);
        return 0;
-
-fail:
-       while (bios) {
-               bio = bios;
-               bios = bios->bi_next;
-               bio_put(bio);
-       }
-       return err;
 }
 
 static void drbd_remove_epoch_entry_interval(struct drbd_device *device,
@@ -1870,7 +1839,6 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
        unsigned long *data;
        struct p_trim *trim = (pi->cmd == P_TRIM) ? pi->data : NULL;
        struct p_trim *zeroes = (pi->cmd == P_ZEROES) ? pi->data : NULL;
-       struct p_trim *wsame = (pi->cmd == P_WSAME) ? pi->data : NULL;
 
        digest_size = 0;
        if (!trim && peer_device->connection->peer_integrity_tfm) {
@@ -1885,7 +1853,7 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
                data_size -= digest_size;
        }
 
-       /* assume request_size == data_size, but special case trim and wsame. */
+       /* assume request_size == data_size, but special case trim. */
        ds = data_size;
        if (trim) {
                if (!expect(data_size == 0))
@@ -1895,23 +1863,11 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
                if (!expect(data_size == 0))
                        return NULL;
                ds = be32_to_cpu(zeroes->size);
-       } else if (wsame) {
-               if (data_size != queue_logical_block_size(device->rq_queue)) {
-                       drbd_err(peer_device, "data size (%u) != drbd logical block size (%u)\n",
-                               data_size, queue_logical_block_size(device->rq_queue));
-                       return NULL;
-               }
-               if (data_size != bdev_logical_block_size(device->ldev->backing_bdev)) {
-                       drbd_err(peer_device, "data size (%u) != backend logical block size (%u)\n",
-                               data_size, bdev_logical_block_size(device->ldev->backing_bdev));
-                       return NULL;
-               }
-               ds = be32_to_cpu(wsame->size);
        }
 
        if (!expect(IS_ALIGNED(ds, 512)))
                return NULL;
-       if (trim || wsame || zeroes) {
+       if (trim || zeroes) {
                if (!expect(ds <= (DRBD_MAX_BBIO_SECTORS << 9)))
                        return NULL;
        } else if (!expect(ds <= DRBD_MAX_BIO_SIZE))
@@ -1943,8 +1899,6 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
                peer_req->flags |= EE_ZEROOUT;
                return peer_req;
        }
-       if (wsame)
-               peer_req->flags |= EE_WRITE_SAME;
 
        /* receive payload size bytes into page chain */
        ds = data_size;
@@ -2033,10 +1987,10 @@ static int recv_dless_read(struct drbd_peer_device *peer_device, struct drbd_req
        D_ASSERT(peer_device->device, sector == bio->bi_iter.bi_sector);
 
        bio_for_each_segment(bvec, bio, iter) {
-               void *mapped = kmap(bvec.bv_page) + bvec.bv_offset;
+               void *mapped = bvec_kmap_local(&bvec);
                expect = min_t(int, data_size, bvec.bv_len);
                err = drbd_recv_all_warn(peer_device->connection, mapped, expect);
-               kunmap(bvec.bv_page);
+               kunmap_local(mapped);
                if (err)
                        return err;
                data_size -= expect;
@@ -2443,8 +2397,6 @@ static unsigned long wire_flags_to_bio_op(u32 dpf)
                return REQ_OP_WRITE_ZEROES;
        if (dpf & DP_DISCARD)
                return REQ_OP_DISCARD;
-       if (dpf & DP_WSAME)
-               return REQ_OP_WRITE_SAME;
        else
                return REQ_OP_WRITE;
 }
@@ -2711,11 +2663,11 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info *
                update_peer_seq(peer_device, peer_seq);
                spin_lock_irq(&device->resource->req_lock);
        }
-       /* TRIM and WRITE_SAME are processed synchronously,
+       /* TRIM and is processed synchronously,
         * we wait for all pending requests, respectively wait for
         * active_ee to become empty in drbd_submit_peer_request();
         * better not add ourselves here. */
-       if ((peer_req->flags & (EE_TRIM|EE_WRITE_SAME|EE_ZEROOUT)) == 0)
+       if ((peer_req->flags & (EE_TRIM | EE_ZEROOUT)) == 0)
                list_add_tail(&peer_req->w.list, &device->active_ee);
        spin_unlock_irq(&device->resource->req_lock);
 
@@ -5084,7 +5036,6 @@ static struct data_cmd drbd_cmd_handler[] = {
        [P_TRIM]            = { 0, sizeof(struct p_trim), receive_Data },
        [P_ZEROES]          = { 0, sizeof(struct p_trim), receive_Data },
        [P_RS_DEALLOCATED]  = { 0, sizeof(struct p_block_desc), receive_rs_deallocated },
-       [P_WSAME]           = { 1, sizeof(struct p_wsame), receive_Data },
 };
 
 static void drbdd(struct drbd_connection *connection)