mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-12 05:48:39 +08:00
[PARTITION]: Add whole_disk attribute.
Some partitioning systems create special partitions that span the entire disk. One example are Sun partitions, and this whole-disk partition exists to tell the firmware the extent of the entire device so it can load the boot block and do other things. Such partitions should not be treated as normal partitions, because all the other partitions overlap this whole-disk one. So we'd see multiple instances of the same UUID etc. which we do not want. udev and friends can thus search for this 'whole_disk' attribute and use it to decide to ignore the partition. Signed-off-by: Fabio Massimo Di Nitto <fabbione@ubuntu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
66efc5a7e3
commit
d18d7682c1
@ -61,7 +61,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* all seems OK */
|
/* all seems OK */
|
||||||
add_partition(disk, part, start, length);
|
add_partition(disk, part, start, length, ADDPART_FLAG_NONE);
|
||||||
mutex_unlock(&bdev->bd_mutex);
|
mutex_unlock(&bdev->bd_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
case BLKPG_DEL_PARTITION:
|
case BLKPG_DEL_PARTITION:
|
||||||
|
@ -365,7 +365,7 @@ void delete_partition(struct gendisk *disk, int part)
|
|||||||
kobject_put(&p->kobj);
|
kobject_put(&p->kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
|
void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags)
|
||||||
{
|
{
|
||||||
struct hd_struct *p;
|
struct hd_struct *p;
|
||||||
|
|
||||||
@ -390,6 +390,15 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
|
|||||||
if (!disk->part_uevent_suppress)
|
if (!disk->part_uevent_suppress)
|
||||||
kobject_uevent(&p->kobj, KOBJ_ADD);
|
kobject_uevent(&p->kobj, KOBJ_ADD);
|
||||||
sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem");
|
sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem");
|
||||||
|
if (flags & ADDPART_FLAG_WHOLEDISK) {
|
||||||
|
static struct attribute addpartattr = {
|
||||||
|
.name = "whole_disk",
|
||||||
|
.mode = S_IRUSR | S_IRGRP | S_IROTH,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
};
|
||||||
|
|
||||||
|
sysfs_create_file(&p->kobj, &addpartattr);
|
||||||
|
}
|
||||||
partition_sysfs_add_subdir(p);
|
partition_sysfs_add_subdir(p);
|
||||||
disk->part[part-1] = p;
|
disk->part[part-1] = p;
|
||||||
}
|
}
|
||||||
@ -543,9 +552,9 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
|||||||
printk(" %s: p%d exceeds device capacity\n",
|
printk(" %s: p%d exceeds device capacity\n",
|
||||||
disk->disk_name, p);
|
disk->disk_name, p);
|
||||||
}
|
}
|
||||||
add_partition(disk, p, from, size);
|
add_partition(disk, p, from, size, state->parts[p].flags);
|
||||||
#ifdef CONFIG_BLK_DEV_MD
|
#ifdef CONFIG_BLK_DEV_MD
|
||||||
if (state->parts[p].flags)
|
if (state->parts[p].flags & ADDPART_FLAG_RAID)
|
||||||
md_autodetect_dev(bdev->bd_dev+p);
|
md_autodetect_dev(bdev->bd_dev+p);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -155,7 +155,7 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev,
|
|||||||
|
|
||||||
put_partition(state, state->next, next, size);
|
put_partition(state, state->next, next, size);
|
||||||
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
||||||
state->parts[state->next].flags = 1;
|
state->parts[state->next].flags = ADDPART_FLAG_RAID;
|
||||||
loopct = 0;
|
loopct = 0;
|
||||||
if (++state->next == state->limit)
|
if (++state->next == state->limit)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -72,7 +72,7 @@ int sgi_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|||||||
if (blocks) {
|
if (blocks) {
|
||||||
put_partition(state, slot, start, blocks);
|
put_partition(state, slot, start, blocks);
|
||||||
if (be32_to_cpu(p->type) == LINUX_RAID_PARTITION)
|
if (be32_to_cpu(p->type) == LINUX_RAID_PARTITION)
|
||||||
state->parts[slot].flags = 1;
|
state->parts[slot].flags = ADDPART_FLAG_RAID;
|
||||||
}
|
}
|
||||||
slot++;
|
slot++;
|
||||||
}
|
}
|
||||||
|
@ -80,8 +80,11 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|||||||
num_sectors = be32_to_cpu(p->num_sectors);
|
num_sectors = be32_to_cpu(p->num_sectors);
|
||||||
if (num_sectors) {
|
if (num_sectors) {
|
||||||
put_partition(state, slot, st_sector, num_sectors);
|
put_partition(state, slot, st_sector, num_sectors);
|
||||||
|
state->parts[slot].flags = 0;
|
||||||
if (label->infos[i].id == LINUX_RAID_PARTITION)
|
if (label->infos[i].id == LINUX_RAID_PARTITION)
|
||||||
state->parts[slot].flags = 1;
|
state->parts[slot].flags |= ADDPART_FLAG_RAID;
|
||||||
|
if (label->infos[i].id == SUN_WHOLE_DISK)
|
||||||
|
state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
|
||||||
}
|
}
|
||||||
slot++;
|
slot++;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@ enum {
|
|||||||
LINUX_EXTENDED_PARTITION = 0x85,
|
LINUX_EXTENDED_PARTITION = 0x85,
|
||||||
WIN98_EXTENDED_PARTITION = 0x0f,
|
WIN98_EXTENDED_PARTITION = 0x0f,
|
||||||
|
|
||||||
|
SUN_WHOLE_DISK = DOS_EXTENDED_PARTITION,
|
||||||
|
|
||||||
LINUX_SWAP_PARTITION = 0x82,
|
LINUX_SWAP_PARTITION = 0x82,
|
||||||
LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */
|
LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */
|
||||||
|
|
||||||
@ -400,10 +402,14 @@ struct unixware_disklabel {
|
|||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#define ADDPART_FLAG_NONE 0
|
||||||
|
#define ADDPART_FLAG_RAID 1
|
||||||
|
#define ADDPART_FLAG_WHOLEDISK 2
|
||||||
|
|
||||||
char *disk_name (struct gendisk *hd, int part, char *buf);
|
char *disk_name (struct gendisk *hd, int part, char *buf);
|
||||||
|
|
||||||
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
|
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||||
extern void add_partition(struct gendisk *, int, sector_t, sector_t);
|
extern void add_partition(struct gendisk *, int, sector_t, sector_t, int);
|
||||||
extern void delete_partition(struct gendisk *, int);
|
extern void delete_partition(struct gendisk *, int);
|
||||||
|
|
||||||
extern struct gendisk *alloc_disk_node(int minors, int node_id);
|
extern struct gendisk *alloc_disk_node(int minors, int node_id);
|
||||||
|
Loading…
Reference in New Issue
Block a user