2017-10-05 4 views
1

J'essaie d'obtenir tous les points de montage dans un module du noyau. Voici ce que j'ai trouvé. Il se sépare en raison de la strcat. Est-ce la bonne façon d'obtenir les points de montage? Est-ce que ça va marcher? si oui, comment puis-je réparer le segfault? Si non, comment va-t-on obtenir les points de montage dans un module noyau Linux?Obtenir tous les points de montage dans le module noyau

J'ai essayé cycle the whole namespace looking for mountpoint roots that match mais c'est à partir de 2003 et le noyau a tellement changé qu'il est fondamentalement inutile. Également essayé get filesystem mount point in kernel module mais encore son à partir de 2012 donc il est obsolète.

static int __init misc_init(void) 
{ 
    struct path path; 
    struct dentry *thedentry; 
    struct dentry *curdentry; 

    kern_path("/", LOOKUP_FOLLOW, &path); 
    thedentry = path.dentry; 
    list_for_each_entry(curdentry, &thedentry->d_subdirs, d_child) 
    { 
     kern_path(strncat("/", curdentry->d_name.name, strlen(curdentry->d_name.name)), LOOKUP_FOLLOW, &path); 
     if (path_is_mountpoint(&path)) 
     { 
      printk("%s: is a mountpoint", curdentry->d_name.name); 
     } 
     else 
      printk("%s: is not a mountpoint", curdentry->d_name.name); 
    } 
    return 0; 
} 
+1

Avez-vous déjà lu 'man strncat'? Tu seras surpris. –

+0

oui j'ai. J'ai essayé strjoin, strlcat, strncat, strcat. – testfile

+0

... et le 'strlen (curdentry-> d_name.name)),' n'a aucun sens du tout, soit – wildplasser

Répondre

0

Il existe des drapeaux dans la structure dentry. d_flags. et il y a un drapeau DCACHED_MOUNTED. Obtenez le pointeur actuel. Le fs_struct là-dedans. alors la racine. cela vous donne la racine du système de fichiers actuel. à partir de là boucle si tous les sous-répertoires et si d_flags & DCACHE_MOUNTED passe alors c'est un point de montage.

ssize_t read_proc(struct file *filp, char *buf, size_t len, loff_t *offp) 
{ 
    struct dentry *curdentry; 

    list_for_each_entry(curdentry, &current->fs->root.mnt->mnt_root->d_subdirs, d_child) 
    { 
     if (curdentry->d_flags & DCACHE_MOUNTED) 
      printk("%s is mounted", curdentry->d_name.name); 
    } 
    return 0; 
} 
0

Voici la méthode la plus optimale pour obtenir tous les points de montage sans vérifier toutes les dénisseries d'un système.

struct mnt_namespace *ns = current->nsproxy->mnt_ns; 
struct mount *mnt; 

list_for_each_entry(mnt, &ns->list, mnt_list) { 
...do something with each mnt... 
} 

Notez ce code ne tient pas namespace_sem donc le résultat de itérer à travers mnt_list n'est pas garantie. Cependant, à mon humble avis, il est au moins aussi correct que de traverser toutes les déniches sans serrure de montage.