Commit | Line | Data |
---|---|---|
7a23f890 NB |
1 | #ifndef TARGET_CORE_BACKEND_CONFIGFS_H |
2 | #define TARGET_CORE_BACKEND_CONFIGFS_H | |
3 | ||
4 | #include <target/configfs_macros.h> | |
5 | ||
6 | #define DEF_TB_DEV_ATTRIB_SHOW(_backend, _name) \ | |
7 | static ssize_t _backend##_dev_show_attr_##_name( \ | |
8 | struct se_dev_attrib *da, \ | |
9 | char *page) \ | |
10 | { \ | |
11 | return snprintf(page, PAGE_SIZE, "%u\n", \ | |
12 | (u32)da->da_dev->dev_attrib._name); \ | |
13 | } | |
14 | ||
15 | #define DEF_TB_DEV_ATTRIB_STORE(_backend, _name) \ | |
16 | static ssize_t _backend##_dev_store_attr_##_name( \ | |
17 | struct se_dev_attrib *da, \ | |
18 | const char *page, \ | |
19 | size_t count) \ | |
20 | { \ | |
21 | unsigned long val; \ | |
22 | int ret; \ | |
23 | \ | |
24 | ret = kstrtoul(page, 0, &val); \ | |
25 | if (ret < 0) { \ | |
26 | pr_err("kstrtoul() failed with ret: %d\n", ret); \ | |
27 | return -EINVAL; \ | |
28 | } \ | |
29 | ret = se_dev_set_##_name(da->da_dev, (u32)val); \ | |
30 | \ | |
31 | return (!ret) ? count : -EINVAL; \ | |
32 | } | |
33 | ||
34 | #define DEF_TB_DEV_ATTRIB(_backend, _name) \ | |
35 | DEF_TB_DEV_ATTRIB_SHOW(_backend, _name); \ | |
36 | DEF_TB_DEV_ATTRIB_STORE(_backend, _name); | |
37 | ||
38 | #define DEF_TB_DEV_ATTRIB_RO(_backend, name) \ | |
39 | DEF_TB_DEV_ATTRIB_SHOW(_backend, name); | |
40 | ||
41 | CONFIGFS_EATTR_STRUCT(target_backend_dev_attrib, se_dev_attrib); | |
42 | #define TB_DEV_ATTR(_backend, _name, _mode) \ | |
43 | static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \ | |
44 | __CONFIGFS_EATTR(_name, _mode, \ | |
45 | _backend##_dev_show_attr_##_name, \ | |
46 | _backend##_dev_store_attr_##_name); | |
47 | ||
48 | #define TB_DEV_ATTR_RO(_backend, _name) \ | |
49 | static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \ | |
50 | __CONFIGFS_EATTR_RO(_name, \ | |
51 | _backend##_dev_show_attr_##_name); | |
52 | ||
e6c39f70 NB |
53 | /* |
54 | * Default list of target backend device attributes as defined by | |
55 | * struct se_dev_attrib | |
56 | */ | |
57 | ||
58 | #define DEF_TB_DEFAULT_ATTRIBS(_backend) \ | |
59 | DEF_TB_DEV_ATTRIB(_backend, emulate_model_alias); \ | |
60 | TB_DEV_ATTR(_backend, emulate_model_alias, S_IRUGO | S_IWUSR); \ | |
61 | DEF_TB_DEV_ATTRIB(_backend, emulate_dpo); \ | |
62 | TB_DEV_ATTR(_backend, emulate_dpo, S_IRUGO | S_IWUSR); \ | |
63 | DEF_TB_DEV_ATTRIB(_backend, emulate_fua_write); \ | |
64 | TB_DEV_ATTR(_backend, emulate_fua_write, S_IRUGO | S_IWUSR); \ | |
65 | DEF_TB_DEV_ATTRIB(_backend, emulate_fua_read); \ | |
66 | TB_DEV_ATTR(_backend, emulate_fua_read, S_IRUGO | S_IWUSR); \ | |
67 | DEF_TB_DEV_ATTRIB(_backend, emulate_write_cache); \ | |
68 | TB_DEV_ATTR(_backend, emulate_write_cache, S_IRUGO | S_IWUSR); \ | |
69 | DEF_TB_DEV_ATTRIB(_backend, emulate_ua_intlck_ctrl); \ | |
70 | TB_DEV_ATTR(_backend, emulate_ua_intlck_ctrl, S_IRUGO | S_IWUSR); \ | |
71 | DEF_TB_DEV_ATTRIB(_backend, emulate_tas); \ | |
72 | TB_DEV_ATTR(_backend, emulate_tas, S_IRUGO | S_IWUSR); \ | |
73 | DEF_TB_DEV_ATTRIB(_backend, emulate_tpu); \ | |
74 | TB_DEV_ATTR(_backend, emulate_tpu, S_IRUGO | S_IWUSR); \ | |
75 | DEF_TB_DEV_ATTRIB(_backend, emulate_tpws); \ | |
76 | TB_DEV_ATTR(_backend, emulate_tpws, S_IRUGO | S_IWUSR); \ | |
77 | DEF_TB_DEV_ATTRIB(_backend, emulate_caw); \ | |
78 | TB_DEV_ATTR(_backend, emulate_caw, S_IRUGO | S_IWUSR); \ | |
79 | DEF_TB_DEV_ATTRIB(_backend, emulate_3pc); \ | |
80 | TB_DEV_ATTR(_backend, emulate_3pc, S_IRUGO | S_IWUSR); \ | |
81 | DEF_TB_DEV_ATTRIB(_backend, pi_prot_type); \ | |
82 | TB_DEV_ATTR(_backend, pi_prot_type, S_IRUGO | S_IWUSR); \ | |
83 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_pi_prot_type); \ | |
84 | TB_DEV_ATTR_RO(_backend, hw_pi_prot_type); \ | |
85 | DEF_TB_DEV_ATTRIB(_backend, pi_prot_format); \ | |
86 | TB_DEV_ATTR(_backend, pi_prot_format, S_IRUGO | S_IWUSR); \ | |
87 | DEF_TB_DEV_ATTRIB(_backend, enforce_pr_isids); \ | |
88 | TB_DEV_ATTR(_backend, enforce_pr_isids, S_IRUGO | S_IWUSR); \ | |
89 | DEF_TB_DEV_ATTRIB(_backend, is_nonrot); \ | |
90 | TB_DEV_ATTR(_backend, is_nonrot, S_IRUGO | S_IWUSR); \ | |
91 | DEF_TB_DEV_ATTRIB(_backend, emulate_rest_reord); \ | |
92 | TB_DEV_ATTR(_backend, emulate_rest_reord, S_IRUGO | S_IWUSR); \ | |
93 | DEF_TB_DEV_ATTRIB(_backend, force_pr_aptpl); \ | |
94 | TB_DEV_ATTR(_backend, force_pr_aptpl, S_IRUGO | S_IWUSR); \ | |
95 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_block_size); \ | |
96 | TB_DEV_ATTR_RO(_backend, hw_block_size); \ | |
97 | DEF_TB_DEV_ATTRIB(_backend, block_size); \ | |
98 | TB_DEV_ATTR(_backend, block_size, S_IRUGO | S_IWUSR); \ | |
99 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_max_sectors); \ | |
100 | TB_DEV_ATTR_RO(_backend, hw_max_sectors); \ | |
e6c39f70 NB |
101 | DEF_TB_DEV_ATTRIB(_backend, optimal_sectors); \ |
102 | TB_DEV_ATTR(_backend, optimal_sectors, S_IRUGO | S_IWUSR); \ | |
103 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_queue_depth); \ | |
104 | TB_DEV_ATTR_RO(_backend, hw_queue_depth); \ | |
105 | DEF_TB_DEV_ATTRIB(_backend, queue_depth); \ | |
106 | TB_DEV_ATTR(_backend, queue_depth, S_IRUGO | S_IWUSR); \ | |
107 | DEF_TB_DEV_ATTRIB(_backend, max_unmap_lba_count); \ | |
108 | TB_DEV_ATTR(_backend, max_unmap_lba_count, S_IRUGO | S_IWUSR); \ | |
109 | DEF_TB_DEV_ATTRIB(_backend, max_unmap_block_desc_count); \ | |
110 | TB_DEV_ATTR(_backend, max_unmap_block_desc_count, S_IRUGO | S_IWUSR); \ | |
111 | DEF_TB_DEV_ATTRIB(_backend, unmap_granularity); \ | |
112 | TB_DEV_ATTR(_backend, unmap_granularity, S_IRUGO | S_IWUSR); \ | |
113 | DEF_TB_DEV_ATTRIB(_backend, unmap_granularity_alignment); \ | |
114 | TB_DEV_ATTR(_backend, unmap_granularity_alignment, S_IRUGO | S_IWUSR); \ | |
115 | DEF_TB_DEV_ATTRIB(_backend, max_write_same_len); \ | |
116 | TB_DEV_ATTR(_backend, max_write_same_len, S_IRUGO | S_IWUSR); | |
117 | ||
7a23f890 | 118 | #endif /* TARGET_CORE_BACKEND_CONFIGFS_H */ |