2015-12-22 2 views
-1

Je suis conscient que ces questions sont posées tout le temps, mais dans ce scénario, je ne suis pas sûr de la solution appropriée. La fonction est une fonction éditée de do_new_mount dans une branche du noyau linux 3.4.x pour le contexte. L'objectif est de vérifier le type de système de fichiers et d'émettre le drapeau async si les conditions correctes sont indiquées.Passage de l'argument 1 de 'strcmp' à partir d'un type de pointeur incompatible

La ligne:

if (!err && ((!strcmp(type, "ext4") && 

fonction complète (partie async est ajoutée, ce qui provoque l'erreur):

static int do_new_mount(struct path *path, const char *fstype, int flags, 
      int mnt_flags, const char *name, void *data) 
{ 
struct file_system_type *type; 
struct user_namespace *user_ns; 
struct vfsmount *mnt; 
int err; 

if (!fstype) 
    return -EINVAL; 

/* we need capabilities... */ 
user_ns = real_mount(path->mnt)->mnt_ns->user_ns; 
if (!ns_capable(user_ns, CAP_SYS_ADMIN)) 
    return -EPERM; 

type = get_fs_type(fstype); 
if (!type) 
    return -ENODEV; 

if (user_ns != &init_user_ns) { 
    if (!(type->fs_flags & FS_USERNS_MOUNT)) { 
     put_filesystem(type); 
     return -EPERM; 
    } 
    /* Only in special cases allow devices from mounts 
    * created outside the initial user namespace. 
    */ 
    if (!(type->fs_flags & FS_USERNS_DEV_MOUNT)) { 
     flags |= MS_NODEV; 
     mnt_flags |= MNT_NODEV; 
    } 
} 

mnt = vfs_kern_mount(type, flags, name, data); 
if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) && 
    !mnt->mnt_sb->s_subtype) 
    mnt = fs_set_subtype(mnt, fstype); 

put_filesystem(type); 
if (IS_ERR(mnt)) 
    return PTR_ERR(mnt); 

err = do_add_mount(real_mount(mnt), path, mnt_flags); 
if (err) 
    mntput(mnt); 
#ifdef CONFIG_ASYNC_FSYNC 
if (!err && ((!strcmp(type, "ext4") && 
    !strcmp(path->dentry->d_name.name, "data")) || 
    (!strcmp(type, "fuse") && 
    !strcmp(path->dentry->d_name.name, "emulated")))) 
      mnt->mnt_sb->fsync_flags |= FLAG_ASYNC_FSYNC; 
#endif 
return err; 
} 
+1

'struct type_système_de_fichier * type;' 'strcmp (const char * s1, const char * s2);' type n'est pas un 'char *' –

+0

'strcmp (type-> nom, "ext4") '? – kaylum

+0

Bien, mais je ne suis pas sûr de savoir comment vérifier le type correctement. Va essayer cette solution kaylum, merci! – user2337438

Répondre

0

Il est évident que type est de type struct file_system_type * qui est pas ce que strcmp() attend. Je devine que le premier champ dans struct file_system_type est un char* et ainsi cela fonctionne.

La solution serait soit cast type à char* OU correctement déréférencer son premier membre. (évidemment la 2ème approche est meilleure)

+0

D'accord, merci! Désolé pour la question idiote. – user2337438

+0

Oui, c'était le plan. Je ne me laisserais pas accepter pour x minutes. – user2337438