While choosing OST to create object, both lod_alloc_qos() and
lod_alloc_rr() functions use lod_statfs_and_check() function
to check whether the OST is available for new OST objects or not.
However, OST with max_create_count=0 is not checked in that
function and just returned as an available OST.
This patch fixes the above issue by detecting OST with
max_create_count=0 in lod_statfs_and_check() and skip it.
Change-Id: Ic2129b483ead16f8971a062e326d5ecd537b7e6c
Signed-off-by: Jian Yu <yujian@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32859
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: John L. Hammond <jhammond@whamcloud.com>
enum obd_statfs_state {
OS_STATE_DEGRADED = 0x00000001, /**< RAID degraded/rebuilding */
OS_STATE_READONLY = 0x00000002, /**< filesystem is read-only */
+ OS_STATE_NOPRECREATE = 0x00000004, /**< no object precreation */
OS_STATE_ENOSPC = 0x00000020, /**< not enough free space */
OS_STATE_ENOINO = 0x00000040, /**< not enough inodes */
};
if (sfs->os_state & OS_STATE_READONLY)
rc = -EROFS;
+ /* object precreation is skipped on the OST with max_create_count=0 */
+ if (sfs->os_state & OS_STATE_NOPRECREATE)
+ rc = -ENOBUFS;
+
/* check whether device has changed state (active, inactive) */
if (rc != 0 && ost->ltd_active) {
/* turned inactive? */
available, d->opd_reserved_mb_low,
d->opd_pre_status, rc);
}
+
+ /* Object precreation is skipped on the OST with
+ * max_create_count=0. */
+ if (d->opd_pre_max_create_count == 0)
+ msfs->os_state |= OS_STATE_NOPRECREATE;
+ else
+ msfs->os_state &= ~OS_STATE_NOPRECREATE;
}
out:
wake_up(&d->opd_pre_user_waitq);