From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755467AbXHGGHv (ORCPT ); Tue, 7 Aug 2007 02:07:51 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751874AbXHGGHo (ORCPT ); Tue, 7 Aug 2007 02:07:44 -0400 Received: from cantor.suse.de ([195.135.220.2]:33266 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751704AbXHGGHm (ORCPT ); Tue, 7 Aug 2007 02:07:42 -0400 From: Neil Brown To: linux-kernel@vger.kernel.org Date: Tue, 7 Aug 2007 16:07:22 +1000 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <18104.3098.696484.970773@notabene.brown> Subject: [PATCH/RFC] allow mapping from block-device-file to sysfs entry. X-Mailer: VM 7.19 under Emacs 21.4.1 X-face: [Gw_3E*Gng}4rRrKRYotwlE?.2|**#s9D ### Diffstat output ./block/ioctl.c | 13 +++++++++++++ ./include/linux/fs.h | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff .prev/block/ioctl.c ./block/ioctl.c --- .prev/block/ioctl.c 2007-08-07 14:53:07.000000000 +1000 +++ ./block/ioctl.c 2007-08-07 15:38:46.000000000 +1000 @@ -223,8 +223,21 @@ int blkdev_ioctl(struct inode *inode, st struct block_device *bdev = inode->i_bdev; struct gendisk *disk = bdev->bd_disk; int ret, n; + char b[BDEVNAME_SIZE*2]; switch(cmd) { + case BLKGETNAME: + memset(b, 0, sizeof(b)); + bdevname(bdev->bd_contains, b); + if (bdev->bd_contains != bdev) { + char *e = b + strlen(b); + *e++ = '/'; + bdevname(bdev, e); + } + if (copy_to_user((char __user *)arg, b, BDEVNAME_SIZE*2)) + return -EFAULT; + return 0; + case BLKFLSBUF: if (!capable(CAP_SYS_ADMIN)) return -EACCES; diff .prev/include/linux/fs.h ./include/linux/fs.h --- .prev/include/linux/fs.h 2007-08-07 14:51:08.000000000 +1000 +++ ./include/linux/fs.h 2007-08-07 15:38:49.000000000 +1000 @@ -223,6 +223,9 @@ extern int dir_notify_enable; #define BLKTRACESTOP _IO(0x12,117) #define BLKTRACETEARDOWN _IO(0x12,118) +#define BDEVNAME_SIZE 32 /* Largest string for a blockdev identifier */ +#define BLKGETNAME _IOR(0x12, 119, char [BDEVNAME_SIZE*2]) + #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ #define FIBMAP _IO(0x00,1) /* bmap access */ #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ @@ -1590,9 +1593,6 @@ extern void unregister_chrdev_region(dev extern int chrdev_open(struct inode *, struct file *); extern void chrdev_show(struct seq_file *,off_t); -/* fs/block_dev.c */ -#define BDEVNAME_SIZE 32 /* Largest string for a blockdev identifier */ - #ifdef CONFIG_BLOCK #define BLKDEV_MAJOR_HASH_SIZE 255 extern const char *__bdevname(dev_t, char *buffer); -------------- --- blockdev.c.orig 2007-08-07 15:06:00.000000000 +1000 +++ blockdev.c 2007-08-07 15:39:04.000000000 +1000 @@ -29,6 +29,7 @@ #define BLKBSZGET _IOR(0x12,112,size_t) #define BLKBSZSET _IOW(0x12,113,size_t) #define BLKGETSIZE64 _IOR(0x12,114,size_t) +#define BLKGETNAME _IOR(0x12,119,char [64]) #endif /* Maybe could be included */ @@ -56,6 +57,7 @@ #define ARGINTG 4 #define ARGLINTG 5 #define ARGLLINTG 6 +#define ARGSTR64 7 long argval; char *argname; char *help; @@ -101,6 +103,10 @@ { "--rereadpt", "BLKRRPART", BLKRRPART, ARGNONE, 0, NULL, N_("reread partition table") }, #endif +#ifdef BLKGETNAME + { "--name", "BLKGETNAME", BLKGETNAME, ARGSTR64, 0, NULL, + N_("get device name") }, +#endif }; #define SIZE(a) (sizeof(a)/sizeof((a)[0])) @@ -242,6 +248,7 @@ int iarg; long larg; long long llarg; + char str64arg[64]; int verbose = 0; for (i = 1; i < d; i++) { @@ -306,6 +313,9 @@ llarg = bdcms[j].argval; res = ioctl(fd, bdcms[j].ioc, &llarg); break; + case ARGSTR64: + res = ioctl(fd, bdcms[j].ioc, &str64arg); + break; } if (res == -1) { perror(bdcms[j].iocname); @@ -332,6 +342,13 @@ else printf("%lld\n", llarg); break; + case ARGSTR64: + if (verbose) + printf("%s: %.64s\n", _(bdcms[j].help), + str64arg); + else + printf("%.64s\n", str64arg); + break; default: if (verbose) printf(_("%s succeeded.\n"), _(bdcms[j].help));