}
if (a->curr_state == readonly) {
- /* Well, I'm ready to handle things, so
- * read-auto is OK. FIXME what if we really want
- * readonly ???
+ /* Well, I'm ready to handle things. If readonly
+ * wasn't requested, transition to read-auto.
*/
- get_resync_start(a);
- if (a->resync_start == ~0ULL) {
- a->next_state = read_auto; /* array is clean */
- /* give the metadata a chance to force active if
- * we have some recovery to do. metadata sets
- * resync_start to !MaxSector in this case
- */
- a->container->ss->set_array_state(a, 1);
- }
- if (a->resync_start != ~0ULL) {
- a->container->ss->set_array_state(a, 0);
- a->next_state = active;
+ char buf[64];
+ read_attr(buf, sizeof(buf), a->metadata_fd);
+ if (strncmp(buf, "external:-", 10) == 0) {
+ /* explicit request for readonly array. Leave it alone */
+ ;
+ } else {
+ get_resync_start(a);
+ if (a->container->ss->set_array_state(a, 2))
+ a->next_state = read_auto; /* array is clean */
+ else
+ a->next_state = active; /* Now active for recovery etc */
}
}