block: move more code to early-lookup.c
blk_lookup_devt is only used by code in early-lookup.c, so move it there. printk_all_partitions and it's helper bdevt_str are only used by the early init code in init/do_mounts.c, so they should go there as well. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20230531125535.676098-17-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
702f3189e4
Коммит
7cadcaf1d8
|
@ -120,6 +120,35 @@ static int devt_from_partlabel(const char *label, dev_t *devt)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static dev_t blk_lookup_devt(const char *name, int partno)
|
||||
{
|
||||
dev_t devt = MKDEV(0, 0);
|
||||
struct class_dev_iter iter;
|
||||
struct device *dev;
|
||||
|
||||
class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
|
||||
while ((dev = class_dev_iter_next(&iter))) {
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
|
||||
if (strcmp(dev_name(dev), name))
|
||||
continue;
|
||||
|
||||
if (partno < disk->minors) {
|
||||
/* We need to return the right devno, even
|
||||
* if the partition doesn't exist yet.
|
||||
*/
|
||||
devt = MKDEV(MAJOR(dev->devt),
|
||||
MINOR(dev->devt) + partno);
|
||||
} else {
|
||||
devt = part_devt(disk, partno);
|
||||
if (devt)
|
||||
break;
|
||||
}
|
||||
}
|
||||
class_dev_iter_exit(&iter);
|
||||
return devt;
|
||||
}
|
||||
|
||||
static int devt_from_devname(const char *name, dev_t *devt)
|
||||
{
|
||||
int part;
|
||||
|
@ -222,3 +251,66 @@ int early_lookup_bdev(const char *name, dev_t *devt)
|
|||
return devt_from_devnum(name, devt);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(early_lookup_bdev);
|
||||
|
||||
static char __init *bdevt_str(dev_t devt, char *buf)
|
||||
{
|
||||
if (MAJOR(devt) <= 0xff && MINOR(devt) <= 0xff) {
|
||||
char tbuf[BDEVT_SIZE];
|
||||
snprintf(tbuf, BDEVT_SIZE, "%02x%02x", MAJOR(devt), MINOR(devt));
|
||||
snprintf(buf, BDEVT_SIZE, "%-9s", tbuf);
|
||||
} else
|
||||
snprintf(buf, BDEVT_SIZE, "%03x:%05x", MAJOR(devt), MINOR(devt));
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
* print a full list of all partitions - intended for places where the root
|
||||
* filesystem can't be mounted and thus to give the victim some idea of what
|
||||
* went wrong
|
||||
*/
|
||||
void __init printk_all_partitions(void)
|
||||
{
|
||||
struct class_dev_iter iter;
|
||||
struct device *dev;
|
||||
|
||||
class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
|
||||
while ((dev = class_dev_iter_next(&iter))) {
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
struct block_device *part;
|
||||
char devt_buf[BDEVT_SIZE];
|
||||
unsigned long idx;
|
||||
|
||||
/*
|
||||
* Don't show empty devices or things that have been
|
||||
* suppressed
|
||||
*/
|
||||
if (get_capacity(disk) == 0 || (disk->flags & GENHD_FL_HIDDEN))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Note, unlike /proc/partitions, I am showing the numbers in
|
||||
* hex - the same format as the root= option takes.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
xa_for_each(&disk->part_tbl, idx, part) {
|
||||
if (!bdev_nr_sectors(part))
|
||||
continue;
|
||||
printk("%s%s %10llu %pg %s",
|
||||
bdev_is_partition(part) ? " " : "",
|
||||
bdevt_str(part->bd_dev, devt_buf),
|
||||
bdev_nr_sectors(part) >> 1, part,
|
||||
part->bd_meta_info ?
|
||||
part->bd_meta_info->uuid : "");
|
||||
if (bdev_is_partition(part))
|
||||
printk("\n");
|
||||
else if (dev->parent && dev->parent->driver)
|
||||
printk(" driver: %s\n",
|
||||
dev->parent->driver->name);
|
||||
else
|
||||
printk(" (driver?)\n");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
class_dev_iter_exit(&iter);
|
||||
}
|
||||
|
|
|
@ -318,18 +318,6 @@ void blk_free_ext_minor(unsigned int minor)
|
|||
ida_free(&ext_devt_ida, minor);
|
||||
}
|
||||
|
||||
static char *bdevt_str(dev_t devt, char *buf)
|
||||
{
|
||||
if (MAJOR(devt) <= 0xff && MINOR(devt) <= 0xff) {
|
||||
char tbuf[BDEVT_SIZE];
|
||||
snprintf(tbuf, BDEVT_SIZE, "%02x%02x", MAJOR(devt), MINOR(devt));
|
||||
snprintf(buf, BDEVT_SIZE, "%-9s", tbuf);
|
||||
} else
|
||||
snprintf(buf, BDEVT_SIZE, "%03x:%05x", MAJOR(devt), MINOR(devt));
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
void disk_uevent(struct gendisk *disk, enum kobject_action action)
|
||||
{
|
||||
struct block_device *part;
|
||||
|
@ -795,57 +783,6 @@ void blk_request_module(dev_t devt)
|
|||
}
|
||||
#endif /* CONFIG_BLOCK_LEGACY_AUTOLOAD */
|
||||
|
||||
/*
|
||||
* print a full list of all partitions - intended for places where the root
|
||||
* filesystem can't be mounted and thus to give the victim some idea of what
|
||||
* went wrong
|
||||
*/
|
||||
void __init printk_all_partitions(void)
|
||||
{
|
||||
struct class_dev_iter iter;
|
||||
struct device *dev;
|
||||
|
||||
class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
|
||||
while ((dev = class_dev_iter_next(&iter))) {
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
struct block_device *part;
|
||||
char devt_buf[BDEVT_SIZE];
|
||||
unsigned long idx;
|
||||
|
||||
/*
|
||||
* Don't show empty devices or things that have been
|
||||
* suppressed
|
||||
*/
|
||||
if (get_capacity(disk) == 0 || (disk->flags & GENHD_FL_HIDDEN))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Note, unlike /proc/partitions, I am showing the numbers in
|
||||
* hex - the same format as the root= option takes.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
xa_for_each(&disk->part_tbl, idx, part) {
|
||||
if (!bdev_nr_sectors(part))
|
||||
continue;
|
||||
printk("%s%s %10llu %pg %s",
|
||||
bdev_is_partition(part) ? " " : "",
|
||||
bdevt_str(part->bd_dev, devt_buf),
|
||||
bdev_nr_sectors(part) >> 1, part,
|
||||
part->bd_meta_info ?
|
||||
part->bd_meta_info->uuid : "");
|
||||
if (bdev_is_partition(part))
|
||||
printk("\n");
|
||||
else if (dev->parent && dev->parent->driver)
|
||||
printk(" driver: %s\n",
|
||||
dev->parent->driver->name);
|
||||
else
|
||||
printk(" (driver?)\n");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
class_dev_iter_exit(&iter);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* iterator */
|
||||
static void *disk_seqf_start(struct seq_file *seqf, loff_t *pos)
|
||||
|
@ -1379,35 +1316,6 @@ dev_t part_devt(struct gendisk *disk, u8 partno)
|
|||
return devt;
|
||||
}
|
||||
|
||||
dev_t blk_lookup_devt(const char *name, int partno)
|
||||
{
|
||||
dev_t devt = MKDEV(0, 0);
|
||||
struct class_dev_iter iter;
|
||||
struct device *dev;
|
||||
|
||||
class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
|
||||
while ((dev = class_dev_iter_next(&iter))) {
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
|
||||
if (strcmp(dev_name(dev), name))
|
||||
continue;
|
||||
|
||||
if (partno < disk->minors) {
|
||||
/* We need to return the right devno, even
|
||||
* if the partition doesn't exist yet.
|
||||
*/
|
||||
devt = MKDEV(MAJOR(dev->devt),
|
||||
MINOR(dev->devt) + partno);
|
||||
} else {
|
||||
devt = part_devt(disk, partno);
|
||||
if (devt)
|
||||
break;
|
||||
}
|
||||
}
|
||||
class_dev_iter_exit(&iter);
|
||||
return devt;
|
||||
}
|
||||
|
||||
struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
|
||||
struct lock_class_key *lkclass)
|
||||
{
|
||||
|
|
|
@ -838,7 +838,6 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
|
|||
|
||||
dev_t part_devt(struct gendisk *disk, u8 partno);
|
||||
void inc_diskseq(struct gendisk *disk);
|
||||
dev_t blk_lookup_devt(const char *name, int partno);
|
||||
void blk_request_module(dev_t devt);
|
||||
|
||||
extern int blk_register_queue(struct gendisk *disk);
|
||||
|
|
Загрузка…
Ссылка в новой задаче