1

Je souhaite récupérer la structure dev_t pour un disque entier, étant donné celle d'une partition sur le disque. C'est pour pour un pilote blkext, comme nvme.Noyau Linux: Comment obtenir dev_t du disque entier à partir d'un disque partitionné?

Quelque chose comme:

dev_t part_disk; 
dev_t whole_disk = get_whole_disk_dev_t(part_disk); 

Je voudrais que mon l'interface de get_whole_disk_dev_t() être:

Argument: dev_t: part_disk
Retour: dev_t: whole_disk

Mon algorithme proposé:

  1. Récupère le chemin du disque partitionné à partir de dev_t par exemple "/ dev/nvme1n1p3". Je n'ai pas trouvé d'API pour obtenir le chemin de dev_t.
  2. une manipulation de Faites chaîne pour enlever « p3 », donnant le chemin disque entier
  3. passer le path_name du disque entier à blk_lookup_devt pour obtenir le dev_t du disque entier.
    i.e. whole_disk=blk_lookup_devt(path_name,0)

Est-ce la bonne approche ou est-il une meilleure approche? Si le premier, alors comment puis-je obtenir le chemin de dev_t? P.S: J'ai besoin de mettre en œuvre ceci dans un pilote de périphérique (c'est-à-dire dans le contexte du noyau). Dans l'espace utilisateur, je sais que je peux utiliser l'API udev.

+0

[get_gendisk] (http://astro.temple.edu/~tue68607/wiki/html/kernel-api-2.6.29/re530.html) Peut-être que c'est ce que vous cherchez :-) –

+0

get_gendisk n'est pas exporté, donc ne peut pas l'utiliser :( –

+0

Lire différentes APIs Peut-être que vous trouverez ce que vous avez besoin [Block API] (https://www.kernel.org/doc/htmldocs/kernel-api/blkdev.html –

Répondre

0
static int hello_init(void) 

{ 

dev_t devno; 

struct block_device *bddev; 

struct gendisk *bddisk; 

char disk_major[32]; 

devno=MKDEV(252,67); 

printk(KERN_ALERT "Hello, world .... current devno is %x \n", devno); 

bddev=bdget(devno); 

if(bddev) { 

    bddisk=bddev->bd_disk; 

    if(bddisk) { 

     strcpy(disk_major,bddisk->disk_name); 

     printk(KERN_ALERT "bddisk is present %s", disk_major); 

    } else { 

     printk(KERN_ALERT "bddisk is not present"); 

    } 

} else { 

printk(KERN_ALERT "bdev failed "); 

} 

devno = blk_lookup_devt(disk_major,0); 
printk(KERN_ALERT "after blk_lookup_dev: dev_t: 0x%x Major No %d Minor No %d \n", devno, MAJOR(devno), MINOR(devno)); 

return 0; 

} 


static void hello_exit(void) 
{ 

printk(KERN_ALERT "Goodbye, world\n"); 

} 
0

Ce n'est pas un problème: vous pouvez lire fichier/proc/partitions, obtenir sd nécessaire [a | b | c] id lecteur. Supposons que l'ID: char devId [] = "sdb" après l'invocation de devno = blk_lookup_devt (devId, 0);