err = -EBUSY;
                goto out;
        }
-       if (bdev)
-               sync_blockdev(bdev);
+       if (bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags)) {
+               /* Someone opened the device since we flushed it
+                * so page cache could be dirty and it is too late
+                * to flush.  So abort
+                */
+               mutex_unlock(&mddev->open_mutex);
+               return -EBUSY;
+       }
        if (mddev->pers) {
                __md_stop_writes(mddev);
 
                mutex_unlock(&mddev->open_mutex);
                return -EBUSY;
        }
-       if (bdev)
-               /* It is possible IO was issued on some other
-                * open file which was closed before we took ->open_mutex.
-                * As that was not the last close __blkdev_put will not
-                * have called sync_blockdev, so we must.
+       if (bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags)) {
+               /* Someone opened the device since we flushed it
+                * so page cache could be dirty and it is too late
+                * to flush.  So abort
                 */
-               sync_blockdev(bdev);
-
+               mutex_unlock(&mddev->open_mutex);
+               return -EBUSY;
+       }
        if (mddev->pers) {
                if (mddev->ro)
                        set_disk_ro(disk, 0);
                                                 !test_bit(MD_RECOVERY_NEEDED,
                                                           &mddev->flags),
                                                 msecs_to_jiffies(5000));
+       if (cmd == STOP_ARRAY || cmd == STOP_ARRAY_RO) {
+               /* Need to flush page cache, and ensure no-one else opens
+                * and writes
+                */
+               mutex_lock(&mddev->open_mutex);
+               if (atomic_read(&mddev->openers) > 1) {
+                       mutex_unlock(&mddev->open_mutex);
+                       err = -EBUSY;
+                       goto abort;
+               }
+               set_bit(MD_STILL_CLOSED, &mddev->flags);
+               mutex_unlock(&mddev->open_mutex);
+               sync_blockdev(bdev);
+       }
        err = mddev_lock(mddev);
        if (err) {
                printk(KERN_INFO 
 
        err = 0;
        atomic_inc(&mddev->openers);
+       clear_bit(MD_STILL_CLOSED, &mddev->flags);
        mutex_unlock(&mddev->open_mutex);
 
        check_disk_change(bdev);
 
 #define MD_CHANGE_PENDING 2    /* switch from 'clean' to 'active' in progress */
 #define MD_UPDATE_SB_FLAGS (1 | 2 | 4) /* If these are set, md_update_sb needed */
 #define MD_ARRAY_FIRST_USE 3    /* First use of array, needs initialization */
+#define MD_STILL_CLOSED        4       /* If set, then array has not been opened since
+                                * md_ioctl checked on it.
+                                */
 
        int                             suspended;
        atomic_t                        active_io;