Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[pandora-kernel.git] / drivers / md / md.c
index 9a677f2..1c2f904 100644 (file)
@@ -402,6 +402,7 @@ void mddev_resume(struct mddev *mddev)
        wake_up(&mddev->sb_wait);
        mddev->pers->quiesce(mddev, 0);
 
+       set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        md_wakeup_thread(mddev->thread);
        md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */
 }
@@ -1989,7 +1990,7 @@ super_1_allow_new_offset(struct md_rdev *rdev,
        bitmap = rdev->mddev->bitmap;
        if (bitmap && !rdev->mddev->bitmap_info.file &&
            rdev->sb_start + rdev->mddev->bitmap_info.offset +
-           bitmap->file_pages * (PAGE_SIZE>>9) > new_offset)
+           bitmap->storage.file_pages * (PAGE_SIZE>>9) > new_offset)
                return 0;
        if (rdev->badblocks.sector + rdev->badblocks.size > new_offset)
                return 0;
@@ -3673,10 +3674,8 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
                del_timer_sync(&mddev->safemode_timer);
        }
        pers->run(mddev);
-       mddev_resume(mddev);
        set_bit(MD_CHANGE_DEVS, &mddev->flags);
-       set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-       md_wakeup_thread(mddev->thread);
+       mddev_resume(mddev);
        sysfs_notify(&mddev->kobj, NULL, "level");
        md_new_event(mddev);
        return rv;
@@ -5139,7 +5138,8 @@ int md_run(struct mddev *mddev)
                err = -EINVAL;
                mddev->pers->stop(mddev);
        }
-       if (err == 0 && mddev->pers->sync_request) {
+       if (err == 0 && mddev->pers->sync_request &&
+           (mddev->bitmap_info.file || mddev->bitmap_info.offset)) {
                err = bitmap_create(mddev);
                if (err) {
                        printk(KERN_ERR "%s: failed to create bitmap (%d)\n",
@@ -5648,7 +5648,7 @@ static int get_bitmap_file(struct mddev * mddev, void __user * arg)
                goto out;
 
        /* bitmap disabled, zero the first byte and copy out */
-       if (!mddev->bitmap || !mddev->bitmap->file) {
+       if (!mddev->bitmap || !mddev->bitmap->storage.file) {
                file->pathname[0] = '\0';
                goto copy_out;
        }
@@ -5657,7 +5657,8 @@ static int get_bitmap_file(struct mddev * mddev, void __user * arg)
        if (!buf)
                goto out;
 
-       ptr = d_path(&mddev->bitmap->file->f_path, buf, sizeof(file->pathname));
+       ptr = d_path(&mddev->bitmap->storage.file->f_path,
+                    buf, sizeof(file->pathname));
        if (IS_ERR(ptr))
                goto out;
 
@@ -6151,11 +6152,7 @@ static int update_size(struct mddev *mddev, sector_t num_sectors)
         */
        if (mddev->sync_thread)
                return -EBUSY;
-       if (mddev->bitmap)
-               /* Sorry, cannot grow a bitmap yet, just remove it,
-                * grow, and re-add.
-                */
-               return -EBUSY;
+
        rdev_for_each(rdev, mddev) {
                sector_t avail = rdev->sectors;
 
@@ -6298,7 +6295,7 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
                        /* remove the bitmap */
                        if (!mddev->bitmap)
                                return -ENOENT;
-                       if (mddev->bitmap->file)
+                       if (mddev->bitmap->storage.file)
                                return -EINVAL;
                        mddev->pers->quiesce(mddev, 1);
                        bitmap_destroy(mddev);
@@ -6621,6 +6618,9 @@ static int md_open(struct block_device *bdev, fmode_t mode)
        struct mddev *mddev = mddev_find(bdev->bd_dev);
        int err;
 
+       if (!mddev)
+               return -ENODEV;
+
        if (mddev->gendisk != bdev->bd_disk) {
                /* we are racing with mddev_put which is discarding this
                 * bd_disk.
@@ -7847,7 +7847,7 @@ void md_check_recovery(struct mddev *mddev)
                        goto unlock;
 
                if (mddev->pers->sync_request) {
-                       if (spares && mddev->bitmap && ! mddev->bitmap->file) {
+                       if (spares) {
                                /* We are adding a device or devices to an array
                                 * which has the bitmap stored on all devices.
                                 * So make sure all bitmap pages get written