Skip to contentSkip to conversation

MMC block removable flag

PATCH In review Pierre Ossman 4 participants 9 messages Dec 30, 2004 – Jan 8, 2005 MMC, SD and SDIO

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 MMC block removable flag

A MMC card is a highly removable device. This patch makes the block layer part of the MMC layer set the removable flag.

--
Pierre

drivers/mmc/mmc_block.c +1 -0
Index: linux-wbsd/drivers/mmc/mmc_block.c
===================================================================
@@ -384,6 +384,7 @@
 		md->disk->private_data = md;
 		md->disk->queue = md->queue.queue;
 		md->disk->driverfs_dev = &card->dev;
+		md->disk->flags |= GENHD_FL_REMOVABLE;
 
 		sprintf(md->disk->disk_name, "mmcblk%d", devidx);
 		sprintf(md->disk->devfs_name, "mmc/blk%d", devidx);
#1 lore raw
Quoted 2 lines · Pierre Ossman

A MMC card is a highly removable device. This patch makes the block layer part of the MMC layer set the removable flag.

I have this patch also floating around, but I've decided it isn't needed. I believe this flag is to indicate that we have removable media for a block device rather than to indicate that the block device can be removed.

However, when we insert and remove a MMC card, we create and destroy the block device itself. Therefore, as far as the block layer is concerned, the device itself is being inserted and removed, so telling the block layer that the media is removable is just silly - you can't separate the flash media from the on-board MMC controller.

(Note: any block device can be removed - you just rmmod the module supplying the block device driver, but this doesn't mean we mark all block devices with GENHD_FL_REMOVABLE.)

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#2 lore raw
Quoted 17 lines · Russell King
Quoted 3 lines · Pierre Ossman

A MMC card is a highly removable device. This patch makes the block layer part of the MMC layer set the removable flag.

I have this patch also floating around, but I've decided it isn't needed. I believe this flag is to indicate that we have removable media for a block device rather than to indicate that the block device can be removed.

However, when we insert and remove a MMC card, we create and destroy the block device itself. Therefore, as far as the block layer is concerned, the device itself is being inserted and removed, so telling the block layer that the media is removable is just silly - you can't separate the flash media from the on-board MMC controller.

Quoted 6 lines

(Note: any block device can be removed - you just rmmod the module supplying the block device driver, but this doesn't mean we mark all block devices with GENHD_FL_REMOVABLE.)

I suspect that the removable flag might be used in different GUI:s to figure out with block devices should be presented to the user in a nice way. It's usually just the removable devices that need some form of special handling. So even though, as you point out, the entire device disappears it might be useful from a user interface perspective to have this hint set. From what I've found this flag doesn't seem to change any handling inside the kernel, just how the device should be perceived.

Rgds
Pierre

#3 lore raw
Quoted 19 lines · Pierre Ossman
Quoted 14 lines · Russell King
Quoted 2 lines · Pierre Ossman

A MMC card is a highly removable device. This patch makes the block layer part of the MMC layer set the removable flag.

I have this patch also floating around, but I've decided it isn't needed. I believe this flag is to indicate that we have removable media for a block device rather than to indicate that the block device can be removed.

However, when we insert and remove a MMC card, we create and destroy the block device itself. Therefore, as far as the block layer is concerned, the device itself is being inserted and removed, so telling the block layer that the media is removable is just silly - you can't separate the flash media from the on-board MMC controller.

Quoted 3 lines

(Note: any block device can be removed - you just rmmod the module supplying the block device driver, but this doesn't mean we mark all block devices with GENHD_FL_REMOVABLE.)

Quoted 7 lines

I suspect that the removable flag might be used in different GUI:s to figure out with block devices should be presented to the user in a nice way. It's usually just the removable devices that need some form of special handling. So even though, as you point out, the entire device disappears it might be useful from a user interface perspective to have this hint set. From what I've found this flag doesn't seem to change any handling inside the kernel, just how the device should be perceived.

Can anyone comment on the purpose of this (GENHD_FL_REMOVABLE) flag? Al? Jens?

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#4 lore raw
Quoted 28 lines · Russell King
Quoted 19 lines · Pierre Ossman
Quoted 14 lines · Russell King
Quoted 2 lines · Pierre Ossman

A MMC card is a highly removable device. This patch makes the block layer part of the MMC layer set the removable flag.

I have this patch also floating around, but I've decided it isn't needed. I believe this flag is to indicate that we have removable media for a block device rather than to indicate that the block device can be removed.

However, when we insert and remove a MMC card, we create and destroy the block device itself. Therefore, as far as the block layer is concerned, the device itself is being inserted and removed, so telling the block layer that the media is removable is just silly - you can't separate the flash media from the on-board MMC controller.

Quoted 3 lines

(Note: any block device can be removed - you just rmmod the module supplying the block device driver, but this doesn't mean we mark all block devices with GENHD_FL_REMOVABLE.)

Quoted 7 lines

I suspect that the removable flag might be used in different GUI:s to figure out with block devices should be presented to the user in a nice way. It's usually just the removable devices that need some form of special handling. So even though, as you point out, the entire device disappears it might be useful from a user interface perspective to have this hint set. From what I've found this flag doesn't seem to change any handling inside the kernel, just how the device should be perceived.

Quoted 2 lines

Can anyone comment on the purpose of this (GENHD_FL_REMOVABLE) flag? Al? Jens?

GENHD_FL_REMOVABLE is set by a number of drivers (floppy, CDROM, ...). It is used in two places:
(1) to fill the file /sys/block/*/removable
(2) in genhd to suppress listing a nonpartitioned removable device in /proc/partitions.

In other words, it is for user space only, precisely as Pierre Ossman said.

Andries

#5 lore raw
Quoted 11 lines · Andries Brouwer
Quoted 2 lines · Russell King

Can anyone comment on the purpose of this (GENHD_FL_REMOVABLE) flag? Al? Jens?

GENHD_FL_REMOVABLE is set by a number of drivers (floppy, CDROM, ...). It is used in two places:
(1) to fill the file /sys/block/*/removable
(2) in genhd to suppress listing a nonpartitioned removable device in /proc/partitions.

In other words, it is for user space only, precisely as Pierre Ossman said.

Your point 2 isn't user space though.

Also, it's buggy. Consider a SCSI PCMCIA card with SCSI disks attached. When you eject that card, your SCSI disks disappear, yet they aren't marked as removable. If user space is relying on /sys/block/*/removable to tell it if things may go away, then user space is buggy.

Maybe it's for devices which may be present (eg, floppy driver), but which have removable media (eg, floppy disk), rather than removable devices?

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#6 lore raw
Quoted 6 lines · Russell King

Your point 2 isn't user space though.

Also, it's buggy. Consider a SCSI PCMCIA card with SCSI disks attached. When you eject that card, your SCSI disks disappear, yet they aren't marked as removable. If user space is relying on /sys/block/*/removable to tell it if things may go away, then user space is buggy.

It means removable media. The actual device can disappear for just about any driver these days, considering pci hotplug or PCMCIA or usb or..

Quoted 3 lines

Maybe it's for devices which may be present (eg, floppy driver), but which have removable media (eg, floppy disk), rather than removable devices?

Yes. Else there would be very little driver that don't set the flag.

#7 lore raw
Quoted 8 lines · Christoph Hellwig
Quoted 6 lines · Russell King

Your point 2 isn't user space though.

Also, it's buggy. Consider a SCSI PCMCIA card with SCSI disks attached. When you eject that card, your SCSI disks disappear, yet they aren't marked as removable. If user space is relying on /sys/block/*/removable to tell it if things may go away, then user space is buggy.

Quoted 8 lines

It means removable media. The actual device can disappear for just about any driver these days, considering pci hotplug or PCMCIA or usb or..

Quoted 3 lines

Maybe it's for devices which may be present (eg, floppy driver), but which have removable media (eg, floppy disk), rather than removable devices?

Yes. Else there would be very little driver that don't set the flag.

Ok. So the requirement is:

(a) removable media with permanent block devices should set this flag.
(b) removable block devices with permanent media should not set this flag.

MMC is definitely case (b) - the block device is created and destroyed when the card is inserted and removed, since the block device corresponds to the controller on the card rather than the MMC host adapter. The media is permanently attached to the on-board controller.

Therefore, it would be incorrect for the MMC block device driver to set the "removable" flag.

I guess we now find out how many user applications incorrectly interpret this flag as meaning "this device may be user removable".

Maybe this needs documenting in Documentation/block so that everyone knows what this flag is supposed to represent ?

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#8 lore raw
In reply to Russell King
Quoted 11 lines · Russell King
Quoted 10 lines · Andries Brouwer
Quoted 2 lines · Russell King

Can anyone comment on the purpose of this (GENHD_FL_REMOVABLE) flag? Al? Jens?

GENHD_FL_REMOVABLE is set by a number of drivers (floppy, CDROM, ...). It is used in two places:
(1) to fill the file /sys/block/*/removable
(2) in genhd to suppress listing a nonpartitioned removable device in /proc/partitions.

Quoted 3 lines
Quoted 1 line

In other words, it is for user space only, precisely as Pierre Ossman said.

Your point 2 isn't user space though.

?? (1) Is about filling /sys/... and (2) about filling /proc/... Both only have info for user space. The kernel does not react to this flag.

Quoted 4 lines

Also, it's buggy. Consider a SCSI PCMCIA card with SCSI disks attached. When you eject that card, your SCSI disks disappear, yet they aren't marked as removable. If user space is relying on /sys/block/*/removable to tell it if things may go away, then user space is buggy.

I think user space is pragmatic rather than correct. When undesirable things happen someone will complain, and the problem will be corrected somehow.

The distinction removable / non-removable is too primitive, there are many variations involving chains of devices.

Quoted 3 lines

Maybe it's for devices which may be present (eg, floppy driver), but which have removable media (eg, floppy disk), rather than removable devices?

I told you what it does. But you ask what it is intended for. Then you must go to the person who first introduced it. I guess that might have been Richard Gooch. The flag came in in patch-2.3.46 with devfs. If it is was set, devfs would set DEVFS_FL_REMOVABLE.

+- Added DEVFS_FL_REMOVABLE flag
+

+- Check for disc change when listing directories with
+  removable media devices

One has code like

+ if (flags & DEVFS_FL_REMOVABLE)
+ {
+ de->u.fcb.removable = TRUE;
+ ++de->parent->u.dir.num_removable;
+ }

and

+static void scan_dir_for_removable (struct devfs_entry *dir)

+/*  [SUMMARY] Scan a directory for removable media devices and check media.
+    <dir> The directory.
+    [RETURNS] Nothing.

+*/
+{
+ struct devfs_entry *de;
+

+    if (dir->u.dir.num_removable < 1) return;
+    for (de = dir->u.dir.first; de != NULL; de = de->next)
+    {
+       if (!de->registered) continue;
+       if ( !S_ISBLK (de->mode) ) continue;
+       if (!de->u.fcb.removable) continue;
+       check_disc_changed (de);

+ }
+} /* End Function scan_dir_for_removable */

So here you have it. It is a devfs thing and could have been removed when devfs was removed. However, today it is exported in sysfs, and one must worry about possible users in user space.

Andries