aboutsummaryrefslogtreecommitdiffstats
path: root/fs/debugfs
diff options
context:
space:
mode:
authorNicolai Stange <nicstange@gmail.com>2016-03-22 09:11:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-04-12 17:14:21 -0400
commit4909f168104b24f592fb8d502e2a6520346a3927 (patch)
tree8b043ac08c1362ccd7a8a41efc4012e51b94604d /fs/debugfs
parent5103068eaca290f890a30aae70085fac44cecaf6 (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.c123
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
331static 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
331static int debugfs_u8_set(void *data, u64 val) 349static 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}
341DEFINE_SIMPLE_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); 359DEFINE_DEBUGFS_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n");
342DEFINE_SIMPLE_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); 360DEFINE_DEBUGFS_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n");
343DEFINE_SIMPLE_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); 361DEFINE_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");
369struct dentry *debugfs_create_u8(const char *name, umode_t mode, 387struct 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}
375EXPORT_SYMBOL_GPL(debugfs_create_u8); 393EXPORT_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}
387DEFINE_SIMPLE_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); 405DEFINE_DEBUGFS_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n");
388DEFINE_SIMPLE_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); 406DEFINE_DEBUGFS_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n");
389DEFINE_SIMPLE_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); 407DEFINE_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");
415struct dentry *debugfs_create_u16(const char *name, umode_t mode, 433struct 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}
421EXPORT_SYMBOL_GPL(debugfs_create_u16); 439EXPORT_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}
433DEFINE_SIMPLE_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); 451DEFINE_DEBUGFS_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n");
434DEFINE_SIMPLE_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); 452DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n");
435DEFINE_SIMPLE_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); 453DEFINE_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");
461struct dentry *debugfs_create_u32(const char *name, umode_t mode, 479struct 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}
467EXPORT_SYMBOL_GPL(debugfs_create_u32); 485EXPORT_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}
480DEFINE_SIMPLE_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); 498DEFINE_DEBUGFS_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n");
481DEFINE_SIMPLE_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); 499DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n");
482DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); 500DEFINE_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");
508struct dentry *debugfs_create_u64(const char *name, umode_t mode, 526struct 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}
514EXPORT_SYMBOL_GPL(debugfs_create_u64); 532EXPORT_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}
527DEFINE_SIMPLE_ATTRIBUTE(fops_ulong, debugfs_ulong_get, debugfs_ulong_set, "%llu\n"); 545DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong, debugfs_ulong_get, debugfs_ulong_set,
528DEFINE_SIMPLE_ATTRIBUTE(fops_ulong_ro, debugfs_ulong_get, NULL, "%llu\n"); 546 "%llu\n");
529DEFINE_SIMPLE_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n"); 547DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_ro, debugfs_ulong_get, NULL, "%llu\n");
548DEFINE_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");
556struct dentry *debugfs_create_ulong(const char *name, umode_t mode, 575struct 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}
562EXPORT_SYMBOL_GPL(debugfs_create_ulong); 582EXPORT_SYMBOL_GPL(debugfs_create_ulong);
563 583
564DEFINE_SIMPLE_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); 584DEFINE_DEBUGFS_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n");
565DEFINE_SIMPLE_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); 585DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n");
566DEFINE_SIMPLE_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); 586DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n");
567 587
568DEFINE_SIMPLE_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, "0x%04llx\n"); 588DEFINE_DEBUGFS_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set,
569DEFINE_SIMPLE_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); 589 "0x%04llx\n");
570DEFINE_SIMPLE_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); 590DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n");
591DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n");
571 592
572DEFINE_SIMPLE_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, "0x%08llx\n"); 593DEFINE_DEBUGFS_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set,
573DEFINE_SIMPLE_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); 594 "0x%08llx\n");
574DEFINE_SIMPLE_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); 595DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n");
596DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n");
575 597
576DEFINE_SIMPLE_ATTRIBUTE(fops_x64, debugfs_u64_get, debugfs_u64_set, "0x%016llx\n"); 598DEFINE_DEBUGFS_ATTRIBUTE(fops_x64, debugfs_u64_get, debugfs_u64_set,
577DEFINE_SIMPLE_ATTRIBUTE(fops_x64_ro, debugfs_u64_get, NULL, "0x%016llx\n"); 599 "0x%016llx\n");
578DEFINE_SIMPLE_ATTRIBUTE(fops_x64_wo, NULL, debugfs_u64_set, "0x%016llx\n"); 600DEFINE_DEBUGFS_ATTRIBUTE(fops_x64_ro, debugfs_u64_get, NULL, "0x%016llx\n");
601DEFINE_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");
598struct dentry *debugfs_create_x8(const char *name, umode_t mode, 621struct 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}
604EXPORT_SYMBOL_GPL(debugfs_create_x8); 627EXPORT_SYMBOL_GPL(debugfs_create_x8);
@@ -616,7 +639,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x8);
616struct dentry *debugfs_create_x16(const char *name, umode_t mode, 639struct 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}
622EXPORT_SYMBOL_GPL(debugfs_create_x16); 645EXPORT_SYMBOL_GPL(debugfs_create_x16);
@@ -634,7 +657,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x16);
634struct dentry *debugfs_create_x32(const char *name, umode_t mode, 657struct 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}
640EXPORT_SYMBOL_GPL(debugfs_create_x32); 663EXPORT_SYMBOL_GPL(debugfs_create_x32);
@@ -652,7 +675,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_x32);
652struct dentry *debugfs_create_x64(const char *name, umode_t mode, 675struct 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}
658EXPORT_SYMBOL_GPL(debugfs_create_x64); 681EXPORT_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}
671DEFINE_SIMPLE_ATTRIBUTE(fops_size_t, debugfs_size_t_get, debugfs_size_t_set, 694DEFINE_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 */
673DEFINE_SIMPLE_ATTRIBUTE(fops_size_t_ro, debugfs_size_t_get, NULL, "%llu\n"); 696DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t_ro, debugfs_size_t_get, NULL, "%llu\n");
674DEFINE_SIMPLE_ATTRIBUTE(fops_size_t_wo, NULL, debugfs_size_t_set, "%llu\n"); 697DEFINE_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");
686struct dentry *debugfs_create_size_t(const char *name, umode_t mode, 709struct 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}
692EXPORT_SYMBOL_GPL(debugfs_create_size_t); 716EXPORT_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}
704DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get, 728DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t, debugfs_atomic_t_get,
705 debugfs_atomic_t_set, "%lld\n"); 729 debugfs_atomic_t_set, "%lld\n");
706DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, "%lld\n"); 730DEFINE_DEBUGFS_ATTRIBUTE(fops_atomic_t_ro, debugfs_atomic_t_get, NULL,
707DEFINE_SIMPLE_ATTRIBUTE(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, "%lld\n"); 731 "%lld\n");
732DEFINE_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");
720struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, 746struct 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}
726EXPORT_SYMBOL_GPL(debugfs_create_atomic_t); 753EXPORT_SYMBOL_GPL(debugfs_create_atomic_t);
727 754