Whamcloud - gitweb
LU-241 Support crc32c with hardware accelerated instruction as one of lustre checksums
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index abff420..2a0d78a 100644 (file)
@@ -207,10 +207,10 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
 
         /* indicate the features supported by this client */
         data->ocd_connect_flags = OBD_CONNECT_IBITS    | OBD_CONNECT_NODEVOH  |
 
         /* indicate the features supported by this client */
         data->ocd_connect_flags = OBD_CONNECT_IBITS    | OBD_CONNECT_NODEVOH  |
-                                  OBD_CONNECT_JOIN     | OBD_CONNECT_ATTRFID  |
+                                  OBD_CONNECT_ATTRFID  |
                                   OBD_CONNECT_VERSION  | OBD_CONNECT_BRW_SIZE |
                                   OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA |
                                   OBD_CONNECT_VERSION  | OBD_CONNECT_BRW_SIZE |
                                   OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA |
-                                  OBD_CONNECT_CANCELSET| OBD_CONNECT_FID      |
+                                  OBD_CONNECT_CANCELSET | OBD_CONNECT_FID     |
                                   OBD_CONNECT_AT       | OBD_CONNECT_LOV_V3   |
                                   OBD_CONNECT_RMT_CLIENT | OBD_CONNECT_VBR    |
                                   OBD_CONNECT_FULL20   | OBD_CONNECT_64BITHASH;
                                   OBD_CONNECT_AT       | OBD_CONNECT_LOV_V3   |
                                   OBD_CONNECT_RMT_CLIENT | OBD_CONNECT_VBR    |
                                   OBD_CONNECT_FULL20   | OBD_CONNECT_64BITHASH;
@@ -279,6 +279,30 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         if (err)
                 GOTO(out_md_fid, err);
 
         if (err)
                 GOTO(out_md_fid, err);
 
+        /* This needs to be after statfs to ensure connect has finished.
+         * Note that "data" does NOT contain the valid connect reply.
+         * If connecting to a 1.8 server there will be no LMV device, so
+         * we can access the MDC export directly and exp_connect_flags will
+         * be non-zero, but if accessing an upgraded 2.1 server it will
+         * have the correct flags filled in.
+         * XXX: fill in the LMV exp_connect_flags from MDC(s). */
+        valid = sbi->ll_md_exp->exp_connect_flags & CLIENT_CONNECT_MDT_REQD;
+        if (sbi->ll_md_exp->exp_connect_flags != 0 &&
+            valid != CLIENT_CONNECT_MDT_REQD) {
+                char *buf;
+
+                OBD_ALLOC_WAIT(buf, CFS_PAGE_SIZE);
+                obd_connect_flags2str(buf, CFS_PAGE_SIZE,
+                                      valid ^ CLIENT_CONNECT_MDT_REQD, ",");
+                LCONSOLE_ERROR_MSG(0x170, "Server %s does not support "
+                                   "feature(s) needed for correct operation "
+                                   "of this client (%s). Please upgrade "
+                                   "server or downgrade client.\n",
+                                   sbi->ll_md_exp->exp_obd->obd_name, buf);
+                OBD_FREE(buf, CFS_PAGE_SIZE);
+                GOTO(out_md, err = -EPROTO);
+        }
+
         size = sizeof(*data);
         err = obd_get_info(sbi->ll_md_exp, sizeof(KEY_CONN_DATA),
                            KEY_CONN_DATA,  &size, data, NULL);
         size = sizeof(*data);
         err = obd_get_info(sbi->ll_md_exp, sizeof(KEY_CONN_DATA),
                            KEY_CONN_DATA,  &size, data, NULL);
@@ -387,8 +411,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                 if (OBD_FAIL_CHECK(OBD_FAIL_OSC_CKSUM_ADLER_ONLY))
                         data->ocd_cksum_types = OBD_CKSUM_ADLER;
                 else
                 if (OBD_FAIL_CHECK(OBD_FAIL_OSC_CKSUM_ADLER_ONLY))
                         data->ocd_cksum_types = OBD_CKSUM_ADLER;
                 else
-                        /* send the list of supported checksum types */
-                        data->ocd_cksum_types = OBD_CKSUM_ALL;
+                        data->ocd_cksum_types = cksum_types_supported();
         }
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
         }
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
@@ -876,7 +899,8 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
         char  *dt = NULL, *md = NULL;
         char  *profilenm = get_profile_name(sb);
         struct config_llog_instance *cfg;
         char  *dt = NULL, *md = NULL;
         char  *profilenm = get_profile_name(sb);
         struct config_llog_instance *cfg;
-        const int instlen = sizeof(cfg->cfg_instance) * 2 + 1;
+        /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
+        const int instlen = sizeof(cfg->cfg_instance) * 2 + 2;
         int    err;
         ENTRY;
 
         int    err;
         ENTRY;
 
@@ -937,12 +961,12 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
         CDEBUG(D_CONFIG, "Found profile %s: mdc=%s osc=%s\n", profilenm,
                lprof->lp_md, lprof->lp_dt);
 
         CDEBUG(D_CONFIG, "Found profile %s: mdc=%s osc=%s\n", profilenm,
                lprof->lp_md, lprof->lp_dt);
 
-        OBD_ALLOC(dt, strlen(lprof->lp_dt) + instlen);
+        OBD_ALLOC(dt, strlen(lprof->lp_dt) + instlen + 2);
         if (!dt)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(dt, "%s-%p", lprof->lp_dt, cfg->cfg_instance);
 
         if (!dt)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(dt, "%s-%p", lprof->lp_dt, cfg->cfg_instance);
 
-        OBD_ALLOC(md, strlen(lprof->lp_md) + instlen);
+        OBD_ALLOC(md, strlen(lprof->lp_md) + instlen + 2);
         if (!md)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(md, "%s-%p", lprof->lp_md, cfg->cfg_instance);
         if (!md)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(md, "%s-%p", lprof->lp_md, cfg->cfg_instance);
@@ -952,9 +976,9 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
 
 out_free:
         if (md)
 
 out_free:
         if (md)
-                OBD_FREE(md, strlen(lprof->lp_md) + instlen);
+                OBD_FREE(md, strlen(lprof->lp_md) + instlen + 2);
         if (dt)
         if (dt)
-                OBD_FREE(dt, strlen(lprof->lp_dt) + instlen);
+                OBD_FREE(dt, strlen(lprof->lp_dt) + instlen + 2);
         if (err)
                 ll_put_super(sb);
         else
         if (err)
                 ll_put_super(sb);
         else