Message ID | 151811057c559d9212c7fc55e9c9cbbad1f62f05.1611114341.git.anand.jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: read_policy types latency, device and round-robin | expand |
On 20/1/21 3:52 pm, Anand Jain wrote: > This is a preparatory patch and introduces a new device flag > 'read_preferred', RW-able using sysfs interface. > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > v4: - There is rb from Josef for this patch in v3. Could you please add it? Thanks, Anand > v2: C style fixes. Drop space in between '! test_bit' and extra lines > after it. > > fs/btrfs/sysfs.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ > fs/btrfs/volumes.h | 1 + > 2 files changed, 54 insertions(+) > > diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c > index 7c0324fe97b2..5888e15e3d14 100644 > --- a/fs/btrfs/sysfs.c > +++ b/fs/btrfs/sysfs.c > @@ -1422,11 +1422,64 @@ static ssize_t btrfs_devinfo_writeable_show(struct kobject *kobj, > } > BTRFS_ATTR(devid, writeable, btrfs_devinfo_writeable_show); > > +static ssize_t btrfs_devinfo_read_pref_show(struct kobject *kobj, > + struct kobj_attribute *a, char *buf) > +{ > + int val; > + struct btrfs_device *device = container_of(kobj, struct btrfs_device, > + devid_kobj); > + > + val = !!test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); > + > + return snprintf(buf, PAGE_SIZE, "%d\n", val); > +} > + > +static ssize_t btrfs_devinfo_read_pref_store(struct kobject *kobj, > + struct kobj_attribute *a, > + const char *buf, size_t len) > +{ > + int ret; > + unsigned long val; > + struct btrfs_device *device; > + > + ret = kstrtoul(skip_spaces(buf), 0, &val); > + if (ret) > + return ret; > + > + if (val != 0 && val != 1) > + return -EINVAL; > + > + /* > + * lock is not required, the btrfs_device struct can't be freed while > + * its kobject btrfs_device::devid_kobj is still open. > + */ > + device = container_of(kobj, struct btrfs_device, devid_kobj); > + > + if (val && > + !test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { > + set_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); > + btrfs_info(device->fs_devices->fs_info, > + "set read preferred on devid %llu (%d)", > + device->devid, task_pid_nr(current)); > + } else if (!val && > + test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { > + clear_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); > + btrfs_info(device->fs_devices->fs_info, > + "reset read preferred on devid %llu (%d)", > + device->devid, task_pid_nr(current)); > + } > + > + return len; > +} > +BTRFS_ATTR_RW(devid, read_preferred, btrfs_devinfo_read_pref_show, > + btrfs_devinfo_read_pref_store); > + > static struct attribute *devid_attrs[] = { > BTRFS_ATTR_PTR(devid, in_fs_metadata), > BTRFS_ATTR_PTR(devid, missing), > BTRFS_ATTR_PTR(devid, replace_target), > BTRFS_ATTR_PTR(devid, writeable), > + BTRFS_ATTR_PTR(devid, read_preferred), > NULL > }; > ATTRIBUTE_GROUPS(devid); > diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h > index 71ba1f0e93f4..ea786864b903 100644 > --- a/fs/btrfs/volumes.h > +++ b/fs/btrfs/volumes.h > @@ -51,6 +51,7 @@ struct btrfs_io_geometry { > #define BTRFS_DEV_STATE_REPLACE_TGT (3) > #define BTRFS_DEV_STATE_FLUSH_SENT (4) > #define BTRFS_DEV_STATE_NO_READA (5) > +#define BTRFS_DEV_STATE_READ_PREFERRED (6) > > struct btrfs_zoned_device_info; > >
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 7c0324fe97b2..5888e15e3d14 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -1422,11 +1422,64 @@ static ssize_t btrfs_devinfo_writeable_show(struct kobject *kobj, } BTRFS_ATTR(devid, writeable, btrfs_devinfo_writeable_show); +static ssize_t btrfs_devinfo_read_pref_show(struct kobject *kobj, + struct kobj_attribute *a, char *buf) +{ + int val; + struct btrfs_device *device = container_of(kobj, struct btrfs_device, + devid_kobj); + + val = !!test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t btrfs_devinfo_read_pref_store(struct kobject *kobj, + struct kobj_attribute *a, + const char *buf, size_t len) +{ + int ret; + unsigned long val; + struct btrfs_device *device; + + ret = kstrtoul(skip_spaces(buf), 0, &val); + if (ret) + return ret; + + if (val != 0 && val != 1) + return -EINVAL; + + /* + * lock is not required, the btrfs_device struct can't be freed while + * its kobject btrfs_device::devid_kobj is still open. + */ + device = container_of(kobj, struct btrfs_device, devid_kobj); + + if (val && + !test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { + set_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + btrfs_info(device->fs_devices->fs_info, + "set read preferred on devid %llu (%d)", + device->devid, task_pid_nr(current)); + } else if (!val && + test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { + clear_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + btrfs_info(device->fs_devices->fs_info, + "reset read preferred on devid %llu (%d)", + device->devid, task_pid_nr(current)); + } + + return len; +} +BTRFS_ATTR_RW(devid, read_preferred, btrfs_devinfo_read_pref_show, + btrfs_devinfo_read_pref_store); + static struct attribute *devid_attrs[] = { BTRFS_ATTR_PTR(devid, in_fs_metadata), BTRFS_ATTR_PTR(devid, missing), BTRFS_ATTR_PTR(devid, replace_target), BTRFS_ATTR_PTR(devid, writeable), + BTRFS_ATTR_PTR(devid, read_preferred), NULL }; ATTRIBUTE_GROUPS(devid); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 71ba1f0e93f4..ea786864b903 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -51,6 +51,7 @@ struct btrfs_io_geometry { #define BTRFS_DEV_STATE_REPLACE_TGT (3) #define BTRFS_DEV_STATE_FLUSH_SENT (4) #define BTRFS_DEV_STATE_NO_READA (5) +#define BTRFS_DEV_STATE_READ_PREFERRED (6) struct btrfs_zoned_device_info;
This is a preparatory patch and introduces a new device flag 'read_preferred', RW-able using sysfs interface. Signed-off-by: Anand Jain <anand.jain@oracle.com> --- v4: - v2: C style fixes. Drop space in between '! test_bit' and extra lines after it. fs/btrfs/sysfs.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ fs/btrfs/volumes.h | 1 + 2 files changed, 54 insertions(+)