Handle the osfs->os_state values as flags instead of as values.
Otherwise, if an OSD has OS_STATE_DEGRADED and another flag set
it will not match to skip the OST during object allocation.
Similarly, there was no check for the OS_STATE_READONLY flag in
the create path, which should be used to always skip an OST for
object creation until it is cleared.
These flags are not yet set by osd-zfs, only by osd-ldiskfs so far.
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Change-Id: I0ef59a9fd631a6942d963e37cfce2bfe183ebbe5
Reviewed-on: http://review.whamcloud.com/8378
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
if (rc && rc != -ENOTCONN)
CERROR("%s: statfs: rc = %d\n", lod2obd(d)->obd_name, rc);
+ /* If the OST is readonly then we can't allocate objects there */
+ if (sfs->os_state & OS_STATE_READONLY)
+ rc = -EROFS;
+
/* check whether device has changed state (active, inactive) */
if (rc != 0 && ost->ltd_active) {
/* turned inactive? */
/*
* try to use another OSP if this one is degraded
*/
- if (sfs->os_state == OS_STATE_DEGRADED && speed < 2) {
+ if (sfs->os_state & OS_STATE_DEGRADED && speed < 2) {
QOS_DEBUG("#%d: degraded\n", ost_idx);
continue;
}