@@ -355,7 +355,59 @@ static ssize_t supported_checksums_show(struct kobject *kobj,
#endif
+#define readmirror_to_fs_devices(_kobj) to_fs_devs((_kobj)->parent)
+/*
+ * Set the readmirror type to BTRFS_READMIRROR_BY_PID
+ */
+static ssize_t btrfs_sysfs_readmirror_by_pid_store(struct kobject *kobj,
+ struct kobj_attribute *a,
+ const char *buf, size_t count)
+{
+ int ret;
+ unsigned long val;
+ struct btrfs_fs_devices *fs_devices;
+
+ fs_devices = readmirror_to_fs_devices(kobj);
+
+ ret = kstrtoul(skip_spaces(buf), 0, &val);
+ if (ret)
+ return ret;
+
+ switch (val) {
+ case 0:
+ fs_devices->readmirror = BTRFS_READMIRROR_DEFAULT;
+ break;
+ case 1:
+ fs_devices->readmirror = BTRFS_READMIRROR_BY_PID;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return count;
+}
+
+static ssize_t btrfs_sysfs_readmirror_by_pid_show(struct kobject *kobj,
+ struct kobj_attribute *a,
+ char *buf)
+{
+ int val;
+ struct btrfs_fs_devices *fs_devices;
+
+ fs_devices = readmirror_to_fs_devices(kobj);
+
+ if (fs_devices->readmirror == BTRFS_READMIRROR_BY_PID)
+ val = 1;
+ else
+ val = 0;
+
+ return snprintf(buf, PAGE_SIZE, "%d\n", val);
+}
+BTRFS_ATTR_RW(readmirror, by_pid, btrfs_sysfs_readmirror_by_pid_show,
+ btrfs_sysfs_readmirror_by_pid_store);
+
static const struct attribute *btrfs_readmirror_attrs[] = {
+ BTRFS_ATTR_PTR(readmirror, by_pid),
NULL,
};
Add existing %pid based readmirror policy as an attribute /sys/fs/btrfs/UUID/readmirror/by_pid When read, this returns 0 or 1. 1 indicates currently active policy. When written with 1, it sets by_pid as the current active policy and when written 0 it resets to the default readmirror policy, which as of now is pid as well. For any other value returns EINVAL. Signed-off-by: Anand Jain <anand.jain@oracle.com> --- v2: fs_devs::readmirror is no more atomic_t so update accordingly. fs/btrfs/sysfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)