On (09/18/18 17:39), David Howells wrote:
[..]
> -static int legacy_init_fs_context(struct fs_context *fc, struct dentry 
> *dentry)
> +int legacy_init_fs_context(struct fs_context *fc, struct dentry *dentry)
>  {
> +     switch (fc->purpose) {
> +     default:
> +             fc->fs_private = kzalloc(sizeof(struct legacy_fs_context),
> +                                      GFP_KERNEL);
> +             if (!fc->fs_private)
> +                     return -ENOMEM;

ops->reconfigure() invoked for FS_CONTEXT_FOR_UMOUNT or
FS_CONTEXT_FOR_EMERGENCY_RO will never access fc->fs_private?

> +             break;
>  
> -     fc->fs_private = kzalloc(sizeof(struct legacy_fs_context), GFP_KERNEL);
> -     if (!fc->fs_private)
> -             return -ENOMEM;
> +     case FS_CONTEXT_FOR_UMOUNT:
> +     case FS_CONTEXT_FOR_EMERGENCY_RO:
> +             break;
> +     }

So `fc' can either be zeroed-out, when it comes from fc = kzalloc(),
or contain some garbage otherwise. Would it make sense to zero-out `fc'
regardless of its origin?

>       down_write(&sb->s_umount);
> -     if (!sb_rdonly(sb))
> -             /* Might want to call ->init_fs_context(). */
> -             ret = reconfigure_super(&fc);
> +     if (!sb_rdonly(sb)) {
> +             int ret;
> +
> +             if (fc.fs_type->init_fs_context)
> +                     ret = fc.fs_type->init_fs_context(&fc, NULL);
> +             else
> +                     ret = legacy_init_fs_context(&fc, NULL);
> +
> +             if (ret == 0) {
> +                     ret = reconfigure_super(&fc);
> +                     fc.ops->free(&fc);
                        ^^^^^^^
Is ops->free() always !NULL?

        -ss

Reply via email to