|
@@ -3564,6 +3564,8 @@ static int get_bitmap_file(mddev_t * mddev, void __user * arg)
|
|
char *ptr, *buf = NULL;
|
|
char *ptr, *buf = NULL;
|
|
int err = -ENOMEM;
|
|
int err = -ENOMEM;
|
|
|
|
|
|
|
|
+ md_allow_write(mddev);
|
|
|
|
+
|
|
file = kmalloc(sizeof(*file), GFP_KERNEL);
|
|
file = kmalloc(sizeof(*file), GFP_KERNEL);
|
|
if (!file)
|
|
if (!file)
|
|
goto out;
|
|
goto out;
|
|
@@ -5032,6 +5034,33 @@ void md_write_end(mddev_t *mddev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* md_allow_write(mddev)
|
|
|
|
+ * Calling this ensures that the array is marked 'active' so that writes
|
|
|
|
+ * may proceed without blocking. It is important to call this before
|
|
|
|
+ * attempting a GFP_KERNEL allocation while holding the mddev lock.
|
|
|
|
+ * Must be called with mddev_lock held.
|
|
|
|
+ */
|
|
|
|
+void md_allow_write(mddev_t *mddev)
|
|
|
|
+{
|
|
|
|
+ if (!mddev->pers)
|
|
|
|
+ return;
|
|
|
|
+ if (mddev->ro)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ spin_lock_irq(&mddev->write_lock);
|
|
|
|
+ if (mddev->in_sync) {
|
|
|
|
+ mddev->in_sync = 0;
|
|
|
|
+ set_bit(MD_CHANGE_CLEAN, &mddev->flags);
|
|
|
|
+ if (mddev->safemode_delay &&
|
|
|
|
+ mddev->safemode == 0)
|
|
|
|
+ mddev->safemode = 1;
|
|
|
|
+ spin_unlock_irq(&mddev->write_lock);
|
|
|
|
+ md_update_sb(mddev, 0);
|
|
|
|
+ } else
|
|
|
|
+ spin_unlock_irq(&mddev->write_lock);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(md_allow_write);
|
|
|
|
+
|
|
static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
|
|
static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
|
|
|
|
|
|
#define SYNC_MARKS 10
|
|
#define SYNC_MARKS 10
|