diff --git a/lustre/include/obd.h b/lustre/include/obd.h
index 71f38ad345b87d694054361ab8e93cee8538d6ec..6c911941698c4600645878e850b3b9d63ba8a886 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 ccaeec26209c9dc34f4ac29f583edf32d071e83c..c7f4433e9155f2e2829f951cf154e7c5c866315b 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 c786ff798006c6cf9c4265219af077e09756ee98..4613655efdb4c9e625e8096129eb16530b5ba8c4 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 975a7f5d191620cec350c025832a6fcefe9c5a92..a668c5f5ace5963744af8eb891493fe86a138fcc 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);