}
LUSTRE_WO_ATTR(idle_connect);
+static ssize_t grant_shrink_show(struct kobject *kobj, struct attribute *attr,
+ char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct client_obd *cli = &obd->u.cli;
+ struct obd_connect_data *ocd;
+ ssize_t len;
+
+ LPROCFS_CLIMP_CHECK(obd);
+ ocd = &cli->cl_import->imp_connect_data;
+
+ len = snprintf(buf, PAGE_SIZE, "%d\n",
+ !!OCD_HAS_FLAG(ocd, GRANT_SHRINK));
+ LPROCFS_CLIMP_EXIT(obd);
+
+ return len;
+}
+
+static ssize_t grant_shrink_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *dev = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct client_obd *cli = &dev->u.cli;
+ struct obd_connect_data *ocd;
+ bool val;
+ int rc;
+
+ if (dev == NULL)
+ return 0;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ LPROCFS_CLIMP_CHECK(dev);
+ ocd = &cli->cl_import->imp_connect_data;
+
+ if (!val) {
+ if (OCD_HAS_FLAG(ocd, GRANT_SHRINK))
+ ocd->ocd_connect_flags &= ~OBD_CONNECT_GRANT_SHRINK;
+ } else {
+ /**
+ * server replied obd_connect_data is always bigger, so
+ * client's imp_connect_flags_orig are always supported
+ * by the server
+ */
+ if (!OCD_HAS_FLAG(ocd, GRANT_SHRINK) &&
+ cli->cl_import->imp_connect_flags_orig &
+ OBD_CONNECT_GRANT_SHRINK)
+ ocd->ocd_connect_flags |= OBD_CONNECT_GRANT_SHRINK;
+ }
+
+ LPROCFS_CLIMP_EXIT(dev);
+
+ return count;
+}
+LUSTRE_RW_ATTR(grant_shrink);
+
LPROC_SEQ_FOPS_RO_TYPE(osc, connect_flags);
LPROC_SEQ_FOPS_RO_TYPE(osc, server_uuid);
LPROC_SEQ_FOPS_RO_TYPE(osc, timeouts);
&lustre_attr_ping.attr,
&lustre_attr_idle_timeout.attr,
&lustre_attr_idle_connect.attr,
+ &lustre_attr_grant_shrink.attr,
NULL,
};