From cfa8213327c9ef95f1734f3300b761188d4899a4 Mon Sep 17 00:00:00 2001
From: anserper <anserper>
Date: Mon, 3 Nov 2008 21:17:59 +0000
Subject: [PATCH] b=17493 i=Andreas Dilger i=Johann Lombardi handling of a
 broken readonly key

---
 lustre/include/obd.h     |  3 ++-
 lustre/llite/llite_lib.c | 11 +++++++++++
 lustre/mdc/mdc_request.c |  3 ++-
 lustre/mds/handler.c     |  3 ++-
 4 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/lustre/include/obd.h b/lustre/include/obd.h
index 71f38ad345..6c91194169 100644
--- a/lustre/include/obd.h
+++ b/lustre/include/obd.h
@@ -929,7 +929,8 @@ enum obd_cleanup_stage {
 #define KEY_LAST_ID             "last_id"
 #define KEY_LOCK_TO_STRIPE      "lock_to_stripe"
 #define KEY_CHECKSUM            "checksum"
-#define KEY_READONLY            "readonly"
+#define KEY_READONLY            "read-only"
+#define KEY_READONLY_166COMPAT  "readonly"
 #define KEY_UNLINKED            "unlinked"
 #define KEY_EVICT_BY_NID        "evict_by_nid"
 #define KEY_REGISTER_TARGET     "register_target"
diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
index ccaeec2620..c7f4433e91 100644
--- a/lustre/llite/llite_lib.c
+++ b/lustre/llite/llite_lib.c
@@ -2065,6 +2065,17 @@ int ll_remount_fs(struct super_block *sb, int *flags, char *data)
                 err = obd_set_info_async(sbi->ll_mdc_exp, sizeof(KEY_READONLY),
                                          KEY_READONLY, sizeof(read_only),
                                          &read_only, NULL);
+
+                /* MDS might have expected a different ro key value, b=17493 */
+                if (err == -EINVAL) {
+                        CDEBUG(D_CONFIG, "Retrying remount with 1.6.6 ro key\n");
+                        err = obd_set_info_async(sbi->ll_mdc_exp,
+                                                 sizeof(KEY_READONLY_166COMPAT),
+                                                 KEY_READONLY_166COMPAT,
+                                                 sizeof(read_only),
+                                                 &read_only, NULL);
+                }
+
                 if (err) {
                         CERROR("Failed to change the read-only flag during "
                                "remount: %d\n", err);
diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c
index c786ff7980..4613655efd 100644
--- a/lustre/mdc/mdc_request.c
+++ b/lustre/mdc/mdc_request.c
@@ -935,7 +935,8 @@ int mdc_set_info_async(struct obd_export *exp, obd_count keylen,
                        exp->exp_obd->obd_name, imp->imp_initial_recov_bk);
                 RETURN(0);
         }
-        if (KEY_IS(KEY_READONLY)) {
+        /* Accept the broken "read-only" key for 1.6.6 servers. b=17493 */
+        if (KEY_IS(KEY_READONLY) || KEY_IS(KEY_READONLY_166COMPAT)) {
                 struct ptlrpc_request *req;
                 __u32 size[3] = { sizeof(struct ptlrpc_body), keylen, vallen };
                 char *bufs[3] = { NULL, key, val };
diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c
index 975a7f5d19..a668c5f5ac 100644
--- a/lustre/mds/handler.c
+++ b/lustre/mds/handler.c
@@ -1436,7 +1436,8 @@ static int mds_set_info_rpc(struct obd_export *exp, struct ptlrpc_request *req)
 
         lustre_msg_set_status(req->rq_repmsg, 0);
 
-        if (KEY_IS(KEY_READONLY)) {
+        /* Accept the broken "read-only" key from 1.6.6 clients. b=17493 */
+        if (KEY_IS(KEY_READONLY) || KEY_IS(KEY_READONLY_166COMPAT)) {
                 if (val == NULL || vallen < sizeof(__u32)) {
                         DEBUG_REQ(D_HA, req, "no set_info val");
                         RETURN(-EFAULT);
-- 
GitLab