diff options
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index f9cee8e1233c..ac3f9476b776 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -31,6 +31,9 @@ | |||
31 | #include <linux/dcache.h> | 31 | #include <linux/dcache.h> |
32 | #include <linux/cred.h> | 32 | #include <linux/cred.h> |
33 | #include <net/addrconf.h> | 33 | #include <net/addrconf.h> |
34 | #ifdef CONFIG_BLOCK | ||
35 | #include <linux/blkdev.h> | ||
36 | #endif | ||
34 | 37 | ||
35 | #include <asm/page.h> /* for PAGE_SIZE */ | 38 | #include <asm/page.h> /* for PAGE_SIZE */ |
36 | #include <asm/sections.h> /* for dereference_function_descriptor() */ | 39 | #include <asm/sections.h> /* for dereference_function_descriptor() */ |
@@ -613,6 +616,26 @@ char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_sp | |||
613 | return buf; | 616 | return buf; |
614 | } | 617 | } |
615 | 618 | ||
619 | #ifdef CONFIG_BLOCK | ||
620 | static noinline_for_stack | ||
621 | char *bdev_name(char *buf, char *end, struct block_device *bdev, | ||
622 | struct printf_spec spec, const char *fmt) | ||
623 | { | ||
624 | struct gendisk *hd = bdev->bd_disk; | ||
625 | |||
626 | buf = string(buf, end, hd->disk_name, spec); | ||
627 | if (bdev->bd_part->partno) { | ||
628 | if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) { | ||
629 | if (buf < end) | ||
630 | *buf = 'p'; | ||
631 | buf++; | ||
632 | } | ||
633 | buf = number(buf, end, bdev->bd_part->partno, spec); | ||
634 | } | ||
635 | return buf; | ||
636 | } | ||
637 | #endif | ||
638 | |||
616 | static noinline_for_stack | 639 | static noinline_for_stack |
617 | char *symbol_string(char *buf, char *end, void *ptr, | 640 | char *symbol_string(char *buf, char *end, void *ptr, |
618 | struct printf_spec spec, const char *fmt) | 641 | struct printf_spec spec, const char *fmt) |
@@ -1443,6 +1466,7 @@ int kptr_restrict __read_mostly; | |||
1443 | * (default assumed to be phys_addr_t, passed by reference) | 1466 | * (default assumed to be phys_addr_t, passed by reference) |
1444 | * - 'd[234]' For a dentry name (optionally 2-4 last components) | 1467 | * - 'd[234]' For a dentry name (optionally 2-4 last components) |
1445 | * - 'D[234]' Same as 'd' but for a struct file | 1468 | * - 'D[234]' Same as 'd' but for a struct file |
1469 | * - 'g' For block_device name (gendisk + partition number) | ||
1446 | * - 'C' For a clock, it prints the name (Common Clock Framework) or address | 1470 | * - 'C' For a clock, it prints the name (Common Clock Framework) or address |
1447 | * (legacy clock framework) of the clock | 1471 | * (legacy clock framework) of the clock |
1448 | * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address | 1472 | * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address |
@@ -1600,6 +1624,11 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
1600 | return dentry_name(buf, end, | 1624 | return dentry_name(buf, end, |
1601 | ((const struct file *)ptr)->f_path.dentry, | 1625 | ((const struct file *)ptr)->f_path.dentry, |
1602 | spec, fmt); | 1626 | spec, fmt); |
1627 | #ifdef CONFIG_BLOCK | ||
1628 | case 'g': | ||
1629 | return bdev_name(buf, end, ptr, spec, fmt); | ||
1630 | #endif | ||
1631 | |||
1603 | } | 1632 | } |
1604 | spec.flags |= SMALL; | 1633 | spec.flags |= SMALL; |
1605 | if (spec.field_width == -1) { | 1634 | if (spec.field_width == -1) { |