|
@@ -154,7 +154,7 @@ struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter)
|
|
part = rcu_dereference(ptbl->part[piter->idx]);
|
|
part = rcu_dereference(ptbl->part[piter->idx]);
|
|
if (!part)
|
|
if (!part)
|
|
continue;
|
|
continue;
|
|
- if (!part->nr_sects &&
|
|
|
|
|
|
+ if (!part_nr_sects_read(part) &&
|
|
!(piter->flags & DISK_PITER_INCL_EMPTY) &&
|
|
!(piter->flags & DISK_PITER_INCL_EMPTY) &&
|
|
!(piter->flags & DISK_PITER_INCL_EMPTY_PART0 &&
|
|
!(piter->flags & DISK_PITER_INCL_EMPTY_PART0 &&
|
|
piter->idx == 0))
|
|
piter->idx == 0))
|
|
@@ -191,7 +191,7 @@ EXPORT_SYMBOL_GPL(disk_part_iter_exit);
|
|
static inline int sector_in_part(struct hd_struct *part, sector_t sector)
|
|
static inline int sector_in_part(struct hd_struct *part, sector_t sector)
|
|
{
|
|
{
|
|
return part->start_sect <= sector &&
|
|
return part->start_sect <= sector &&
|
|
- sector < part->start_sect + part->nr_sects;
|
|
|
|
|
|
+ sector < part->start_sect + part_nr_sects_read(part);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -769,8 +769,8 @@ void __init printk_all_partitions(void)
|
|
|
|
|
|
printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
|
|
printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
|
|
bdevt_str(part_devt(part), devt_buf),
|
|
bdevt_str(part_devt(part), devt_buf),
|
|
- (unsigned long long)part->nr_sects >> 1,
|
|
|
|
- disk_name(disk, part->partno, name_buf),
|
|
|
|
|
|
+ (unsigned long long)part_nr_sects_read(part) >> 1
|
|
|
|
+ , disk_name(disk, part->partno, name_buf),
|
|
uuid_buf);
|
|
uuid_buf);
|
|
if (is_part0) {
|
|
if (is_part0) {
|
|
if (disk->driverfs_dev != NULL &&
|
|
if (disk->driverfs_dev != NULL &&
|
|
@@ -862,7 +862,7 @@ static int show_partition(struct seq_file *seqf, void *v)
|
|
while ((part = disk_part_iter_next(&piter)))
|
|
while ((part = disk_part_iter_next(&piter)))
|
|
seq_printf(seqf, "%4d %7d %10llu %s\n",
|
|
seq_printf(seqf, "%4d %7d %10llu %s\n",
|
|
MAJOR(part_devt(part)), MINOR(part_devt(part)),
|
|
MAJOR(part_devt(part)), MINOR(part_devt(part)),
|
|
- (unsigned long long)part->nr_sects >> 1,
|
|
|
|
|
|
+ (unsigned long long)part_nr_sects_read(part) >> 1,
|
|
disk_name(sgp, part->partno, buf));
|
|
disk_name(sgp, part->partno, buf));
|
|
disk_part_iter_exit(&piter);
|
|
disk_part_iter_exit(&piter);
|
|
|
|
|
|
@@ -1268,6 +1268,16 @@ struct gendisk *alloc_disk_node(int minors, int node_id)
|
|
}
|
|
}
|
|
disk->part_tbl->part[0] = &disk->part0;
|
|
disk->part_tbl->part[0] = &disk->part0;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * set_capacity() and get_capacity() currently don't use
|
|
|
|
+ * seqcounter to read/update the part0->nr_sects. Still init
|
|
|
|
+ * the counter as we can read the sectors in IO submission
|
|
|
|
+ * patch using seqence counters.
|
|
|
|
+ *
|
|
|
|
+ * TODO: Ideally set_capacity() and get_capacity() should be
|
|
|
|
+ * converted to make use of bd_mutex and sequence counters.
|
|
|
|
+ */
|
|
|
|
+ seqcount_init(&disk->part0.nr_sects_seq);
|
|
hd_ref_init(&disk->part0);
|
|
hd_ref_init(&disk->part0);
|
|
|
|
|
|
disk->minors = minors;
|
|
disk->minors = minors;
|