.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | drbd_worker.c |
---|
3 | 4 | |
---|
.. | .. |
---|
7 | 8 | Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>. |
---|
8 | 9 | Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>. |
---|
9 | 10 | |
---|
10 | | - drbd is free software; you can redistribute it and/or modify |
---|
11 | | - it under the terms of the GNU General Public License as published by |
---|
12 | | - the Free Software Foundation; either version 2, or (at your option) |
---|
13 | | - any later version. |
---|
14 | | - |
---|
15 | | - drbd is distributed in the hope that it will be useful, |
---|
16 | | - but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
17 | | - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
18 | | - GNU General Public License for more details. |
---|
19 | | - |
---|
20 | | - You should have received a copy of the GNU General Public License |
---|
21 | | - along with drbd; see the file COPYING. If not, write to |
---|
22 | | - the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
---|
23 | 11 | |
---|
24 | 12 | */ |
---|
25 | 13 | |
---|
.. | .. |
---|
34 | 22 | #include <linux/random.h> |
---|
35 | 23 | #include <linux/string.h> |
---|
36 | 24 | #include <linux/scatterlist.h> |
---|
| 25 | +#include <linux/part_stat.h> |
---|
37 | 26 | |
---|
38 | 27 | #include "drbd_int.h" |
---|
39 | 28 | #include "drbd_protocol.h" |
---|
.. | .. |
---|
152 | 141 | |
---|
153 | 142 | do_wake = list_empty(block_id == ID_SYNCER ? &device->sync_ee : &device->active_ee); |
---|
154 | 143 | |
---|
155 | | - /* FIXME do we want to detach for failed REQ_DISCARD? |
---|
156 | | - * ((peer_req->flags & (EE_WAS_ERROR|EE_IS_TRIM)) == EE_WAS_ERROR) */ |
---|
| 144 | + /* FIXME do we want to detach for failed REQ_OP_DISCARD? |
---|
| 145 | + * ((peer_req->flags & (EE_WAS_ERROR|EE_TRIM)) == EE_WAS_ERROR) */ |
---|
157 | 146 | if (peer_req->flags & EE_WAS_ERROR) |
---|
158 | 147 | __drbd_chk_io_error(device, DRBD_WRITE_ERROR); |
---|
159 | 148 | |
---|
.. | .. |
---|
295 | 284 | complete_master_bio(device, &m); |
---|
296 | 285 | } |
---|
297 | 286 | |
---|
298 | | -void drbd_csum_ee(struct crypto_ahash *tfm, struct drbd_peer_request *peer_req, void *digest) |
---|
| 287 | +void drbd_csum_ee(struct crypto_shash *tfm, struct drbd_peer_request *peer_req, void *digest) |
---|
299 | 288 | { |
---|
300 | | - AHASH_REQUEST_ON_STACK(req, tfm); |
---|
301 | | - struct scatterlist sg; |
---|
| 289 | + SHASH_DESC_ON_STACK(desc, tfm); |
---|
302 | 290 | struct page *page = peer_req->pages; |
---|
303 | 291 | struct page *tmp; |
---|
304 | 292 | unsigned len; |
---|
| 293 | + void *src; |
---|
305 | 294 | |
---|
306 | | - ahash_request_set_tfm(req, tfm); |
---|
307 | | - ahash_request_set_callback(req, 0, NULL, NULL); |
---|
| 295 | + desc->tfm = tfm; |
---|
308 | 296 | |
---|
309 | | - sg_init_table(&sg, 1); |
---|
310 | | - crypto_ahash_init(req); |
---|
| 297 | + crypto_shash_init(desc); |
---|
311 | 298 | |
---|
| 299 | + src = kmap_atomic(page); |
---|
312 | 300 | while ((tmp = page_chain_next(page))) { |
---|
313 | 301 | /* all but the last page will be fully used */ |
---|
314 | | - sg_set_page(&sg, page, PAGE_SIZE, 0); |
---|
315 | | - ahash_request_set_crypt(req, &sg, NULL, sg.length); |
---|
316 | | - crypto_ahash_update(req); |
---|
| 302 | + crypto_shash_update(desc, src, PAGE_SIZE); |
---|
| 303 | + kunmap_atomic(src); |
---|
317 | 304 | page = tmp; |
---|
| 305 | + src = kmap_atomic(page); |
---|
318 | 306 | } |
---|
319 | 307 | /* and now the last, possibly only partially used page */ |
---|
320 | 308 | len = peer_req->i.size & (PAGE_SIZE - 1); |
---|
321 | | - sg_set_page(&sg, page, len ?: PAGE_SIZE, 0); |
---|
322 | | - ahash_request_set_crypt(req, &sg, digest, sg.length); |
---|
323 | | - crypto_ahash_finup(req); |
---|
324 | | - ahash_request_zero(req); |
---|
| 309 | + crypto_shash_update(desc, src, len ?: PAGE_SIZE); |
---|
| 310 | + kunmap_atomic(src); |
---|
| 311 | + |
---|
| 312 | + crypto_shash_final(desc, digest); |
---|
| 313 | + shash_desc_zero(desc); |
---|
325 | 314 | } |
---|
326 | 315 | |
---|
327 | | -void drbd_csum_bio(struct crypto_ahash *tfm, struct bio *bio, void *digest) |
---|
| 316 | +void drbd_csum_bio(struct crypto_shash *tfm, struct bio *bio, void *digest) |
---|
328 | 317 | { |
---|
329 | | - AHASH_REQUEST_ON_STACK(req, tfm); |
---|
330 | | - struct scatterlist sg; |
---|
| 318 | + SHASH_DESC_ON_STACK(desc, tfm); |
---|
331 | 319 | struct bio_vec bvec; |
---|
332 | 320 | struct bvec_iter iter; |
---|
333 | 321 | |
---|
334 | | - ahash_request_set_tfm(req, tfm); |
---|
335 | | - ahash_request_set_callback(req, 0, NULL, NULL); |
---|
| 322 | + desc->tfm = tfm; |
---|
336 | 323 | |
---|
337 | | - sg_init_table(&sg, 1); |
---|
338 | | - crypto_ahash_init(req); |
---|
| 324 | + crypto_shash_init(desc); |
---|
339 | 325 | |
---|
340 | 326 | bio_for_each_segment(bvec, bio, iter) { |
---|
341 | | - sg_set_page(&sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset); |
---|
342 | | - ahash_request_set_crypt(req, &sg, NULL, sg.length); |
---|
343 | | - crypto_ahash_update(req); |
---|
| 327 | + u8 *src; |
---|
| 328 | + |
---|
| 329 | + src = kmap_atomic(bvec.bv_page); |
---|
| 330 | + crypto_shash_update(desc, src + bvec.bv_offset, bvec.bv_len); |
---|
| 331 | + kunmap_atomic(src); |
---|
| 332 | + |
---|
344 | 333 | /* REQ_OP_WRITE_SAME has only one segment, |
---|
345 | 334 | * checksum the payload only once. */ |
---|
346 | 335 | if (bio_op(bio) == REQ_OP_WRITE_SAME) |
---|
347 | 336 | break; |
---|
348 | 337 | } |
---|
349 | | - ahash_request_set_crypt(req, NULL, digest, 0); |
---|
350 | | - crypto_ahash_final(req); |
---|
351 | | - ahash_request_zero(req); |
---|
| 338 | + crypto_shash_final(desc, digest); |
---|
| 339 | + shash_desc_zero(desc); |
---|
352 | 340 | } |
---|
353 | 341 | |
---|
354 | 342 | /* MAYBE merge common code with w_e_end_ov_req */ |
---|
.. | .. |
---|
367 | 355 | if (unlikely((peer_req->flags & EE_WAS_ERROR) != 0)) |
---|
368 | 356 | goto out; |
---|
369 | 357 | |
---|
370 | | - digest_size = crypto_ahash_digestsize(peer_device->connection->csums_tfm); |
---|
| 358 | + digest_size = crypto_shash_digestsize(peer_device->connection->csums_tfm); |
---|
371 | 359 | digest = kmalloc(digest_size, GFP_NOIO); |
---|
372 | 360 | if (digest) { |
---|
373 | 361 | sector_t sector = peer_req->i.sector; |
---|
.. | .. |
---|
495 | 483 | fb->values[i] += value; |
---|
496 | 484 | } |
---|
497 | 485 | |
---|
498 | | -struct fifo_buffer *fifo_alloc(int fifo_size) |
---|
| 486 | +struct fifo_buffer *fifo_alloc(unsigned int fifo_size) |
---|
499 | 487 | { |
---|
500 | 488 | struct fifo_buffer *fb; |
---|
501 | 489 | |
---|
502 | | - fb = kzalloc(sizeof(struct fifo_buffer) + sizeof(int) * fifo_size, GFP_NOIO); |
---|
| 490 | + fb = kzalloc(struct_size(fb, values, fifo_size), GFP_NOIO); |
---|
503 | 491 | if (!fb) |
---|
504 | 492 | return NULL; |
---|
505 | 493 | |
---|
.. | .. |
---|
603 | 591 | struct drbd_connection *const connection = peer_device ? peer_device->connection : NULL; |
---|
604 | 592 | unsigned long bit; |
---|
605 | 593 | sector_t sector; |
---|
606 | | - const sector_t capacity = drbd_get_capacity(device->this_bdev); |
---|
| 594 | + const sector_t capacity = get_capacity(device->vdisk); |
---|
607 | 595 | int max_bio_size; |
---|
608 | 596 | int number, rollback_i, size; |
---|
609 | 597 | int align, requeue = 0; |
---|
.. | .. |
---|
781 | 769 | { |
---|
782 | 770 | int number, i, size; |
---|
783 | 771 | sector_t sector; |
---|
784 | | - const sector_t capacity = drbd_get_capacity(device->this_bdev); |
---|
| 772 | + const sector_t capacity = get_capacity(device->vdisk); |
---|
785 | 773 | bool stop_sector_reached = false; |
---|
786 | 774 | |
---|
787 | 775 | if (unlikely(cancel)) |
---|
.. | .. |
---|
1205 | 1193 | * a real fix would be much more involved, |
---|
1206 | 1194 | * introducing more locking mechanisms */ |
---|
1207 | 1195 | if (peer_device->connection->csums_tfm) { |
---|
1208 | | - digest_size = crypto_ahash_digestsize(peer_device->connection->csums_tfm); |
---|
| 1196 | + digest_size = crypto_shash_digestsize(peer_device->connection->csums_tfm); |
---|
1209 | 1197 | D_ASSERT(device, digest_size == di->digest_size); |
---|
1210 | 1198 | digest = kmalloc(digest_size, GFP_NOIO); |
---|
1211 | 1199 | } |
---|
.. | .. |
---|
1255 | 1243 | if (unlikely(cancel)) |
---|
1256 | 1244 | goto out; |
---|
1257 | 1245 | |
---|
1258 | | - digest_size = crypto_ahash_digestsize(peer_device->connection->verify_tfm); |
---|
| 1246 | + digest_size = crypto_shash_digestsize(peer_device->connection->verify_tfm); |
---|
1259 | 1247 | digest = kmalloc(digest_size, GFP_NOIO); |
---|
1260 | 1248 | if (!digest) { |
---|
1261 | 1249 | err = 1; /* terminate the connection in case the allocation failed */ |
---|
.. | .. |
---|
1327 | 1315 | di = peer_req->digest; |
---|
1328 | 1316 | |
---|
1329 | 1317 | if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) { |
---|
1330 | | - digest_size = crypto_ahash_digestsize(peer_device->connection->verify_tfm); |
---|
| 1318 | + digest_size = crypto_shash_digestsize(peer_device->connection->verify_tfm); |
---|
1331 | 1319 | digest = kmalloc(digest_size, GFP_NOIO); |
---|
1332 | 1320 | if (digest) { |
---|
1333 | 1321 | drbd_csum_ee(peer_device->connection->verify_tfm, peer_req, digest); |
---|
.. | .. |
---|
1537 | 1525 | |
---|
1538 | 1526 | drbd_req_make_private_bio(req, req->master_bio); |
---|
1539 | 1527 | bio_set_dev(req->private_bio, device->ldev->backing_bdev); |
---|
1540 | | - generic_make_request(req->private_bio); |
---|
| 1528 | + submit_bio_noacct(req->private_bio); |
---|
1541 | 1529 | |
---|
1542 | 1530 | return 0; |
---|
1543 | 1531 | } |
---|
.. | .. |
---|
1684 | 1672 | |
---|
1685 | 1673 | void drbd_rs_controller_reset(struct drbd_device *device) |
---|
1686 | 1674 | { |
---|
1687 | | - struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; |
---|
| 1675 | + struct gendisk *disk = device->ldev->backing_bdev->bd_disk; |
---|
1688 | 1676 | struct fifo_buffer *plan; |
---|
1689 | 1677 | |
---|
1690 | 1678 | atomic_set(&device->rs_sect_in, 0); |
---|
.. | .. |
---|
2110 | 2098 | if (uncork) { |
---|
2111 | 2099 | mutex_lock(&connection->data.mutex); |
---|
2112 | 2100 | if (connection->data.socket) |
---|
2113 | | - drbd_tcp_uncork(connection->data.socket); |
---|
| 2101 | + tcp_sock_set_cork(connection->data.socket->sk, false); |
---|
2114 | 2102 | mutex_unlock(&connection->data.mutex); |
---|
2115 | 2103 | } |
---|
2116 | 2104 | |
---|
.. | .. |
---|
2165 | 2153 | mutex_lock(&connection->data.mutex); |
---|
2166 | 2154 | if (connection->data.socket) { |
---|
2167 | 2155 | if (cork) |
---|
2168 | | - drbd_tcp_cork(connection->data.socket); |
---|
| 2156 | + tcp_sock_set_cork(connection->data.socket->sk, true); |
---|
2169 | 2157 | else if (!uncork) |
---|
2170 | | - drbd_tcp_uncork(connection->data.socket); |
---|
| 2158 | + tcp_sock_set_cork(connection->data.socket->sk, false); |
---|
2171 | 2159 | } |
---|
2172 | 2160 | mutex_unlock(&connection->data.mutex); |
---|
2173 | 2161 | } |
---|