diff options
Diffstat (limited to 'fs/debugfs/file.c')
| -rw-r--r-- | fs/debugfs/file.c | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 33a90120f6ad..4d74fc72c195 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
| @@ -67,6 +67,8 @@ static int debugfs_u8_get(void *data, u64 *val) | |||
| 67 | return 0; | 67 | return 0; |
| 68 | } | 68 | } |
| 69 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); | 69 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); |
| 70 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); | ||
| 71 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); | ||
| 70 | 72 | ||
| 71 | /** | 73 | /** |
| 72 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value | 74 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value |
| @@ -95,6 +97,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); | |||
| 95 | struct dentry *debugfs_create_u8(const char *name, mode_t mode, | 97 | struct dentry *debugfs_create_u8(const char *name, mode_t mode, |
| 96 | struct dentry *parent, u8 *value) | 98 | struct dentry *parent, u8 *value) |
| 97 | { | 99 | { |
| 100 | /* if there are no write bits set, make read only */ | ||
| 101 | if (!(mode & S_IWUGO)) | ||
| 102 | return debugfs_create_file(name, mode, parent, value, &fops_u8_ro); | ||
| 103 | /* if there are no read bits set, make write only */ | ||
| 104 | if (!(mode & S_IRUGO)) | ||
| 105 | return debugfs_create_file(name, mode, parent, value, &fops_u8_wo); | ||
| 106 | |||
| 98 | return debugfs_create_file(name, mode, parent, value, &fops_u8); | 107 | return debugfs_create_file(name, mode, parent, value, &fops_u8); |
| 99 | } | 108 | } |
| 100 | EXPORT_SYMBOL_GPL(debugfs_create_u8); | 109 | EXPORT_SYMBOL_GPL(debugfs_create_u8); |
| @@ -110,6 +119,8 @@ static int debugfs_u16_get(void *data, u64 *val) | |||
| 110 | return 0; | 119 | return 0; |
| 111 | } | 120 | } |
| 112 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); | 121 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); |
| 122 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); | ||
| 123 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); | ||
| 113 | 124 | ||
| 114 | /** | 125 | /** |
| 115 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value | 126 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value |
| @@ -138,6 +149,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); | |||
| 138 | struct dentry *debugfs_create_u16(const char *name, mode_t mode, | 149 | struct dentry *debugfs_create_u16(const char *name, mode_t mode, |
| 139 | struct dentry *parent, u16 *value) | 150 | struct dentry *parent, u16 *value) |
| 140 | { | 151 | { |
| 152 | /* if there are no write bits set, make read only */ | ||
| 153 | if (!(mode & S_IWUGO)) | ||
| 154 | return debugfs_create_file(name, mode, parent, value, &fops_u16_ro); | ||
| 155 | /* if there are no read bits set, make write only */ | ||
| 156 | if (!(mode & S_IRUGO)) | ||
| 157 | return debugfs_create_file(name, mode, parent, value, &fops_u16_wo); | ||
| 158 | |||
| 141 | return debugfs_create_file(name, mode, parent, value, &fops_u16); | 159 | return debugfs_create_file(name, mode, parent, value, &fops_u16); |
| 142 | } | 160 | } |
| 143 | EXPORT_SYMBOL_GPL(debugfs_create_u16); | 161 | EXPORT_SYMBOL_GPL(debugfs_create_u16); |
| @@ -153,6 +171,8 @@ static int debugfs_u32_get(void *data, u64 *val) | |||
| 153 | return 0; | 171 | return 0; |
| 154 | } | 172 | } |
| 155 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); | 173 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); |
| 174 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); | ||
| 175 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); | ||
| 156 | 176 | ||
| 157 | /** | 177 | /** |
| 158 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value | 178 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value |
| @@ -181,6 +201,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); | |||
| 181 | struct dentry *debugfs_create_u32(const char *name, mode_t mode, | 201 | struct dentry *debugfs_create_u32(const char *name, mode_t mode, |
| 182 | struct dentry *parent, u32 *value) | 202 | struct dentry *parent, u32 *value) |
| 183 | { | 203 | { |
| 204 | /* if there are no write bits set, make read only */ | ||
| 205 | if (!(mode & S_IWUGO)) | ||
| 206 | return debugfs_create_file(name, mode, parent, value, &fops_u32_ro); | ||
| 207 | /* if there are no read bits set, make write only */ | ||
| 208 | if (!(mode & S_IRUGO)) | ||
| 209 | return debugfs_create_file(name, mode, parent, value, &fops_u32_wo); | ||
| 210 | |||
| 184 | return debugfs_create_file(name, mode, parent, value, &fops_u32); | 211 | return debugfs_create_file(name, mode, parent, value, &fops_u32); |
| 185 | } | 212 | } |
| 186 | EXPORT_SYMBOL_GPL(debugfs_create_u32); | 213 | EXPORT_SYMBOL_GPL(debugfs_create_u32); |
| @@ -197,6 +224,8 @@ static int debugfs_u64_get(void *data, u64 *val) | |||
| 197 | return 0; | 224 | return 0; |
| 198 | } | 225 | } |
| 199 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); | 226 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); |
| 227 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); | ||
| 228 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); | ||
| 200 | 229 | ||
| 201 | /** | 230 | /** |
| 202 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value | 231 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value |
| @@ -225,15 +254,28 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); | |||
| 225 | struct dentry *debugfs_create_u64(const char *name, mode_t mode, | 254 | struct dentry *debugfs_create_u64(const char *name, mode_t mode, |
| 226 | struct dentry *parent, u64 *value) | 255 | struct dentry *parent, u64 *value) |
| 227 | { | 256 | { |
| 257 | /* if there are no write bits set, make read only */ | ||
| 258 | if (!(mode & S_IWUGO)) | ||
| 259 | return debugfs_create_file(name, mode, parent, value, &fops_u64_ro); | ||
| 260 | /* if there are no read bits set, make write only */ | ||
| 261 | if (!(mode & S_IRUGO)) | ||
| 262 | return debugfs_create_file(name, mode, parent, value, &fops_u64_wo); | ||
| 263 | |||
| 228 | return debugfs_create_file(name, mode, parent, value, &fops_u64); | 264 | return debugfs_create_file(name, mode, parent, value, &fops_u64); |
| 229 | } | 265 | } |
| 230 | EXPORT_SYMBOL_GPL(debugfs_create_u64); | 266 | EXPORT_SYMBOL_GPL(debugfs_create_u64); |
| 231 | 267 | ||
| 232 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); | 268 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); |
| 269 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); | ||
| 270 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); | ||
| 233 | 271 | ||
| 234 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); | 272 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); |
| 273 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); | ||
| 274 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); | ||
| 235 | 275 | ||
| 236 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); | 276 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); |
| 277 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); | ||
| 278 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); | ||
| 237 | 279 | ||
| 238 | /* | 280 | /* |
| 239 | * debugfs_create_x{8,16,32} - create a debugfs file that is used to read and write an unsigned {8,16,32}-bit value | 281 | * debugfs_create_x{8,16,32} - create a debugfs file that is used to read and write an unsigned {8,16,32}-bit value |
| @@ -256,6 +298,13 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n" | |||
| 256 | struct dentry *debugfs_create_x8(const char *name, mode_t mode, | 298 | struct dentry *debugfs_create_x8(const char *name, mode_t mode, |
| 257 | struct dentry *parent, u8 *value) | 299 | struct dentry *parent, u8 *value) |
| 258 | { | 300 | { |
| 301 | /* if there are no write bits set, make read only */ | ||
| 302 | if (!(mode & S_IWUGO)) | ||
| 303 | return debugfs_create_file(name, mode, parent, value, &fops_x8_ro); | ||
| 304 | /* if there are no read bits set, make write only */ | ||
| 305 | if (!(mode & S_IRUGO)) | ||
| 306 | return debugfs_create_file(name, mode, parent, value, &fops_x8_wo); | ||
| 307 | |||
| 259 | return debugfs_create_file(name, mode, parent, value, &fops_x8); | 308 | return debugfs_create_file(name, mode, parent, value, &fops_x8); |
| 260 | } | 309 | } |
| 261 | EXPORT_SYMBOL_GPL(debugfs_create_x8); | 310 | EXPORT_SYMBOL_GPL(debugfs_create_x8); |
| @@ -273,6 +322,13 @@ EXPORT_SYMBOL_GPL(debugfs_create_x8); | |||
| 273 | struct dentry *debugfs_create_x16(const char *name, mode_t mode, | 322 | struct dentry *debugfs_create_x16(const char *name, mode_t mode, |
| 274 | struct dentry *parent, u16 *value) | 323 | struct dentry *parent, u16 *value) |
| 275 | { | 324 | { |
| 325 | /* if there are no write bits set, make read only */ | ||
| 326 | if (!(mode & S_IWUGO)) | ||
| 327 | return debugfs_create_file(name, mode, parent, value, &fops_x16_ro); | ||
| 328 | /* if there are no read bits set, make write only */ | ||
| 329 | if (!(mode & S_IRUGO)) | ||
| 330 | return debugfs_create_file(name, mode, parent, value, &fops_x16_wo); | ||
| 331 | |||
| 276 | return debugfs_create_file(name, mode, parent, value, &fops_x16); | 332 | return debugfs_create_file(name, mode, parent, value, &fops_x16); |
| 277 | } | 333 | } |
| 278 | EXPORT_SYMBOL_GPL(debugfs_create_x16); | 334 | EXPORT_SYMBOL_GPL(debugfs_create_x16); |
| @@ -290,6 +346,13 @@ EXPORT_SYMBOL_GPL(debugfs_create_x16); | |||
| 290 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, | 346 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, |
| 291 | struct dentry *parent, u32 *value) | 347 | struct dentry *parent, u32 *value) |
| 292 | { | 348 | { |
| 349 | /* if there are no write bits set, make read only */ | ||
| 350 | if (!(mode & S_IWUGO)) | ||
| 351 | return debugfs_create_file(name, mode, parent, value, &fops_x32_ro); | ||
| 352 | /* if there are no read bits set, make write only */ | ||
| 353 | if (!(mode & S_IRUGO)) | ||
| 354 | return debugfs_create_file(name, mode, parent, value, &fops_x32_wo); | ||
| 355 | |||
| 293 | return debugfs_create_file(name, mode, parent, value, &fops_x32); | 356 | return debugfs_create_file(name, mode, parent, value, &fops_x32); |
| 294 | } | 357 | } |
| 295 | EXPORT_SYMBOL_GPL(debugfs_create_x32); | 358 | EXPORT_SYMBOL_GPL(debugfs_create_x32); |
| @@ -419,7 +482,7 @@ static const struct file_operations fops_blob = { | |||
| 419 | }; | 482 | }; |
| 420 | 483 | ||
| 421 | /** | 484 | /** |
| 422 | * debugfs_create_blob - create a debugfs file that is used to read and write a binary blob | 485 | * debugfs_create_blob - create a debugfs file that is used to read a binary blob |
| 423 | * @name: a pointer to a string containing the name of the file to create. | 486 | * @name: a pointer to a string containing the name of the file to create. |
| 424 | * @mode: the permission that the file should have | 487 | * @mode: the permission that the file should have |
| 425 | * @parent: a pointer to the parent dentry for this file. This should be a | 488 | * @parent: a pointer to the parent dentry for this file. This should be a |
