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