2015-12-22 11 views
-1

Я знаю, что все эти вопросы задают все время, однако в этом случае я не совсем уверен, каким будет правильное решение. Функция представляет собой отредактированную функцию do_new_mount в fork ядра linux 3.4.x для контекста. Целью является проверка типа файловой системы и, в свою очередь, выдача асинхронного флага, если речь идет о правильных условиях.Передача аргумента 1 из 'strcmp' из несовместимого типа указателя

Линия:

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

Полнофункциональный (асинхронная часть добавляется, которая вызывает ошибку):

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 file_system_type * type;' 'strcmp (const char * s1, const char * s2);' type не является символом 'char *' –

+0

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

+0

Правильно, но я не уверен, как правильно проверить тип. Попробуем это решение kaylum, спасибо! – user2337438

ответ

0

Очевидно type имеет тип struct file_system_type *, который не то, что strcmp() ожидает. Я предполагаю, что первое поле в struct file_system_type является char*, и поэтому оно работает.

Решение должно быть либо литым type, либо char* ИЛИ правильно разыменовать его первым членом. (очевидно, что второй подход лучше)

+0

Хорошо, спасибо! Извините за глупый вопрос. – user2337438

+0

Да, это был план. Не позволил бы мне принять за х минут. – user2337438

 Смежные вопросы

  • Нет связанных вопросов^_^