forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/md/md-bitmap.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * bitmap.c two-level bitmap (C) Peter T. Breuer (ptb@ot.uc3m.es) 2003
34 *
....@@ -323,14 +324,6 @@
323324 wake_up(&bitmap->write_wait);
324325 }
325326
326
-/* copied from buffer.c */
327
-static void
328
-__clear_page_buffers(struct page *page)
329
-{
330
- ClearPagePrivate(page);
331
- set_page_private(page, 0);
332
- put_page(page);
333
-}
334327 static void free_buffers(struct page *page)
335328 {
336329 struct buffer_head *bh;
....@@ -344,7 +337,7 @@
344337 free_buffer_head(bh);
345338 bh = next;
346339 }
347
- __clear_page_buffers(page);
340
+ detach_page_private(page);
348341 put_page(page);
349342 }
350343
....@@ -363,33 +356,38 @@
363356 int ret = 0;
364357 struct inode *inode = file_inode(file);
365358 struct buffer_head *bh;
366
- sector_t block;
359
+ sector_t block, blk_cur;
360
+ unsigned long blocksize = i_blocksize(inode);
367361
368362 pr_debug("read bitmap file (%dB @ %llu)\n", (int)PAGE_SIZE,
369363 (unsigned long long)index << PAGE_SHIFT);
370364
371
- bh = alloc_page_buffers(page, 1<<inode->i_blkbits, false);
365
+ bh = alloc_page_buffers(page, blocksize, false);
372366 if (!bh) {
373367 ret = -ENOMEM;
374368 goto out;
375369 }
376
- attach_page_buffers(page, bh);
377
- block = index << (PAGE_SHIFT - inode->i_blkbits);
370
+ attach_page_private(page, bh);
371
+ blk_cur = index << (PAGE_SHIFT - inode->i_blkbits);
378372 while (bh) {
373
+ block = blk_cur;
374
+
379375 if (count == 0)
380376 bh->b_blocknr = 0;
381377 else {
382
- bh->b_blocknr = bmap(inode, block);
383
- if (bh->b_blocknr == 0) {
384
- /* Cannot use this file! */
378
+ ret = bmap(inode, &block);
379
+ if (ret || !block) {
385380 ret = -EINVAL;
381
+ bh->b_blocknr = 0;
386382 goto out;
387383 }
384
+
385
+ bh->b_blocknr = block;
388386 bh->b_bdev = inode->i_sb->s_bdev;
389
- if (count < (1<<inode->i_blkbits))
387
+ if (count < blocksize)
390388 count = 0;
391389 else
392
- count -= (1<<inode->i_blkbits);
390
+ count -= blocksize;
393391
394392 bh->b_end_io = end_bitmap_write;
395393 bh->b_private = bitmap;
....@@ -398,7 +396,7 @@
398396 set_buffer_mapped(bh);
399397 submit_bh(REQ_OP_READ, 0, bh);
400398 }
401
- block++;
399
+ blk_cur++;
402400 bh = bh->b_this_page;
403401 }
404402 page->index = index;
....@@ -490,10 +488,10 @@
490488 pr_debug(" magic: %08x\n", le32_to_cpu(sb->magic));
491489 pr_debug(" version: %d\n", le32_to_cpu(sb->version));
492490 pr_debug(" uuid: %08x.%08x.%08x.%08x\n",
493
- le32_to_cpu(*(__u32 *)(sb->uuid+0)),
494
- le32_to_cpu(*(__u32 *)(sb->uuid+4)),
495
- le32_to_cpu(*(__u32 *)(sb->uuid+8)),
496
- le32_to_cpu(*(__u32 *)(sb->uuid+12)));
491
+ le32_to_cpu(*(__le32 *)(sb->uuid+0)),
492
+ le32_to_cpu(*(__le32 *)(sb->uuid+4)),
493
+ le32_to_cpu(*(__le32 *)(sb->uuid+8)),
494
+ le32_to_cpu(*(__le32 *)(sb->uuid+12)));
497495 pr_debug(" events: %llu\n",
498496 (unsigned long long) le64_to_cpu(sb->events));
499497 pr_debug("events cleared: %llu\n",
....@@ -608,8 +606,8 @@
608606 if (bitmap->cluster_slot >= 0) {
609607 sector_t bm_blocks = bitmap->mddev->resync_max_sectors;
610608
611
- sector_div(bm_blocks,
612
- bitmap->mddev->bitmap_info.chunksize >> 9);
609
+ bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks,
610
+ (bitmap->mddev->bitmap_info.chunksize >> 9));
613611 /* bits to bytes */
614612 bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t);
615613 /* to 4k blocks */
....@@ -641,14 +639,6 @@
641639 daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
642640 write_behind = le32_to_cpu(sb->write_behind);
643641 sectors_reserved = le32_to_cpu(sb->sectors_reserved);
644
- /* Setup nodes/clustername only if bitmap version is
645
- * cluster-compatible
646
- */
647
- if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) {
648
- nodes = le32_to_cpu(sb->nodes);
649
- strlcpy(bitmap->mddev->bitmap_info.cluster_name,
650
- sb->cluster_name, 64);
651
- }
652642
653643 /* verify that the bitmap-specific fields are valid */
654644 if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
....@@ -668,6 +658,16 @@
668658 pr_warn("%s: invalid bitmap file superblock: %s\n",
669659 bmname(bitmap), reason);
670660 goto out;
661
+ }
662
+
663
+ /*
664
+ * Setup nodes/clustername only if bitmap version is
665
+ * cluster-compatible
666
+ */
667
+ if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) {
668
+ nodes = le32_to_cpu(sb->nodes);
669
+ strlcpy(bitmap->mddev->bitmap_info.cluster_name,
670
+ sb->cluster_name, 64);
671671 }
672672
673673 /* keep the array size field of the bitmap superblock up to date */
....@@ -702,9 +702,9 @@
702702
703703 out:
704704 kunmap_atomic(sb);
705
- /* Assigning chunksize is required for "re_read" */
706
- bitmap->mddev->bitmap_info.chunksize = chunksize;
707705 if (err == 0 && nodes && (bitmap->cluster_slot < 0)) {
706
+ /* Assigning chunksize is required for "re_read" */
707
+ bitmap->mddev->bitmap_info.chunksize = chunksize;
708708 err = md_setup_cluster(bitmap->mddev, nodes);
709709 if (err) {
710710 pr_warn("%s: Could not setup cluster service (%d)\n",
....@@ -715,18 +715,18 @@
715715 goto re_read;
716716 }
717717
718
-
719718 out_no_sb:
720
- if (test_bit(BITMAP_STALE, &bitmap->flags))
721
- bitmap->events_cleared = bitmap->mddev->events;
722
- bitmap->mddev->bitmap_info.chunksize = chunksize;
723
- bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep;
724
- bitmap->mddev->bitmap_info.max_write_behind = write_behind;
725
- bitmap->mddev->bitmap_info.nodes = nodes;
726
- if (bitmap->mddev->bitmap_info.space == 0 ||
727
- bitmap->mddev->bitmap_info.space > sectors_reserved)
728
- bitmap->mddev->bitmap_info.space = sectors_reserved;
729
- if (err) {
719
+ if (err == 0) {
720
+ if (test_bit(BITMAP_STALE, &bitmap->flags))
721
+ bitmap->events_cleared = bitmap->mddev->events;
722
+ bitmap->mddev->bitmap_info.chunksize = chunksize;
723
+ bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep;
724
+ bitmap->mddev->bitmap_info.max_write_behind = write_behind;
725
+ bitmap->mddev->bitmap_info.nodes = nodes;
726
+ if (bitmap->mddev->bitmap_info.space == 0 ||
727
+ bitmap->mddev->bitmap_info.space > sectors_reserved)
728
+ bitmap->mddev->bitmap_info.space = sectors_reserved;
729
+ } else {
730730 md_bitmap_print_sb(bitmap);
731731 if (bitmap->cluster_slot < 0)
732732 md_cluster_stop(bitmap->mddev);
....@@ -1018,8 +1018,6 @@
10181018 /* look at each page to see if there are any set bits that need to be
10191019 * flushed out to disk */
10201020 for (i = 0; i < bitmap->storage.file_pages; i++) {
1021
- if (!bitmap->storage.filemap)
1022
- return;
10231021 dirty = test_and_clear_page_attr(bitmap, i, BITMAP_PAGE_DIRTY);
10241022 need_write = test_and_clear_page_attr(bitmap, i,
10251023 BITMAP_PAGE_NEEDWRITE);
....@@ -1337,7 +1335,8 @@
13371335 BITMAP_PAGE_DIRTY))
13381336 /* bitmap_unplug will handle the rest */
13391337 break;
1340
- if (test_and_clear_page_attr(bitmap, j,
1338
+ if (bitmap->storage.filemap &&
1339
+ test_and_clear_page_attr(bitmap, j,
13411340 BITMAP_PAGE_NEEDWRITE)) {
13421341 write_page(bitmap, bitmap->storage.filemap[j], 0);
13431342 }
....@@ -1437,7 +1436,7 @@
14371436 case 0:
14381437 md_bitmap_file_set_bit(bitmap, offset);
14391438 md_bitmap_count_page(&bitmap->counts, offset, 1);
1440
- /* fall through */
1439
+ fallthrough;
14411440 case 1:
14421441 *bmc = 2;
14431442 }
....@@ -1635,7 +1634,7 @@
16351634 s += blocks;
16361635 }
16371636 bitmap->last_end_sync = jiffies;
1638
- sysfs_notify(&bitmap->mddev->kobj, NULL, "sync_completed");
1637
+ sysfs_notify_dirent_safe(bitmap->mddev->sysfs_completed);
16391638 }
16401639 EXPORT_SYMBOL(md_bitmap_cond_end_sync);
16411640
....@@ -1791,6 +1790,8 @@
17911790 return;
17921791
17931792 md_bitmap_wait_behind_writes(mddev);
1793
+ if (!mddev->serialize_policy)
1794
+ mddev_destroy_serial_pool(mddev, NULL, true);
17941795
17951796 mutex_lock(&mddev->bitmap_info.mutex);
17961797 spin_lock(&mddev->lock);
....@@ -1901,9 +1902,13 @@
19011902 sector_t start = 0;
19021903 sector_t sector = 0;
19031904 struct bitmap *bitmap = mddev->bitmap;
1905
+ struct md_rdev *rdev;
19041906
19051907 if (!bitmap)
19061908 goto out;
1909
+
1910
+ rdev_for_each(rdev, mddev)
1911
+ mddev_create_serial_pool(mddev, rdev, true);
19071912
19081913 if (mddev_is_clustered(mddev))
19091914 md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);
....@@ -1949,6 +1954,7 @@
19491954 }
19501955 EXPORT_SYMBOL_GPL(md_bitmap_load);
19511956
1957
+/* caller need to free returned bitmap with md_bitmap_free() */
19521958 struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot)
19531959 {
19541960 int rv = 0;
....@@ -2012,6 +2018,7 @@
20122018 md_bitmap_unplug(mddev->bitmap);
20132019 *low = lo;
20142020 *high = hi;
2021
+ md_bitmap_free(bitmap);
20152022
20162023 return rv;
20172024 }
....@@ -2290,9 +2297,9 @@
22902297 goto out;
22912298 }
22922299 if (mddev->pers) {
2293
- mddev->pers->quiesce(mddev, 1);
2300
+ mddev_suspend(mddev);
22942301 md_bitmap_destroy(mddev);
2295
- mddev->pers->quiesce(mddev, 0);
2302
+ mddev_resume(mddev);
22962303 }
22972304 mddev->bitmap_info.offset = 0;
22982305 if (mddev->bitmap_info.file) {
....@@ -2329,8 +2336,8 @@
23292336 mddev->bitmap_info.offset = offset;
23302337 if (mddev->pers) {
23312338 struct bitmap *bitmap;
2332
- mddev->pers->quiesce(mddev, 1);
23332339 bitmap = md_bitmap_create(mddev, -1);
2340
+ mddev_suspend(mddev);
23342341 if (IS_ERR(bitmap))
23352342 rv = PTR_ERR(bitmap);
23362343 else {
....@@ -2339,11 +2346,12 @@
23392346 if (rv)
23402347 mddev->bitmap_info.offset = 0;
23412348 }
2342
- mddev->pers->quiesce(mddev, 0);
23432349 if (rv) {
23442350 md_bitmap_destroy(mddev);
2351
+ mddev_resume(mddev);
23452352 goto out;
23462353 }
2354
+ mddev_resume(mddev);
23472355 }
23482356 }
23492357 }
....@@ -2462,12 +2470,26 @@
24622470 backlog_store(struct mddev *mddev, const char *buf, size_t len)
24632471 {
24642472 unsigned long backlog;
2473
+ unsigned long old_mwb = mddev->bitmap_info.max_write_behind;
24652474 int rv = kstrtoul(buf, 10, &backlog);
24662475 if (rv)
24672476 return rv;
24682477 if (backlog > COUNTER_MAX)
24692478 return -EINVAL;
24702479 mddev->bitmap_info.max_write_behind = backlog;
2480
+ if (!backlog && mddev->serial_info_pool) {
2481
+ /* serial_info_pool is not needed if backlog is zero */
2482
+ if (!mddev->serialize_policy)
2483
+ mddev_destroy_serial_pool(mddev, NULL, false);
2484
+ } else if (backlog && !mddev->serial_info_pool) {
2485
+ /* serial_info_pool is needed since backlog is not zero */
2486
+ struct md_rdev *rdev;
2487
+
2488
+ rdev_for_each(rdev, mddev)
2489
+ mddev_create_serial_pool(mddev, rdev, false);
2490
+ }
2491
+ if (old_mwb != backlog)
2492
+ md_bitmap_update_sb(mddev->bitmap);
24712493 return len;
24722494 }
24732495
....@@ -2600,4 +2622,3 @@
26002622 .name = "bitmap",
26012623 .attrs = md_bitmap_attrs,
26022624 };
2603
-