diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-22 12:39:02 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-22 12:39:02 -0500 |
commit | fa675765afed59bb89adba3369094ebd428b930b (patch) | |
tree | 777a8c1bb48ef7de39073104f974209f4a462b6f /fs/super.c | |
parent | b00dc3ad74fdb676552d46ee573b88e927240d0c (diff) |
Revert mount/umount uevent removal
This change reverts the 033b96fd30db52a710d97b06f87d16fc59fee0f1 commit
from Kay Sievers that removed the mount/umount uevents from the kernel.
Some older versions of HAL still depend on these events to detect when a
new device has been mounted. These events are not correctly emitted,
and are broken by design, and so, should not be relied upon by any
future program. Instead, the /proc/mounts file should be polled to
properly detect this kind of event.
A feature-removal-schedule.txt entry has been added, noting when this
interface will be removed from the kernel.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/super.c')
-rw-r--r-- | fs/super.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/super.c b/fs/super.c index 30294218fa63..e20b5580afd5 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -666,6 +666,16 @@ static int test_bdev_super(struct super_block *s, void *data) | |||
666 | return (void *)s->s_bdev == data; | 666 | return (void *)s->s_bdev == data; |
667 | } | 667 | } |
668 | 668 | ||
669 | static void bdev_uevent(struct block_device *bdev, enum kobject_action action) | ||
670 | { | ||
671 | if (bdev->bd_disk) { | ||
672 | if (bdev->bd_part) | ||
673 | kobject_uevent(&bdev->bd_part->kobj, action); | ||
674 | else | ||
675 | kobject_uevent(&bdev->bd_disk->kobj, action); | ||
676 | } | ||
677 | } | ||
678 | |||
669 | struct super_block *get_sb_bdev(struct file_system_type *fs_type, | 679 | struct super_block *get_sb_bdev(struct file_system_type *fs_type, |
670 | int flags, const char *dev_name, void *data, | 680 | int flags, const char *dev_name, void *data, |
671 | int (*fill_super)(struct super_block *, void *, int)) | 681 | int (*fill_super)(struct super_block *, void *, int)) |
@@ -707,8 +717,10 @@ struct super_block *get_sb_bdev(struct file_system_type *fs_type, | |||
707 | up_write(&s->s_umount); | 717 | up_write(&s->s_umount); |
708 | deactivate_super(s); | 718 | deactivate_super(s); |
709 | s = ERR_PTR(error); | 719 | s = ERR_PTR(error); |
710 | } else | 720 | } else { |
711 | s->s_flags |= MS_ACTIVE; | 721 | s->s_flags |= MS_ACTIVE; |
722 | bdev_uevent(bdev, KOBJ_MOUNT); | ||
723 | } | ||
712 | } | 724 | } |
713 | 725 | ||
714 | return s; | 726 | return s; |
@@ -724,6 +736,7 @@ void kill_block_super(struct super_block *sb) | |||
724 | { | 736 | { |
725 | struct block_device *bdev = sb->s_bdev; | 737 | struct block_device *bdev = sb->s_bdev; |
726 | 738 | ||
739 | bdev_uevent(bdev, KOBJ_UMOUNT); | ||
727 | generic_shutdown_super(sb); | 740 | generic_shutdown_super(sb); |
728 | sync_blockdev(bdev); | 741 | sync_blockdev(bdev); |
729 | close_bdev_excl(bdev); | 742 | close_bdev_excl(bdev); |