+
+/**
+ * Return the release version for the Lustre modules, e.g. 2.6.92.
+ *
+ * The "version" file in /proc currently returns only the line:
+ * lustre: 2.8.52
+ *
+ * but in the past it also returned more lines that should be ignored:
+ * kernel: patchless_client
+ * build: v2_6_92_0-gadb3ee4-2.6.32-431.29.2.el6_lustre.g36cd22b.x86_64
+ *
+ * \param version[in,out] buffer to store build version string
+ * \param version_size[in] size of \a version
+ *
+ * \retval 0 on success
+ * \retval -1 on failure, errno set
+ */
+int llapi_get_version_string(char *version, unsigned int version_size)
+{
+ char buffer[4096];
+ char *ptr;
+ int rc;
+
+ if (version == NULL || version_size == 0) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ rc = get_lustre_param_value(NULL, NULL, FILTER_BY_NONE, buffer,
+ "version", sizeof(buffer));
+ if (rc < 0) {
+ errno = -rc;
+ return -1;
+ }
+
+ ptr = strstr(buffer, "lustre:");
+ if (ptr != NULL) {
+ llapi_chomp_string(ptr);
+ ptr += strlen("lustre:");
+ while (*ptr == ' ' || *ptr == '\t')
+ ptr++;
+
+ if (strlcpy(version, ptr, version_size) >= version_size) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ } else {
+ errno = ENODATA;
+ return -1;
+ }
+
+ return 0;
+}
+
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 4, 53, 0)
+/**
+ * Return the build version of the Lustre code.
+ *
+ * The **version argument is pointless, so llapi_get_version_string() is
+ * better to use in the future, but give users a few versions to fix * it.
+ *
+ * \param buffer[in] temporary buffer to hold version string
+ * \param buffer_size[in] length of the \a buffer
+ * \param version[out] pointer to the start of build version string
+ *
+ * \retval 0 on success
+ * \retval -ve errno on failure
+ */
+int llapi_get_version(char *buffer, int buffer_size, char **version)
+{
+ int rc;
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 8, 53, 0)
+ static bool printed;
+ if (!printed) {
+ fprintf(stderr,
+ "%s deprecated, use llapi_get_version_string()\n",
+ __func__);
+ printed = true;
+ }
+#endif
+
+ rc = llapi_get_version_string(buffer, buffer_size);
+ /* keep old return style for this legacy function */
+ if (rc == -1)
+ rc = -errno;
+ else
+ *version = buffer;
+
+ return rc;
+}
+#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 4, 53, 0) */