mmc: make number of mmcblk minors configurable
Subsystems (2)
PATCH 1/1 mmc: make number of mmcblk minors configurable
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
--- drivers/mmc/card/Kconfig | 10 ++++++++++ drivers/mmc/card/block.c | 20 ++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-)
drivers/mmc/card/Kconfig +10 -0
@@ -14,6 +14,16 @@ config MMC_BLOCK mount the filesystem. Almost everyone wishing MMC support should say Y or M here. +config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 32 + default 8 + help + Number of minors per block device. One is needed for every + partition (plus one for the whole device). + Default is 8 to be backwards compatible with previous + hardcoded device numbering. + config MMC_BLOCK_BOUNCE bool "Use bounce buffer for simple hosts" depends on MMC_BLOCK
drivers/mmc/card/block.c +8 -12
@@ -45,13 +45,9 @@MODULE_ALIAS ("mmc:block" ); -/* -* max 8 partitions per card -*/ -#define MMC_SHIFT 3 -#define MMC_NUM_MINORS (256 >> MMC_SHIFT) +#define MMC_MAX_DEVICES ((255 + CONFIG_MMC_BLOCK_MINORS) / CONFIG_MMC_BLOCK_MINORS) -static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS); +static DECLARE_BITMAP(dev_use, MMC_MAX_DEVICES);/* * There is one mmc_blk_data per slot.
@@ -88,10 +84,10 @@ static void mmc_blk_put(struct mmc_blk_data *md) md->usage--;if (md->usage ==0 ) {int devmaj =MAJOR (disk_devt (md->disk)); -int devidx =MINOR (disk_devt (md->disk)) >>MMC_SHIFT ; +int devidx =MINOR (disk_devt (md->disk)) /CONFIG_MMC_BLOCK_MINORS ;if (!devmaj) - devidx = md->disk->first_minor >>MMC_SHIFT ; + devidx = md->disk->first_minor /CONFIG_MMC_BLOCK_MINORS ;blk_cleanup_queue (md->queue.queue);
@@ -567,8 +563,8 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)struct mmc_blk_data *md;int devidx, ret; - devidx =find_first_zero_bit (dev_use,MMC_NUM_MINORS ); -if (devidx >=MMC_NUM_MINORS ) + devidx =find_first_zero_bit (dev_use,MMC_MAX_DEVICES ); +if (devidx >=MMC_MAX_DEVICES )return ERR_PTR (-ENOSPC );__set_bit (devidx, dev_use);
@@ -585,7 +581,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)*/ md->read_only =mmc_blk_readonly (card); - md->disk =alloc_disk (1 <<MMC_SHIFT ); + md->disk =alloc_disk (CONFIG_MMC_BLOCK_MINORS );if (md->disk ==NULL ) { ret = -ENOMEM ; goto err_kfree;
@@ -602,7 +598,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) md->queue.data = md; md->disk->major =MMC_BLOCK_MAJOR ; - md->disk->first_minor = devidx <<MMC_SHIFT ; + md->disk->first_minor = devidx *CONFIG_MMC_BLOCK_MINORS ; md->disk->fops = &mmc_bdops; md->disk->private_data = md; md->disk->queue = md->queue.queue;
Signature · 1 line
1.5.6.5
Quoted 8 lines · On Tue, 17 Aug 2010 23:13:33 -0500 Olof Johansson <[email protected]> wrote:
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
How does the numbering scheme change? What's the user-visible effect of setting CONFIG_MMC_BLOCK_MINORS to, say, 16?
Quoted 12 lines
--- drivers/mmc/card/Kconfig | 10 ++++++++++ drivers/mmc/card/block.c | 20 ++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-)drivers/mmc/card/Kconfig +0
-0@@ -14,6 +14,16 @@ config MMC_BLOCK mount the filesystem. Almost everyone wishing MMC support should say Y or M here.
drivers/mmc/card/Kconfig config MMC_BLOCK · line 25
Quoted 10 lines
drivers/mmc/card/Kconfig +9
-0+config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 32 + default 8 + help + Number of minors per block device. One is needed for every + partition (plus one for the whole device). + Default is 8 to be backwards compatible with previous + hardcoded device numbering.
If possible it would be better to do this with a kernel boot (or modprobe) parameter. That permits vendors to ship packaged kernels with full functionality, etc. Possible? The default value of the runtime-settable parameter could be Kconfigurable is there's a real need for that.
Quoted 8 lines
drivers/mmc/card/Kconfig +0
-0config MMC_BLOCK_BOUNCE bool "Use bounce buffer for simple hosts" depends on MMC_BLOCKdrivers/mmc/card/block.c +0
-0
drivers/mmc/card/block.c line 48
Quoted 9 lines
drivers/mmc/card/block.c +1
-5@@ -45,13 +45,9 @@MODULE_ALIAS ("mmc:block" ); -/* -* max 8 partitions per card -*/ -#define MMC_SHIFT 3 -#define MMC_NUM_MINORS (256 >> MMC_SHIFT) +#define MMC_MAX_DEVICES ((255 + CONFIG_MMC_BLOCK_MINORS) / CONFIG_MMC_BLOCK_MINORS)
So if I increase CONFIG_MMC_BLOCK_MINORS, I can no longer support as many devices? That'd be worth mentioning somewhere?
fwiw, the above could use DIV_ROUND_UP().
Hi,
Quoted 7 lines · Andrew Morton
Quoted 4 lines · On Tue, 17 Aug 2010 23:13:33 -0500 Olof Johansson <[email protected]> wrote:
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Quoted 7 lines
Quoted 4 lines
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
How does the numbering scheme change? What's the user-visible effect of setting
CONFIG_MMC_BLOCK_MINORSto, say, 16?
mmcblk0 will be 0, mmcblk0p1 1, etc. mmcblk1 (second device) will be bumped up to start at minor 16 instead of 8 before, which is why I didn't just bump up the static default and went with a config option instead.
FWIW, udev will happily keep creating device nodes for higher partitions, so without this patch you end up with overlapping device entries where mmcblk1p1 and mmcblk0p9 will be the same major/minor.
Quoted 13 lines
Quoted 13 lines
--- drivers/mmc/card/Kconfig | 10 ++++++++++ drivers/mmc/card/block.c | 20 ++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-)drivers/mmc/card/Kconfig +0
-0@@ -14,6 +14,16 @@ config MMC_BLOCK mount the filesystem. Almost everyone wishing MMC support should say Y or M here.
Quoted 15 lines
drivers/mmc/card/Kconfig config MMC_BLOCK · line 25
Quoted 9 lines
drivers/mmc/card/Kconfig +9
-0+config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 32 + default 8 + help + Number of minors per block device. One is needed for every + partition (plus one for the whole device). + Default is 8 to be backwards compatible with previous + hardcoded device numbering.If possible it would be better to do this with a kernel boot (or modprobe) parameter. That permits vendors to ship packaged kernels with full functionality, etc. Possible? The default value of the runtime-settable parameter could be Kconfigurable is there's a real need for that.
I considered just doing a runtime option, but it would be suboptimal in our case (Chrome OS) since it would mean that we had yet another kernel arg we always have to include on all platforms that boot from mmc devices. Modprobe args won't work there because the driver is statically linked in (and no ramdisk).
I can definitely change it to take the default from the Kconfig and make it possible to override with boot/modprobe parameters though. Revised patch to follow.
Quoted 11 lines
Quoted 11 lines
drivers/mmc/card/Kconfig +0
-0config MMC_BLOCK_BOUNCE bool "Use bounce buffer for simple hosts" depends on MMC_BLOCKdrivers/mmc/card/block.c +0
-0@@ -45,13 +45,9 @@MODULE_ALIAS ("mmc:block" );
Quoted 9 lines
drivers/mmc/card/block.c line 48
Quoted 6 lines
drivers/mmc/card/block.c +1
-5-/* -* max 8 partitions per card -*/ -#define MMC_SHIFT 3 -#define MMC_NUM_MINORS (256 >> MMC_SHIFT) +#define MMC_MAX_DEVICES ((255 + CONFIG_MMC_BLOCK_MINORS) / CONFIG_MMC_BLOCK_MINORS)So if I increase
CONFIG_MMC_BLOCK_MINORS, I can no longer support as many devices? That'd be worth mentioning somewhere?
Yep, I'll add a comment and clarify it in the Kconfig help.
Quoted 1 line
fwiw, the above could use
DIV_ROUND_UP().
Good point, will do.
-Olof
PATCH v2 1/1 mmc: add config and runtime option for number of mmcblk minors
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
Also provide a boot/modprobe-time parameter to override the config
default: mmcblk.perdev_minors.
---
Changes since v1:
* Runtime override of config default
* Better help text
* DIV_ROUND_UP for max_devices calculation
* Clarify mmcblk device count limitations
drivers/mmc/card/Kconfig | 17 +++++++++++++++++ drivers/mmc/card/block.c | 43 +++++++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 12 deletions(-)
drivers/mmc/card/Kconfig +17 -0
@@ -14,6 +14,23 @@ config MMC_BLOCK mount the filesystem. Almost everyone wishing MMC support should say Y or M here. +config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 256 + default 8 + help + Number of minors per block device. One is needed for every + partition on the disk (plus one for the whole disk). + + Number of total MMC minors available is 256, so your number + of supported block devices will be limited to 256 divided + by this number. + + Default is 8 to be backwards compatible with previous + hardwired device numbering. + + If unsure, say 8 here. + config MMC_BLOCK_BOUNCE bool "Use bounce buffer for simple hosts" depends on MMC_BLOCK
drivers/mmc/card/block.c +31 -12
96 lines not on this page · raw message
Signature · 1 line
1.5.6.5
PATCH v3 1/1 mmc: add config and runtime option for number of mmcblk minors
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
Also provide a boot/modprobe-time parameter to override the config
default: mmcblk.perdev_minors.
---
Andrew, sorry for the churn but Mandeep had a couple of good points that needed addressing.
Changes since v1:
* Runtime override of config default
* Better help text
* DIV_ROUND_UP for max_devices calculation
* Clarify mmcblk device count limitations
Changes since v2 based on feedback from Mandeep Baines:
* DIV_ROUND_UP is doing the wrong thing, we'll end up using the last fractional range of minors which we shouldn't.
* Documentation/devices.txt update
* No need to compute max_devices twice, just do it at runtime.
* Permission fix for the module_param -- it's readonly.
Documentation/devices.txt | 6 ++++++ drivers/mmc/card/Kconfig | 17 +++++++++++++++++ drivers/mmc/card/block.c | 41 ++++++++++++++++++++++++++++++----------- 3 files changed, 53 insertions(+), 11 deletions(-)
Documentation/devices.txt +6 -0
@@ -2518,6 +2518,12 @@ Your cooperation is appreciated. 8 = /dev/mmcblk1 Second SD/MMC card ... + The start of next SD/MMC card can be configured with + CONFIG_MMC_BLOCK_MINORS, or overridden at boot/modprobe + time using the mmcblk.perdev_minors option. That would + bump the offset between each card to be the configured + value instead of the default 8. + 179 char CCube DVXChip-based PCI products 0 = /dev/dvxirq0 First DVX device 1 = /dev/dvxirq1 Second DVX device
drivers/mmc/card/Kconfig +17 -0
@@ -14,6 +14,23 @@ config MMC_BLOCK mount the filesystem. Almost everyone wishing MMC support should say Y or M here. +config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 256 + default 8 + help + Number of minors per block device. One is needed for every + partition on the disk (plus one for the whole disk). + + Number of total MMC minors available is 256, so your number + of supported block devices will be limited to 256 divided + by this number. + + Default is 8 to be backwards compatible with previous + hardwired device numbering. + + If unsure, say 8 here. + config MMC_BLOCK_BOUNCE bool "Use bounce buffer for simple hosts" depends on MMC_BLOCK
drivers/mmc/card/block.c +30 -11
95 lines not on this page · raw message
Signature · 1 line
1.5.6.5
sys_init_module system call
hi all
I find sys_init_module system call in kernel/module.c file. but it did not find any.
the source code version is linux-2.6.35
does the kernel have changed?
the book I am reading is LDD 3rd edition
Signature · 3 lines
/**************************************** http://runcoderen.wordpress.com/ ****************************************/
Re: sys_init_module system call
Quoted 8 lines · On Sat, 21 Aug 2010 06:18:04 +0800 runcoderen wrote:
hi all
I findsys_init_modulesystem call inkernel/module.cfile. but it did not find any.
the source code version is linux-2.6.35does the kernel have changed?
the book I am reading is LDD 3rd edition
You won't find a function in kernel/module.c that looks like it has the name "sys_init_module". Instead, the function is defined by using a macro, and it looks like this:
/* This is where the real work happens */ SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
{
The use of SYSCALL_DEFINEx(func_name, args) is a fairly recent change (well, January, 2009) that may be the reason why you think that there has been a change. See
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1a94bc34768e463a93cb3751819709ab0ea80a01
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
Re: sys_init_module system call
hi Randy:
yes, it does!
Thanks a lot!
runcoderen
Quoted 31 lines · 在 2010-08-20五的 15:32 -0700,Randy Dunlap写道:
Quoted 8 lines · On Sat, 21 Aug 2010 06:18:04 +0800 runcoderen wrote:
hi all
I findsys_init_modulesystem call inkernel/module.cfile. but it did not find any.
the source code version is linux-2.6.35does the kernel have changed?
the book I am reading is LDD 3rd edition
You won't find a function in
kernel/module.cthat looks like it has the name "sys_init_module". Instead, the function is defined by using a macro, and it looks like this:/* This is where the real work happens */ SYSCALL_DEFINE3(init_module, void
__user*, umod,
unsigned long, len, const char__user*, uargs)
{The use of
SYSCALL_DEFINEx(func_name, args)is a fairly recent change (well, January, 2009) that may be the reason why you think that there has been a change. See
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1a94bc34768e463a93cb3751819709ab0ea80a01---
~Randy
*** Remember to useDocumentation/SubmitChecklistwhen testing your code ***
Signature · 3 lines
/**************************************** http://runcoderen.wordpress.com/ ****************************************/
Re: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
In reply to Olof JohanssonHi,
Quoted 190 lines · Olof Johansson
The old limit of number of minor numbers per mmcblk device was hardcoded at 8. This isn't enough for some of the more elaborate partitioning schemes, for example those used by Chrome OS.
Since there might be a bunch of systems out there with static /dev contents that relies on the old numbering scheme, let's make it a build-time option with the default set to the previous 8.
Also provide a boot/modprobe-time parameter to override the config
default: mmcblk.perdev_minors.Signed-off-by Olof Johansson <[email protected]>Cc Mandeep Baines <[email protected]>---
Andrew, sorry for the churn but Mandeep had a couple of good points that needed addressing.
Changes since v1:
* Runtime override of config default
* Better help text
*DIV_ROUND_UPformax_devicescalculation
* Clarify mmcblk device count limitationsChanges since v2 based on feedback from Mandeep Baines:
*DIV_ROUND_UPis doing the wrong thing, we'll end up using the last fractional range of minors which we shouldn't.
*Documentation/devices.txtupdate
* No need to computemax_devicestwice, just do it at runtime.
* Permission fix for themodule_param-- it's readonly.Documentation/devices.txt | 6 ++++++
drivers/mmc/card/Kconfig| 17 +++++++++++++++++drivers/mmc/card/block.c| 41 ++++++++++++++++++++++++++++++-----------3 files changed, 53 insertions(+), 11 deletions(-)Documentation/devices.txt +0
-0@@ -2518,6 +2518,12 @@ Your cooperation is appreciated.8 =
/dev/mmcblk1Second SD/MMC card
...+ The start of next SD/MMC card can be configured with
+CONFIG_MMC_BLOCK_MINORS, or overridden at boot/modprobe
+ time using the mmcblk.perdev_minors option. That would
+ bump the offset between each card to be the configured
+ value instead of the default 8.
+
179 char CCube DVXChip-based PCI products
0 =/dev/dvxirq0First DVX device
1 =/dev/dvxirq1Second DVX devicedrivers/mmc/card/Kconfig +0
-0@@ -14,6 +14,23 @@ config MMC_BLOCKmount the filesystem. Almost everyone wishing MMC support should say Y or M here.
drivers/mmc/card/Kconfig +17
-0+config MMC_BLOCK_MINORS + int "Number of minors per block device" + range 4 256 + default 8 + help + Number of minors per block device. One is needed for every + partition on the disk (plus one for the whole disk). + + Number of total MMC minors available is 256, so your number + of supported block devices will be limited to 256 divided + by this number. + + Default is 8 to be backwards compatible with previous + hardwired device numbering. + + If unsure, say 8 here. +config
MMC_BLOCK_BOUNCE
bool "Use bounce buffer for simple hosts"
depends onMMC_BLOCKdrivers/mmc/card/block.c +30
-12@@ -43,14 +43,26 @@ #include "queue.h" MODULE_ALIAS("mmc:block"); +#ifdef MODULE_PARAM_PREFIX +#undef MODULE_PARAM_PREFIX +#endif +#define MODULE_PARAM_PREFIX "mmcblk." + + +/* +* The defaults come from config options but can be overriden by module +* or bootarg options. +*/ +static int perdev_minors =CONFIG_MMC_BLOCK_MINORS ; /* -* max 8 partitions per card +* We've only got one major, so number of mmcblk devices is +* limited to 256 / number of minors per device. */ -#define MMC_SHIFT 3 -#define MMC_NUM_MINORS (256 >> MMC_SHIFT) +static int max_devices; -static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS); +/* 256 minors, so at most 256 separate devices */ +static DECLARE_BITMAP(dev_use, 256); /** There is one mmc_blk_data per slot. @@ -66,6 +78,9 @@ struct mmc_blk_data { static DEFINE_MUTEX(open_lock); +module_param (perdev_minors, int,0444 ); +MODULE_PARM_DESC (perdev_minors,"Minors numbers to allocate per device" ); + static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk) { struct mmc_blk_data *md;@@ -87,10 +102,10 @@ static void mmc_blk_put(struct mmc_blk_data *md) md->usage--; if (md->usage == 0) { int devmaj = MAJOR(disk_devt(md->disk)); - int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT; + int devidx = MINOR(disk_devt(md->disk)) / perdev_minors; if (!devmaj) - devidx = md->disk->first_minor >> MMC_SHIFT; + devidx = md->disk->first_minor / perdev_minors; blk_cleanup_queue(md->queue.queue);@@ -482,8 +497,8 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) struct mmc_blk_data *md; int devidx, ret; - devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS); - if (devidx >= MMC_NUM_MINORS) + devidx = find_first_zero_bit(dev_use, max_devices); + if (devidx >= max_devices) return ERR_PTR(-ENOSPC); __set_bit(devidx, dev_use);@@ -500,7 +515,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)*/ md->read_only = mmc_blk_readonly(card); - md->disk = alloc_disk(1 << MMC_SHIFT); + md->disk = alloc_disk(perdev_minors); if (md->disk == NULL) { ret = -ENOMEM; goto err_kfree;@@ -517,7 +532,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) md->queue.data = md; md->disk->major = MMC_BLOCK_MAJOR; - md->disk->first_minor = devidx << MMC_SHIFT; + md->disk->first_minor = devidx * perdev_minors; md->disk->fops = &mmc_bdops; md->disk->private_data = md; md->disk->queue = md->queue.queue;@@ -593,7 +608,6 @@ static int mmc_blk_probe(struct mmc_card *card) { struct mmc_blk_data *md; int err; - char cap_str[10]; /*@@ -683,6 +697,11 @@ static int __init mmc_blk_init(void) { int res; + if (perdev_minors != CONFIG_MMC_BLOCK_MINORS) + pr_info("mmcblk: using %d minors per device\n", perdev_minors); + + max_devices = 256 / perdev_minors; + res = register_blkdev(MMC_BLOCK_MAJOR, "mmc"); if (res) goto out; --
Quoted 2 lines
1.5.6.5
The patch's purpose is good. As modern sd&mmc is used to host the file system, the 8 partition limitation is becoming a kind of bottleneck... But why not just add GENHD_FL_EXT_DEVT flag to allow mmc use extended partition numbers?
Like this modification?
drivers/mmc/card/block.c +0 -0
@@ -557,6 +557,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct
mmc_card *card)
md->disk->private_data = md;
md->disk->queue = md->queue.queue;
md->disk->driverfs_dev = &card->dev;+ md->disk->flags |= GENHD_FL_EXT_DEVT;
/*
* As discussed on lkml, GENHD_FL_REMOVABLE should:
Best regards,
Lei
Re: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
Hi,
Quoted 4 lines · Lei Wen
The patch's purpose is good. As modern sd&mmc is used to host the file system, the 8 partition limitation is becoming a kind of bottleneck... But why not just add
GENHD_FL_EXT_DEVTflag to allow mmc use extended partition numbers?
No need to quote the whole patch next time. :)
Given that MMC is sometimes used in deeply embedded environments where udev might not be running to take care of dynamic device numbering, I chose to stay with a static layout.
I could be convinced otherwise though. It would cause some additional hassles for me since we start udev lateish during boot and have a prepopulated /dev before that, but that can be dealt with.
-Olof
Re: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
Quoted 9 lines · Olof Johansson
Quoted 4 lines · Lei Wen
The patch's purpose is good. As modern sd&mmc is used to host the file system, the 8 partition limitation is becoming a kind of bottleneck... But why not just add
GENHD_FL_EXT_DEVTflag to allow mmc use extended partition numbers?No need to quote the whole patch next time. :)
Quoted 7 lines
Given that MMC is sometimes used in deeply embedded environments where udev might not be running to take care of dynamic device numbering, I chose to stay with a static layout.
I could be convinced otherwise though. It would cause some additional hassles for me since we start udev lateish during boot and have a prepopulated /dev before that, but that can be dealt with.
I think the extended number are only used for stuff larger than the static 8?
Apart from that, you can not reliably or securely use a static /dev these days, you never know which device you talk to, because the kernel has far too many dynamically assigned numbers. For that reason, most embedded setups use the busybox hack to populate /dev. Recent kernels have a devfs again, and there is no reason today to continue any static /dev experiments -- unless someone is going over the entire tree and fixes all the dynamic assignments, which is unlikely to happen ever.
Kay
Re: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
Quoted 14 lines · Kay Sievers
Quoted 13 lines · Olof Johansson
Quoted 4 lines · Lei Wen
The patch's purpose is good. As modern sd&mmc is used to host the file system, the 8 partition limitation is becoming a kind of bottleneck... But why not just add
GENHD_FL_EXT_DEVTflag to allow mmc use extended partition numbers?No need to quote the whole patch next time. :)
Given that MMC is sometimes used in deeply embedded environments where udev might not be running to take care of dynamic device numbering, I chose to stay with a static layout.
Quoted 5 lines
Quoted 3 lines
I could be convinced otherwise though. It would cause some additional hassles for me since we start udev lateish during boot and have a prepopulated /dev before that, but that can be dealt with.
I think the extended number are only used for stuff larger than the static 8?
Ah, yes, of course.
Quoted 8 lines
Apart from that, you can not reliably or securely use a static /dev these days, you never know which device you talk to, because the kernel has far too many dynamically assigned numbers. For that reason, most embedded setups use the busybox hack to populate /dev. Recent kernels have a devfs again, and there is no reason today to continue any static /dev experiments -- unless someone is going over the entire tree and fixes all the dynamic assignments, which is unlikely to happen ever.
Yeah, it's a weak argument but I wanted to go for the least surprising one for anyone who still relies on static numbering of mmc, since it's used as root device, etc.
But with the first 8 minors being the same as before, there's little reason to care about that -- the EXT_DEVT approach will actually be the smaller change, since it won't renumber anything, just extend in a different part of the address space.
Lei, want to submit a proper patch for it to replace mine?
-Olof
Re: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
Quoted 36 lines · Olof Johansson
Quoted 14 lines · Kay Sievers
Quoted 13 lines · Olof Johansson
Quoted 4 lines · Lei Wen
The patch's purpose is good. As modern sd&mmc is used to host the file system, the 8 partition limitation is becoming a kind of bottleneck... But why not just add
GENHD_FL_EXT_DEVTflag to allow mmc use extended partition numbers?No need to quote the whole patch next time. :)
Given that MMC is sometimes used in deeply embedded environments where udev might not be running to take care of dynamic device numbering, I chose to stay with a static layout.
Quoted 5 lines
Quoted 3 lines
I could be convinced otherwise though. It would cause some additional hassles for me since we start udev lateish during boot and have a prepopulated /dev before that, but that can be dealt with.
I think the extended number are only used for stuff larger than the static 8?
Ah, yes, of course.
Quoted 8 lines
Apart from that, you can not reliably or securely use a static /dev these days, you never know which device you talk to, because the kernel has far too many dynamically assigned numbers. For that reason, most embedded setups use the busybox hack to populate /dev. Recent kernels have a devfs again, and there is no reason today to continue any static /dev experiments -- unless someone is going over the entire tree and fixes all the dynamic assignments, which is unlikely to happen ever.
Yeah, it's a weak argument but I wanted to go for the least surprising one for anyone who still relies on static numbering of mmc, since it's used as root device, etc.
Quoted 6 lines
But with the first 8 minors being the same as before, there's little reason to care about that -- the
EXT_DEVTapproach will actually be the smaller change, since it won't renumber anything, just extend in a different part of the address space.Lei, want to submit a proper patch for it to replace mine?
I have a tested patch for this. It also cleans up the connection between devidx and minor numbers. I'll send it shortly.
PATCH 1/1 mmc_block: Allow more than 8 partitions per card
Set the GENHD_FL_EXT_DEVT flag, which will allocate minor numbers in major 259 for partitions past disk->minors.
Also remove the use of disk_devt to determine devidx from md->disk. md->disk->first_minor is always initialized from devidx and can always be used to recover it.
--- drivers/mmc/card/block.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)
drivers/mmc/card/block.c +2 -5
@@ -87,11 +87,7 @@ static void mmc_blk_put(struct mmc_blk_data *md)mutex_lock (&open_lock); md->usage--;if (md->usage ==0 ) { -int devmaj =MAJOR (disk_devt (md->disk)); -int devidx =MINOR (disk_devt (md->disk)) >>MMC_SHIFT ; - -if (!devmaj) - devidx = md->disk->first_minor >>MMC_SHIFT ; +int devidx = md->disk->first_minor >>MMC_SHIFT ;blk_cleanup_queue (md->queue.queue);
@@ -607,6 +603,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) md->disk->private_data = md; md->disk->queue = md->queue.queue; md->disk->driverfs_dev = &card->dev; + md->disk->flags =GENHD_FL_EXT_DEVT ;/* * As discussed on lkml, GENHD_FL_REMOVABLE should:
Signature · 1 line
1.7.1
Re: [PATCH] mmc_block: Allow more than 8 partitions per card
Quoted 38 lines · Colin Cross
Set the
GENHD_FL_EXT_DEVTflag, which will allocate minor numbers in major 259 for partitions pastdisk->minors.Also remove the use of
disk_devtto determine devidx frommd->disk.md->disk->first_minoris always initialized from devidx and can always be used to recover it.Signed-off-by Colin Cross <[email protected]>---
drivers/mmc/card/block.c | 7 ++-----1 files changed, 2 insertions(+), 5 deletions(-)drivers/mmc/card/block.c +2
-6@@ -87,11 +87,7 @@ static void mmc_blk_put(struct mmc_blk_data *md) mutex_lock(&open_lock); md->usage--; if (md->usage == 0) { - int devmaj = MAJOR(disk_devt(md->disk)); - int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT; - - if (!devmaj) - devidx = md->disk->first_minor >> MMC_SHIFT; + int devidx = md->disk->first_minor >> MMC_SHIFT; blk_cleanup_queue(md->queue.queue);@@ -607,6 +603,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) md->disk->private_data = md; md->disk->queue = md->queue.queue; md->disk->driverfs_dev = &card->dev; + md->disk->flags = GENHD_FL_EXT_DEVT; /** As discussed on lkml, GENHD_FL_REMOVABLE should: --
Quoted 2 lines
1.7.1
Looks good to me.
Re: [PATCH] mmc_block: Allow more than 8 partitions per card
In reply to Colin CrossQuoted 6 lines · ext Colin Cross
Set the
GENHD_FL_EXT_DEVTflag, which will allocate minor numbers in major 259 for partitions pastdisk->minors.Also remove the use of
disk_devtto determine devidx frommd->disk.md->disk->first_minoris always initialized from devidx and can always be used to recover it.
Yeah, but it is a bit weird. It seems to me that devidx should just be a member of struct mmc_blk_data.
Doesn't look like devidx is cleared in all the error paths out of mmc_blk_alloc() either, if you want something else to do ;-)
Quoted 31 lines
Signed-off-by Colin Cross <[email protected]>--- drivers/mmc/card/block.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)drivers/mmc/card/block.c +2
-5@@ -87,11 +87,7 @@ static void mmc_blk_put(struct mmc_blk_data *md)mutex_lock (&open_lock); md->usage--;if (md->usage ==0 ) { -int devmaj =MAJOR (disk_devt (md->disk)); -int devidx =MINOR (disk_devt (md->disk)) >>MMC_SHIFT ; - -if (!devmaj) - devidx = md->disk->first_minor >>MMC_SHIFT ; +int devidx = md->disk->first_minor >>MMC_SHIFT ;blk_cleanup_queue (md->queue.queue);@@ -607,6 +603,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) md->disk->private_data = md; md->disk->queue = md->queue.queue; md->disk->driverfs_dev = &card->dev; + md->disk->flags =GENHD_FL_EXT_DEVT ;/* * As discussed on lkml, GENHD_FL_REMOVABLE should: