+static ssize_t dom_stripesize_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
+{
+ struct dt_device *dt = container_of(kobj, struct dt_device, dd_kobj);
+ struct lod_device *lod = dt2lod_dev(dt);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ lod->lod_dom_stripesize_max_kb << 10);
+}
+
+static inline int dom_stripesize_max_kb_update(struct lod_device *lod,
+ __u64 val)
+{
+ /* 1GB is the limit */
+ if (val > (1ULL << 20))
+ return -ERANGE;
+
+ if (val > 0) {
+ if (val < LOD_DOM_MIN_SIZE_KB) {
+ LCONSOLE_INFO("Increasing provided stripe size to a minimum value %u\n",
+ LOD_DOM_MIN_SIZE_KB);
+ val = LOD_DOM_MIN_SIZE_KB;
+ } else if (val & (LOD_DOM_MIN_SIZE_KB - 1)) {
+ val &= ~(LOD_DOM_MIN_SIZE_KB - 1);
+ LCONSOLE_WARN("Changing provided stripe size to %llu (a multiple of minimum %u)\n",
+ val, LOD_DOM_MIN_SIZE_KB);
+ }
+ }
+ spin_lock(&lod->lod_lsfs_lock);
+ lod->lod_dom_stripesize_max_kb = val;
+ lod_dom_stripesize_recalc(lod);
+ spin_unlock(&lod->lod_lsfs_lock);
+ return 0;
+}
+
+static ssize_t dom_stripesize_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct dt_device *dt = container_of(kobj, struct dt_device, dd_kobj);
+ struct lod_device *lod = dt2lod_dev(dt);
+ u64 val;
+ int rc;
+
+ rc = sysfs_memparse(buffer, count, &val, "B");
+ if (rc < 0)
+ return rc;
+
+ rc = dom_stripesize_max_kb_update(lod, val >> 10);
+ if (rc)
+ return rc;
+ return count;
+}
+
+/* Old attribute name is still supported */
+LUSTRE_RW_ATTR(dom_stripesize);
+