diff options
| author | Nicolai Stange <nicstange@gmail.com> | 2016-03-22 09:11:17 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-04-12 17:14:21 -0400 |
| commit | 4909f168104b24f592fb8d502e2a6520346a3927 (patch) | |
| tree | 8b043ac08c1362ccd7a8a41efc4012e51b94604d /fs/debugfs/file.c | |
| parent | 5103068eaca290f890a30aae70085fac44cecaf6 (diff) | |
debugfs: unproxify integer attribute files
Currently, the struct file_operations associated with the integer attribute
style files created through the debugfs_create_*() helpers are not file
lifetime aware as they are defined by means of DEFINE_SIMPLE_ATTRIBUTE().
Thus, a lifetime managing proxy is created around the original fops each
time such a file is opened which is an unnecessary waste of resources.
Migrate all usages of DEFINE_SIMPLE_ATTRIBUTE() within debugfs itself
to DEFINE_DEBUGFS_ATTRIBUTE() in order to implement file lifetime managing
within the struct file_operations thus defined.
Introduce the debugfs_create_mode_unsafe() helper, analogous to
debugfs_create_mode(), but distinct in that it creates the files in
non-proxying operation mode through debugfs_create_file_unsafe().
Feed all struct file_operations migrated to DEFINE_DEBUGFS_ATTRIBUTE()
into debugfs_create_mode_unsafe() instead of former debugfs_create_mode().
Signed-off-by: Nicolai Stange <nicstange@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/debugfs/file.c')
| -rw-r--r-- | fs/debugfs/file.c | 123 |
1 files changed, 75 insertions, 48 deletions
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 8ef56d9499a4..4b3967e86e97 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
| @@ -328,6 +328,24 @@ static struct dentry *debugfs_create_mode(const char *name, umode_t mode, | |||
| 328 | return debugfs_create_file(name, mode, parent, value, fops); | 328 | return debugfs_create_file(name, mode, parent, value, fops); |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | static struct dentry *debugfs_create_mode_unsafe(const char *name, umode_t mode, | ||
| 332 | struct dentry *parent, void *value, | ||
| 333 | const struct file_operations *fops, | ||
| 334 | const struct file_operations *fops_ro, | ||
| 335 | const struct file_operations *fops_wo) | ||
| 336 | { | ||
| 337 | /* if there are no write bits set, make read only */ | ||
| 338 | if (!(mode & S_IWUGO)) | ||
| 339 | return debugfs_create_file_unsafe(name, mode, parent, value, | ||
| 340 | fops_ro); | ||
| 341 | /* if there are no read bits set, make write only */ | ||
| 342 | if (!(mode & S_IRUGO)) | ||
| 343 | return debugfs_create_file_unsafe(name, mode, parent, value, | ||
| 344 | fops_wo); | ||
| 345 | |||
| 346 | return debugfs_create_file_unsafe(name, mode, parent, value, fops); | ||
| 347 | } | ||
| 348 | |||
| 331 | static int debugfs_u8_set(void *data, u64 val) | 349 | static int debugfs_u8_set(void *data, u64 val) |
| 332 | { | 350 | { |
| 333 | *(u8 *)data = val; | 351 | *(u8 *)data = val; |
| @@ -338,9 +356,9 @@ static int debugfs_u8_get(void *data, u64 *val) | |||
| 338 | *val = *(u8 *)data; | 356 | *val = *(u8 *)data; |
| 339 | return 0; | 357 | return 0; |
| 340 | } | 358 | } |
| 341 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); | 359 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); |
| 342 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); | 360 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); |
| 343 | DEFINE_SIMPLE_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); | 361 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); |
| 344 | 362 | ||
| 345 | /** | 363 | /** |
| 346 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value | 364 | * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value |
| @@ -369,7 +387,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); | |||
| 369 | struct dentry *debugfs_create_u8(const char *name, umode_t mode, | 387 | struct dentry *debugfs_create_u8(const char *name, umode_t mode, |
| 370 | struct dentry *parent, u8 *value) | 388 | struct dentry *parent, u8 *value) |
| 371 | { | 389 | { |
| 372 | return debugfs_create_mode(name, mode, parent, value, &fops_u8, | 390 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u8, |
| 373 | &fops_u8_ro, &fops_u8_wo); | 391 | &fops_u8_ro, &fops_u8_wo); |
| 374 | } | 392 | } |
| 375 | EXPORT_SYMBOL_GPL(debugfs_create_u8); | 393 | EXPORT_SYMBOL_GPL(debugfs_create_u8); |
| @@ -384,9 +402,9 @@ static int debugfs_u16_get(void *data, u64 *val) | |||
| 384 | *val = *(u16 *)data; | 402 | *val = *(u16 *)data; |
| 385 | return 0; | 403 | return 0; |
| 386 | } | 404 | } |
| 387 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); | 405 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); |
| 388 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); | 406 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); |
| 389 | DEFINE_SIMPLE_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); | 407 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); |
| 390 | 408 | ||
| 391 | /** | 409 | /** |
| 392 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value | 410 | * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value |
| @@ -415,7 +433,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); | |||
| 415 | struct dentry *debugfs_create_u16(const char *name, umode_t mode, | 433 | struct dentry *debugfs_create_u16(const char *name, umode_t mode, |
| 416 | struct dentry *parent, u16 *value) | 434 | struct dentry *parent, u16 *value) |
| 417 | { | 435 | { |
| 418 | return debugfs_create_mode(name, mode, parent, value, &fops_u16, | 436 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u16, |
| 419 | &fops_u16_ro, &fops_u16_wo); | 437 | &fops_u16_ro, &fops_u16_wo); |
| 420 | } | 438 | } |
| 421 | EXPORT_SYMBOL_GPL(debugfs_create_u16); | 439 | EXPORT_SYMBOL_GPL(debugfs_create_u16); |
| @@ -430,9 +448,9 @@ static int debugfs_u32_get(void *data, u64 *val) | |||
| 430 | *val = *(u32 *)data; | 448 | *val = *(u32 *)data; |
| 431 | return 0; | 449 | return 0; |
| 432 | } | 450 | } |
| 433 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); | 451 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); |
| 434 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); | 452 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); |
| 435 | DEFINE_SIMPLE_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); | 453 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); |
| 436 | 454 | ||
| 437 | /** | 455 | /** |
| 438 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value | 456 | * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value |
| @@ -461,7 +479,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); | |||
| 461 | struct dentry *debugfs_create_u32(const char *name, umode_t mode, | 479 | struct dentry *debugfs_create_u32(const char *name, umode_t mode, |
| 462 | struct dentry *parent, u32 *value) | 480 | struct dentry *parent, u32 *value) |
| 463 | { | 481 | { |
| 464 | return debugfs_create_mode(name, mode, parent, value, &fops_u32, | 482 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u32, |
| 465 | &fops_u32_ro, &fops_u32_wo); | 483 | &fops_u32_ro, &fops_u32_wo); |
| 466 | } | 484 | } |
| 467 | EXPORT_SYMBOL_GPL(debugfs_create_u32); | 485 | EXPORT_SYMBOL_GPL(debugfs_create_u32); |
| @@ -477,9 +495,9 @@ static int debugfs_u64_get(void *data, u64 *val) | |||
| 477 | *val = *(u64 *)data; | 495 | *val = *(u64 *)data; |
| 478 | return 0; | 496 | return 0; |
| 479 | } | 497 | } |
| 480 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); | 498 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); |
| 481 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); | 499 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); |
| 482 | DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); | 500 | DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); |
| 483 | 501 | ||
| 484 | /** | 502 | /** |
| 485 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value | 503 | * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value |
| @@ -508,7 +526,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); | |||
| 508 | struct dentry *debugfs_create_u64(const char *name, umode_t mode, | 526 | struct dentry *debugfs_create_u64(const char *name, umode_t mode, |
| 509 | struct dentry *parent, u64 *value) | 527 | struct dentry *parent, u64 *value) |
| 510 | { | 528 | { |
| 511 | return debugfs_create_mode(name, mode, parent, value, &fops_u64, | 529 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u64, |
| 512 | &fops_u64_ro, &fops_u64_wo); | 530 | &fops_u64_ro, &fops_u64_wo); |
| 513 | } | 531 | } |
| 514 | EXPORT_SYMBOL_GPL(debugfs_create_u64); | 532 | EXPORT_SYMBOL_GPL(debugfs_create_u64); |
| @@ -524,9 +542,10 @@ static int debugfs_ulong_get(void *data, u64 *val) | |||
| 524 | *val = *(unsigned long *)data; | 542 | *val = *(unsigned long *)data; |
| 525 | return 0; | 543 | return 0; |
| 526 | } | 544 | } |
| 527 | DEFINE_SIMPLE_ATTRIBUTE(fops_ulong, debugfs_ulong_get, debugfs_ulong_set, "%llu\n"); | 545 | DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong, debugfs_ulong_get, debugfs_ulong_set, |
| 528 | DEFINE_SIMPLE_ATTRIBUTE(fops_ulong_ro, debugfs_ulong_get, NULL, "%llu\n"); | 546 | "%llu\n"); |
| 529 | DEFINE_SIMPLE_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n"); | 547 | DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_ro, debugfs_ulong_get, NULL, "%llu\n"); |
| 548 | DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n"); | ||
| 530 | 549 | ||
| 531 | /** | 550 | /** |
| 532 | * debugfs_create_ulong - create a debugfs file that is used to read and write | 551 | * debugfs_create_ulong - create a debugfs file that is used to read and write |
| @@ -556,26 +575,30 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n"); | |||
| 556 | struct dentry *debugfs_create_ulong(const char *name, umode_t mode, | 575 | struct dentry *debugfs_create_ulong(const char *name, umode_t mode, |
| 557 | struct dentry *parent, unsigned long *value) | 576 | struct dentry *parent, unsigned long *value) |
| 558 | { | 577 | { |
| 559 | return debugfs_create_mode(name, mode, parent, value, &fops_ulong, | 578 | return debugfs_create_mode_unsafe(name, mode, parent, value, |
| 560 | &fops_ulong_ro, &fops_ulong_wo); | 579 | &fops_ulong, &fops_ulong_ro, |
| 580 | &fops_ulong_wo); | ||
| 561 | } | 581 | } |
| 562 | EXPORT_SYMBOL_GPL(debugfs_create_ulong); | 582 | EXPORT_SYMBOL_GPL(debugfs_create_ulong); |
| 563 | 583 | ||
| 564 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); | 584 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); |
| 565 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); | 585 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); |
| 566 | DEFINE_SIMPLE_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); | 586 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); |
| 567 | 587 | ||
| 568 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); | 588 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, |
| 569 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); | 589 | "0x%04llx\n"); |
| 570 | DEFINE_SIMPLE_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); | 590 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); |
| 591 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); | ||
| 571 | 592 | ||
| 572 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); | 593 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, |
| 573 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); | 594 | "0x%08llx\n"); |
| 574 | DEFINE_SIMPLE_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); | 595 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); |
| 596 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); | ||
| 575 | 597 | ||
| 576 | DEFINE_SIMPLE_ATTRIBUTE(fops_x64, debugfs_u64_get, debugfs_u64_set, "0x%016llx\n"); | 598 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x64, debugfs_u64_get, debugfs_u64_set, |
| 577 | DEFINE_SIMPLE_ATTRIBUTE(fops_x64_ro, debugfs_u64_get, NULL, "0x%016llx\n"); | 599 | "0x%016llx\n"); |
| 578 | DEFINE_SIMPLE_ATTRIBUTE(fops_x64_wo, NULL, debugfs_u64_set, "0x%016llx\n"); | 600 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x64_ro, debugfs_u64_get, NULL, "0x%016llx\n"); |
| 601 | DEFINE_DEBUGFS_ATTRIBUTE(fops_x64_wo, NULL, debugfs_u64_set, "0x%016llx\n"); | ||
| 579 | 602 | ||
| 580 | /* | 603 | /* |
| 581 | * debugfs_create_x{8,16,32,64} - create a debugfs file that is used to read and write an unsigned {8,16,32,64}-bit value | 604 | * debugfs_create_x{8,16,32,64} - create a debugfs file that is used to read and write an unsigned {8,16,32,64}-bit value |
| @@ -598,7 +621,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_x64_wo, NULL, debugfs_u64_set, "0x%016llx\n"); | |||
| 598 | struct dentry *debugfs_create_x8(const char *name, umode_t mode, | 621 | struct dentry *debugfs_create_x8(const char *name, umode_t mode, |
| 599 | struct dentry *parent, u8 *value) | 622 | struct dentry *parent, u8 *value) |
| 600 | { | 623 | { |
| 601 | return debugfs_create_mode(name, mode, parent, value, &fops_x8, | 624 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x8, |
| 602 | &fops_x8_ro, &fops_x8_wo); | 625 | &fops_x8_ro, &fops_x8_wo); |
| 603 | } | 626 | } |
| 604 | EXPORT_SYMBOL_GPL(debugfs_create_x8); | 627 | EXPORT_SYMBOL_GPL(debugfs_create_x8); |
| @@ -616,7 +639,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x8); | |||
| 616 | struct dentry *debugfs_create_x16(const char *name, umode_t mode, | 639 | struct dentry *debugfs_create_x16(const char *name, umode_t mode, |
| 617 | struct dentry *parent, u16 *value) | 640 | struct dentry *parent, u16 *value) |
| 618 | { | 641 | { |
| 619 | return debugfs_create_mode(name, mode, parent, value, &fops_x16, | 642 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x16, |
| 620 | &fops_x16_ro, &fops_x16_wo); | 643 | &fops_x16_ro, &fops_x16_wo); |
| 621 | } | 644 | } |
| 622 | EXPORT_SYMBOL_GPL(debugfs_create_x16); | 645 | EXPORT_SYMBOL_GPL(debugfs_create_x16); |
| @@ -634,7 +657,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x16); | |||
| 634 | struct dentry *debugfs_create_x32(const char *name, umode_t mode, | 657 | struct dentry *debugfs_create_x32(const char *name, umode_t mode, |
| 635 | struct dentry *parent, u32 *value) | 658 | struct dentry *parent, u32 *value) |
| 636 | { | 659 | { |
| 637 | return debugfs_create_mode(name, mode, parent, value, &fops_x32, | 660 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x32, |
| 638 | &fops_x32_ro, &fops_x32_wo); | 661 | &fops_x32_ro, &fops_x32_wo); |
| 639 | } | 662 | } |
| 640 | EXPORT_SYMBOL_GPL(debugfs_create_x32); | 663 | EXPORT_SYMBOL_GPL(debugfs_create_x32); |
| @@ -652,7 +675,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x32); | |||
| 652 | struct dentry *debugfs_create_x64(const char *name, umode_t mode, | 675 | struct dentry *debugfs_create_x64(const char *name, umode_t mode, |
| 653 | struct dentry *parent, u64 *value) | 676 | struct dentry *parent, u64 *value) |
| 654 | { | 677 | { |
| 655 | return debugfs_create_mode(name, mode, parent, value, &fops_x64, | 678 | return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x64, |
| 656 | &fops_x64_ro, &fops_x64_wo); | 679 | &fops_x64_ro, &fops_x64_wo); |
| 657 | } | 680 | } |
| 658 | EXPORT_SYMBOL_GPL(debugfs_create_x64); | 681 | EXPORT_SYMBOL_GPL(debugfs_create_x64); |
| @@ -668,10 +691,10 @@ static int debugfs_size_t_get(void *data, u64 *val) | |||
| 668 | *val = *(size_t *)data; | 691 | *val = *(size_t *)data; |
| 669 | return 0; | 692 | return 0; |
| 670 | } | 693 | } |
| 671 | DEFINE_SIMPLE_ATTRIBUTE(fops_size_t, debugfs_size_t_get, debugfs_size_t_set, | 694 | DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t, debugfs_size_t_get, debugfs_size_t_set, |
| 672 | "%llu\n"); /* %llu and %zu are more or less the same */ | 695 | "%llu\n"); /* %llu and %zu are more or less the same */ |
| 673 | DEFINE_SIMPLE_ATTRIBUTE(fops_size_t_ro, debugfs_size_t_get, NULL, "%llu\n"); | 696 | DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t_ro, debugfs_size_t_get, NULL, "%llu\n"); |
| 674 | DEFINE_SIMPLE_ATTRIBUTE(fops_size_t_wo, NULL, debugfs_size_t_set, "%llu\n"); | 697 | DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t_wo, NULL, debugfs_size_t_set, "%llu\n"); |
| 675 | 698 | ||
| 676 | /** | 699 | /** |
| 677 | * debugfs_create_size_t - create a debugfs file that is used to read and write an size_t value | 700 | * debugfs_create_size_t - create a debugfs file that is used to read and write an size_t value |
| @@ -686,8 +709,9 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_size_t_wo, NULL, debugfs_size_t_set, "%llu\n"); | |||
| 686 | struct dentry *debugfs_create_size_t(const char *name, umode_t mode, | 709 | struct dentry *debugfs_create_size_t(const char *name, umode_t mode, |
| 687 | struct dentry *parent, size_t *value) | 710 | struct dentry *parent, size_t *value) |
| 688 | { | 711 | { |
| 689 | return debugfs_create_mode(name, mode, parent, value, &fops_size_t, | 712 | return debugfs_create_mode_unsafe(name, mode, parent, value, |
| 690 | &fops_size_t_ro, &fops_size_t_wo); | 713 | &fops_size_t, &fops_size_t_ro, |
| 714 | &fops_size_t_wo); | ||
| 691 | } | 715 | } |
| 692 | EXPORT_SYMBOL_GPL(debugfs_create_size_t); | 716 | EXPORT_SYMBOL_GPL(debugfs_create_size_t); |
| 693 | 717 | ||
| @@ -701,10 +725,12 @@ static int debugfs_atomic_t_get(void *data, u64 *val) | |||
| 701 | *val = atomic_read((atomic_t *)data); | 725 | *val = atomic_read((atomic_t *)data); |
| 702 | return 0; | 726 | return 0; |
| 703 | } | 727 | } |
| 704 | DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get, | 728 | DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get, |
| 705 | debugfs_atomic_t_set, "%lld\n"); | 729 | debugfs_atomic_t_set, "%lld\n"); |
| 706 | DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, "%lld\n"); | 730 | DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, |
| 707 | DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, "%lld\n"); | 731 | "%lld\n"); |
| 732 | DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, | ||
| 733 | "%lld\n"); | ||
| 708 | 734 | ||
| 709 | /** | 735 | /** |
| 710 | * debugfs_create_atomic_t - create a debugfs file that is used to read and | 736 | * debugfs_create_atomic_t - create a debugfs file that is used to read and |
| @@ -720,8 +746,9 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, "%lld\n"); | |||
| 720 | struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, | 746 | struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, |
| 721 | struct dentry *parent, atomic_t *value) | 747 | struct dentry *parent, atomic_t *value) |
| 722 | { | 748 | { |
| 723 | return debugfs_create_mode(name, mode, parent, value, &fops_atomic_t, | 749 | return debugfs_create_mode_unsafe(name, mode, parent, value, |
| 724 | &fops_atomic_t_ro, &fops_atomic_t_wo); | 750 | &fops_atomic_t, &fops_atomic_t_ro, |
| 751 | &fops_atomic_t_wo); | ||
| 725 | } | 752 | } |
| 726 | EXPORT_SYMBOL_GPL(debugfs_create_atomic_t); | 753 | EXPORT_SYMBOL_GPL(debugfs_create_atomic_t); |
| 727 | 754 | ||
