Skip to content

Commit 2edbdd1

Browse files
committed
Merge branch 'for-linus' of git://neil.brown.name/md
* 'for-linus' of git://neil.brown.name/md: md: support bitmaps on RAID10 arrays larger then 2 terabytes md: update sync_completed and reshape_position even more often. md: improve usefulness and accuracy of sysfs file md/sync_completed. md: allow setting newly added device to 'in_sync' via sysfs. md: tiny md.h cleanups
2 parents a5432f5 + 1f59390 commit 2edbdd1

File tree

4 files changed

+51
-25
lines changed

4 files changed

+51
-25
lines changed

drivers/md/bitmap.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,7 @@ void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector)
14791479
s += blocks;
14801480
}
14811481
bitmap->last_end_sync = jiffies;
1482+
sysfs_notify(&bitmap->mddev->kobj, NULL, "sync_completed");
14821483
}
14831484

14841485
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed)
@@ -1589,7 +1590,7 @@ void bitmap_destroy(mddev_t *mddev)
15891590
int bitmap_create(mddev_t *mddev)
15901591
{
15911592
struct bitmap *bitmap;
1592-
unsigned long blocks = mddev->resync_max_sectors;
1593+
sector_t blocks = mddev->resync_max_sectors;
15931594
unsigned long chunks;
15941595
unsigned long pages;
15951596
struct file *file = mddev->bitmap_file;
@@ -1631,8 +1632,8 @@ int bitmap_create(mddev_t *mddev)
16311632
bitmap->chunkshift = ffz(~bitmap->chunksize);
16321633

16331634
/* now that chunksize and chunkshift are set, we can use these macros */
1634-
chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) /
1635-
CHUNK_BLOCK_RATIO(bitmap);
1635+
chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) >>
1636+
CHUNK_BLOCK_SHIFT(bitmap);
16361637
pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO;
16371638

16381639
BUG_ON(!pages);

drivers/md/md.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,8 @@ static void md_update_sb(mddev_t * mddev, int force_change)
20172017
clear_bit(MD_CHANGE_PENDING, &mddev->flags);
20182018
spin_unlock_irq(&mddev->write_lock);
20192019
wake_up(&mddev->sb_wait);
2020+
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
2021+
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
20202022

20212023
}
20222024

@@ -2086,6 +2088,7 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
20862088
* -writemostly - clears write_mostly
20872089
* blocked - sets the Blocked flag
20882090
* -blocked - clears the Blocked flag
2091+
* insync - sets Insync providing device isn't active
20892092
*/
20902093
int err = -EINVAL;
20912094
if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
@@ -2117,6 +2120,9 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
21172120
set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
21182121
md_wakeup_thread(rdev->mddev->thread);
21192122

2123+
err = 0;
2124+
} else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) {
2125+
set_bit(In_sync, &rdev->flags);
21202126
err = 0;
21212127
}
21222128
if (!err && rdev->sysfs_state)
@@ -2190,7 +2196,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
21902196
} else if (rdev->mddev->pers) {
21912197
mdk_rdev_t *rdev2;
21922198
/* Activating a spare .. or possibly reactivating
2193-
* if we every get bitmaps working here.
2199+
* if we ever get bitmaps working here.
21942200
*/
21952201

21962202
if (rdev->raid_disk != -1)
@@ -3482,12 +3488,15 @@ sync_completed_show(mddev_t *mddev, char *page)
34823488
{
34833489
unsigned long max_sectors, resync;
34843490

3491+
if (!test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
3492+
return sprintf(page, "none\n");
3493+
34853494
if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
34863495
max_sectors = mddev->resync_max_sectors;
34873496
else
34883497
max_sectors = mddev->dev_sectors;
34893498

3490-
resync = (mddev->curr_resync - atomic_read(&mddev->recovery_active));
3499+
resync = mddev->curr_resync_completed;
34913500
return sprintf(page, "%lu / %lu\n", resync, max_sectors);
34923501
}
34933502

@@ -6334,26 +6343,31 @@ void md_do_sync(mddev_t *mddev)
63346343
sector_t sectors;
63356344

63366345
skipped = 0;
6337-
if (j >= mddev->resync_max) {
6338-
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
6339-
wait_event(mddev->recovery_wait,
6340-
mddev->resync_max > j
6341-
|| kthread_should_stop());
6342-
}
6343-
if (kthread_should_stop())
6344-
goto interrupted;
63456346

6346-
if (mddev->curr_resync > mddev->curr_resync_completed &&
6347-
(mddev->curr_resync - mddev->curr_resync_completed)
6348-
> (max_sectors >> 4)) {
6347+
if ((mddev->curr_resync > mddev->curr_resync_completed &&
6348+
(mddev->curr_resync - mddev->curr_resync_completed)
6349+
> (max_sectors >> 4)) ||
6350+
(j - mddev->curr_resync_completed)*2
6351+
>= mddev->resync_max - mddev->curr_resync_completed
6352+
) {
63496353
/* time to update curr_resync_completed */
63506354
blk_unplug(mddev->queue);
63516355
wait_event(mddev->recovery_wait,
63526356
atomic_read(&mddev->recovery_active) == 0);
63536357
mddev->curr_resync_completed =
63546358
mddev->curr_resync;
63556359
set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6360+
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
63566361
}
6362+
6363+
if (j >= mddev->resync_max)
6364+
wait_event(mddev->recovery_wait,
6365+
mddev->resync_max > j
6366+
|| kthread_should_stop());
6367+
6368+
if (kthread_should_stop())
6369+
goto interrupted;
6370+
63576371
sectors = mddev->pers->sync_request(mddev, j, &skipped,
63586372
currspeed < speed_min(mddev));
63596373
if (sectors == 0) {
@@ -6461,6 +6475,7 @@ void md_do_sync(mddev_t *mddev)
64616475

64626476
skip:
64636477
mddev->curr_resync = 0;
6478+
mddev->curr_resync_completed = 0;
64646479
mddev->resync_min = 0;
64656480
mddev->resync_max = MaxSector;
64666481
sysfs_notify(&mddev->kobj, NULL, "sync_completed");

drivers/md/md.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,17 @@
1212
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1313
*/
1414

15-
#ifndef _MD_K_H
16-
#define _MD_K_H
17-
18-
#ifdef CONFIG_BLOCK
15+
#ifndef _MD_MD_H
16+
#define _MD_MD_H
17+
18+
#include <linux/blkdev.h>
19+
#include <linux/kobject.h>
20+
#include <linux/list.h>
21+
#include <linux/mm.h>
22+
#include <linux/mutex.h>
23+
#include <linux/timer.h>
24+
#include <linux/wait.h>
25+
#include <linux/workqueue.h>
1926

2027
#define MaxSector (~(sector_t)0)
2128

@@ -408,10 +415,6 @@ static inline void safe_put_page(struct page *p)
408415
if (p) put_page(p);
409416
}
410417

411-
#endif /* CONFIG_BLOCK */
412-
#endif
413-
414-
415418
extern int register_md_personality(struct mdk_personality *p);
416419
extern int unregister_md_personality(struct mdk_personality *p);
417420
extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev),
@@ -434,3 +437,5 @@ extern void md_new_event(mddev_t *mddev);
434437
extern int md_allow_write(mddev_t *mddev);
435438
extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
436439
extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors);
440+
441+
#endif /* _MD_MD_H */

drivers/md/raid5.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3845,6 +3845,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
38453845
wait_event(conf->wait_for_overlap,
38463846
atomic_read(&conf->reshape_stripes)==0);
38473847
mddev->reshape_position = conf->reshape_progress;
3848+
mddev->curr_resync_completed = mddev->curr_resync;
38483849
conf->reshape_checkpoint = jiffies;
38493850
set_bit(MD_CHANGE_DEVS, &mddev->flags);
38503851
md_wakeup_thread(mddev->thread);
@@ -3854,6 +3855,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
38543855
conf->reshape_safe = mddev->reshape_position;
38553856
spin_unlock_irq(&conf->device_lock);
38563857
wake_up(&conf->wait_for_overlap);
3858+
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
38573859
}
38583860

38593861
if (mddev->delta_disks < 0) {
@@ -3938,11 +3940,13 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
39383940
* then we need to write out the superblock.
39393941
*/
39403942
sector_nr += reshape_sectors;
3941-
if (sector_nr >= mddev->resync_max) {
3943+
if ((sector_nr - mddev->curr_resync_completed) * 2
3944+
>= mddev->resync_max - mddev->curr_resync_completed) {
39423945
/* Cannot proceed until we've updated the superblock... */
39433946
wait_event(conf->wait_for_overlap,
39443947
atomic_read(&conf->reshape_stripes) == 0);
39453948
mddev->reshape_position = conf->reshape_progress;
3949+
mddev->curr_resync_completed = mddev->curr_resync;
39463950
conf->reshape_checkpoint = jiffies;
39473951
set_bit(MD_CHANGE_DEVS, &mddev->flags);
39483952
md_wakeup_thread(mddev->thread);
@@ -3953,6 +3957,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
39533957
conf->reshape_safe = mddev->reshape_position;
39543958
spin_unlock_irq(&conf->device_lock);
39553959
wake_up(&conf->wait_for_overlap);
3960+
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
39563961
}
39573962
return reshape_sectors;
39583963
}

0 commit comments

Comments
 (0)