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 | |
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')
-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 | ||