Merge tag 'pwm/for-4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry...
[linux-2.6-microblaze.git] / drivers / md / md.c
index b01e458..08fcaeb 100644 (file)
@@ -422,7 +422,7 @@ static void submit_flushes(struct work_struct *ws)
                        bi = bio_alloc_mddev(GFP_NOIO, 0, mddev);
                        bi->bi_end_io = md_end_flush;
                        bi->bi_private = rdev;
-                       bi->bi_bdev = rdev->bdev;
+                       bio_set_dev(bi, rdev->bdev);
                        bi->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
                        atomic_inc(&mddev->flush_pending);
                        submit_bio(bi);
@@ -772,7 +772,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
 
        atomic_inc(&rdev->nr_pending);
 
-       bio->bi_bdev = rdev->meta_bdev ? rdev->meta_bdev : rdev->bdev;
+       bio_set_dev(bio, rdev->meta_bdev ? rdev->meta_bdev : rdev->bdev);
        bio->bi_iter.bi_sector = sector;
        bio_add_page(bio, page, size, 0);
        bio->bi_private = rdev;
@@ -803,8 +803,10 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
        struct bio *bio = md_bio_alloc_sync(rdev->mddev);
        int ret;
 
-       bio->bi_bdev = (metadata_op && rdev->meta_bdev) ?
-               rdev->meta_bdev : rdev->bdev;
+       if (metadata_op && rdev->meta_bdev)
+               bio_set_dev(bio, rdev->meta_bdev);
+       else
+               bio_set_dev(bio, rdev->bdev);
        bio_set_op_attrs(bio, op, op_flags);
        if (metadata_op)
                bio->bi_iter.bi_sector = sector + rdev->sb_start;
@@ -1536,7 +1538,8 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
        } else if (sb->bblog_offset != 0)
                rdev->badblocks.shift = 0;
 
-       if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
+       if ((le32_to_cpu(sb->feature_map) &
+           (MD_FEATURE_PPL | MD_FEATURE_MULTIPLE_PPLS))) {
                rdev->ppl.offset = (__s16)le16_to_cpu(sb->ppl.offset);
                rdev->ppl.size = le16_to_cpu(sb->ppl.size);
                rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
@@ -1655,10 +1658,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
                if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
                        set_bit(MD_HAS_JOURNAL, &mddev->flags);
 
-               if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
+               if (le32_to_cpu(sb->feature_map) &
+                   (MD_FEATURE_PPL | MD_FEATURE_MULTIPLE_PPLS)) {
                        if (le32_to_cpu(sb->feature_map) &
                            (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_JOURNAL))
                                return -EINVAL;
+                       if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) &&
+                           (le32_to_cpu(sb->feature_map) &
+                                           MD_FEATURE_MULTIPLE_PPLS))
+                               return -EINVAL;
                        set_bit(MD_HAS_PPL, &mddev->flags);
                }
        } else if (mddev->pers == NULL) {
@@ -1875,7 +1883,11 @@ retry:
                sb->feature_map |= cpu_to_le32(MD_FEATURE_JOURNAL);
 
        if (test_bit(MD_HAS_PPL, &mddev->flags)) {
-               sb->feature_map |= cpu_to_le32(MD_FEATURE_PPL);
+               if (test_bit(MD_HAS_MULTIPLE_PPLS, &mddev->flags))
+                       sb->feature_map |=
+                           cpu_to_le32(MD_FEATURE_MULTIPLE_PPLS);
+               else
+                       sb->feature_map |= cpu_to_le32(MD_FEATURE_PPL);
                sb->ppl.offset = cpu_to_le16(rdev->ppl.offset);
                sb->ppl.size = cpu_to_le16(rdev->ppl.size);
        }
@@ -4283,6 +4295,8 @@ new_dev_store(struct mddev *mddev, const char *buf, size_t len)
        if (err)
                export_rdev(rdev);
        mddev_unlock(mddev);
+       if (!err)
+               md_new_event(mddev);
        return err ? err : len;
 }
 
@@ -7836,7 +7850,7 @@ static const struct file_operations md_seq_fops = {
        .open           = md_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
-       .release        = seq_release_private,
+       .release        = seq_release,
        .poll           = mdstat_poll,
 };