Message ID | 806bf3aaa5cb0243dd2cea6bb79e5ac9ae347111.1602756068.git.anand.jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | readmirror feature (read_policy sysfs and | expand |
On 10/20/20 10:02 AM, Anand Jain wrote: > Add > > /sys/fs/btrfs/UUID/read_policy > > attribute so that the read policy for the raid1, raid1c34 and raid10 can > be tuned. > > When this attribute is read, it shall show all available policies, with > active policy being with in [ ]. The read_policy attribute can be written > using one of the items listed in there. > > For example: > $cat /sys/fs/btrfs/UUID/read_policy > [pid] > $echo pid > /sys/fs/btrfs/UUID/read_policy > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > rebase on latest misc-next > v5: > Title rename: old: btrfs: sysfs, add read_policy attribute > Uses the btrfs_strmatch() helper (BTRFS_READ_POLICY_NAME_MAX dropped). > Use the table for the policy names. > Rename len to ret. > Use a simple logic to prefix space in btrfs_read_policy_show() > Reviewed-by: Josef Bacik <josef@toxicpanda.com> dropped. > > v4:- > v3: rename [by_pid] to [pid] > v2: v2: check input len before strip and kstrdup > > fs/btrfs/sysfs.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c > index eb0b2bfcce67..07a1a57b2df2 100644 > --- a/fs/btrfs/sysfs.c > +++ b/fs/btrfs/sysfs.c > @@ -886,6 +886,54 @@ static int btrfs_strmatch(const char *given, const char *golden) > return -EINVAL; > } > > +static const char* const btrfs_read_policy_name[] = { "pid" }; This fails checkpatch.pl, it should be static const char * const. Thanks, Josef
>> @@ -886,6 +886,54 @@ static int btrfs_strmatch(const char *given, >> const char *golden) >> return -EINVAL; >> } >> +static const char* const btrfs_read_policy_name[] = { "pid" }; > > This fails checkpatch.pl, it should be > > static const char * const. Thanks, This is taken care in v9. Thanks. Anand > > Josef
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index eb0b2bfcce67..07a1a57b2df2 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -886,6 +886,54 @@ static int btrfs_strmatch(const char *given, const char *golden) return -EINVAL; } +static const char* const btrfs_read_policy_name[] = { "pid" }; + +static ssize_t btrfs_read_policy_show(struct kobject *kobj, + struct kobj_attribute *a, char *buf) +{ + int i; + ssize_t ret = 0; + struct btrfs_fs_devices *fs_devices = to_fs_devs(kobj); + + for (i = 0; i < BTRFS_NR_READ_POLICY; i++) { + if (fs_devices->read_policy == i) + ret += snprintf(buf + ret, PAGE_SIZE - ret, "%s[%s]", + (ret == 0 ? "" : " "), + btrfs_read_policy_name[i]); + else + ret += snprintf(buf + ret, PAGE_SIZE - ret, "%s%s", + (ret == 0 ? "" : " "), + btrfs_read_policy_name[i]); + } + + ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n"); + + return ret; +} + +static ssize_t btrfs_read_policy_store(struct kobject *kobj, + struct kobj_attribute *a, + const char *buf, size_t len) +{ + int i; + struct btrfs_fs_devices *fs_devices = to_fs_devs(kobj); + + for (i = 0; i < BTRFS_NR_READ_POLICY; i++) { + if (btrfs_strmatch(buf, btrfs_read_policy_name[i]) == 0) { + if (i != fs_devices->read_policy) { + fs_devices->read_policy = i; + btrfs_info(fs_devices->fs_info, + "read policy set to '%s'", + btrfs_read_policy_name[i]); + } + return len; + } + } + + return -EINVAL; +} +BTRFS_ATTR_RW(, read_policy, btrfs_read_policy_show, btrfs_read_policy_store); + static const struct attribute *btrfs_attrs[] = { BTRFS_ATTR_PTR(, label), BTRFS_ATTR_PTR(, nodesize), @@ -896,6 +944,7 @@ static const struct attribute *btrfs_attrs[] = { BTRFS_ATTR_PTR(, checksum), BTRFS_ATTR_PTR(, exclusive_operation), BTRFS_ATTR_PTR(, generation), + BTRFS_ATTR_PTR(, read_policy), NULL, };