From d2f9ed4a20b5fae836560efc607e443fa996c2e2 Mon Sep 17 00:00:00 2001 From: Jian Yu <yujian@whamcloud.com> Date: Mon, 23 Jul 2018 15:00:46 -0700 Subject: [PATCH] LU-11115 lod: skip max_create_count=0 OST in QoS and RR algorithms 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> --- lustre/include/lustre/lustre_user.h | 1 + lustre/lod/lod_qos.c | 4 ++++ lustre/osp/osp_precreate.c | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index 1a6b3019da..c014ed7149 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -111,6 +111,7 @@ typedef struct stat64 lstat_t; 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 */ }; diff --git a/lustre/lod/lod_qos.c b/lustre/lod/lod_qos.c index 4a8f9e2922..23865c03b0 100644 --- a/lustre/lod/lod_qos.c +++ b/lustre/lod/lod_qos.c @@ -211,6 +211,10 @@ static int lod_statfs_and_check(const struct lu_env *env, struct lod_device *d, 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? */ diff --git a/lustre/osp/osp_precreate.c b/lustre/osp/osp_precreate.c index cc40e98213..3b0460bff1 100644 --- a/lustre/osp/osp_precreate.c +++ b/lustre/osp/osp_precreate.c @@ -1033,6 +1033,13 @@ void osp_pre_update_status(struct osp_device *d, int rc) 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); -- GitLab