Pārlūkot izejas kodu

Merge tag 'md-3.4-fixes' of git://neil.brown.name/md

Pull a few more fixes for md from NeilBrown:
 "Two are tagged for -stable.  They can cause an oops, but very rarely."

* tag 'md-3.4-fixes' of git://neil.brown.name/md:
  md/bitmap: prevent bitmap_daemon_work running while initialising bitmap
  md/raid1,raid10: Fix calculation of 'vcnt' when processing error recovery.
  MD: Bitmap version cleanup.
Linus Torvalds 13 gadi atpakaļ
vecāks
revīzija
e42bd6e4a6
3 mainītis faili ar 6 papildinājumiem un 6 dzēšanām
  1. 2 3
      drivers/md/bitmap.c
  2. 2 1
      drivers/md/raid1.c
  3. 2 2
      drivers/md/raid10.c

+ 2 - 3
drivers/md/bitmap.c

@@ -539,9 +539,6 @@ static int bitmap_new_disk_sb(struct bitmap *bitmap)
 	bitmap->events_cleared = bitmap->mddev->events;
 	bitmap->events_cleared = bitmap->mddev->events;
 	sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
 	sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
 
 
-	bitmap->flags |= BITMAP_HOSTENDIAN;
-	sb->version = cpu_to_le32(BITMAP_MAJOR_HOSTENDIAN);
-
 	kunmap_atomic(sb);
 	kunmap_atomic(sb);
 
 
 	return 0;
 	return 0;
@@ -1788,7 +1785,9 @@ int bitmap_load(struct mddev *mddev)
 		 * re-add of a missing device */
 		 * re-add of a missing device */
 		start = mddev->recovery_cp;
 		start = mddev->recovery_cp;
 
 
+	mutex_lock(&mddev->bitmap_info.mutex);
 	err = bitmap_init_from_disk(bitmap, start);
 	err = bitmap_init_from_disk(bitmap, start);
+	mutex_unlock(&mddev->bitmap_info.mutex);
 
 
 	if (err)
 	if (err)
 		goto out;
 		goto out;

+ 2 - 1
drivers/md/raid1.c

@@ -1712,6 +1712,7 @@ static int process_checks(struct r1bio *r1_bio)
 	struct r1conf *conf = mddev->private;
 	struct r1conf *conf = mddev->private;
 	int primary;
 	int primary;
 	int i;
 	int i;
+	int vcnt;
 
 
 	for (primary = 0; primary < conf->raid_disks * 2; primary++)
 	for (primary = 0; primary < conf->raid_disks * 2; primary++)
 		if (r1_bio->bios[primary]->bi_end_io == end_sync_read &&
 		if (r1_bio->bios[primary]->bi_end_io == end_sync_read &&
@@ -1721,9 +1722,9 @@ static int process_checks(struct r1bio *r1_bio)
 			break;
 			break;
 		}
 		}
 	r1_bio->read_disk = primary;
 	r1_bio->read_disk = primary;
+	vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9);
 	for (i = 0; i < conf->raid_disks * 2; i++) {
 	for (i = 0; i < conf->raid_disks * 2; i++) {
 		int j;
 		int j;
-		int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9);
 		struct bio *pbio = r1_bio->bios[primary];
 		struct bio *pbio = r1_bio->bios[primary];
 		struct bio *sbio = r1_bio->bios[i];
 		struct bio *sbio = r1_bio->bios[i];
 		int size;
 		int size;

+ 2 - 2
drivers/md/raid10.c

@@ -1788,6 +1788,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 	struct r10conf *conf = mddev->private;
 	struct r10conf *conf = mddev->private;
 	int i, first;
 	int i, first;
 	struct bio *tbio, *fbio;
 	struct bio *tbio, *fbio;
+	int vcnt;
 
 
 	atomic_set(&r10_bio->remaining, 1);
 	atomic_set(&r10_bio->remaining, 1);
 
 
@@ -1802,10 +1803,10 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 	first = i;
 	first = i;
 	fbio = r10_bio->devs[i].bio;
 	fbio = r10_bio->devs[i].bio;
 
 
+	vcnt = (r10_bio->sectors + (PAGE_SIZE >> 9) - 1) >> (PAGE_SHIFT - 9);
 	/* now find blocks with errors */
 	/* now find blocks with errors */
 	for (i=0 ; i < conf->copies ; i++) {
 	for (i=0 ; i < conf->copies ; i++) {
 		int  j, d;
 		int  j, d;
-		int vcnt = r10_bio->sectors >> (PAGE_SHIFT-9);
 
 
 		tbio = r10_bio->devs[i].bio;
 		tbio = r10_bio->devs[i].bio;
 
 
@@ -1871,7 +1872,6 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 	 */
 	 */
 	for (i = 0; i < conf->copies; i++) {
 	for (i = 0; i < conf->copies; i++) {
 		int j, d;
 		int j, d;
-		int vcnt = r10_bio->sectors >> (PAGE_SHIFT-9);
 
 
 		tbio = r10_bio->devs[i].repl_bio;
 		tbio = r10_bio->devs[i].repl_bio;
 		if (!tbio || !tbio->bi_end_io)
 		if (!tbio || !tbio->bi_end_io)