}
BTRFS_ATTR(devid, error_stats, btrfs_devinfo_error_stats_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);
-
-/*
- * Information about one device.
- *
- * Path: /sys/fs/btrfs/<uuid>/devinfo/<devid>/
- */
static struct attribute *devid_attrs[] = {
BTRFS_ATTR_PTR(devid, error_stats),
BTRFS_ATTR_PTR(devid, in_fs_metadata),
BTRFS_ATTR_PTR(devid, scrub_speed_max),
BTRFS_ATTR_PTR(devid, writeable),
BTRFS_ATTR_PTR(devid, type),
- BTRFS_ATTR_PTR(devid, read_preferred),
NULL
};
ATTRIBUTE_GROUPS(devid);