• Coly Li's avatar
    dax: print error message by pr_info() in __generic_fsdax_supported() · 23160978
    Coly Li authored
    In struct dax_operations, the callback routine dax_supported() returns
    a bool type result. For false return value, the caller has no idea
    whether the device does not support dax at all, or it is just some mis-
    configuration issue.
    
    An example is formatting an Ext4 file system on pmem device on top of
    a NVDIMM namespace by,
     # mkfs.ext4 /dev/pmem0
    If the fs block size does not match kernel space memory page size (which
    is possible on non-x86 platform), mount this Ext4 file system will fail,
      # mount -o dax /dev/pmem0 /mnt
      mount: /mnt: wrong fs type, bad option, bad superblock on /dev/pmem0,
      missing codepage or helper program, or other error.
    And from the dmesg output there is only the following information,
      [  307.853148] EXT4-fs (pmem0): DAX unsupported by block device.
    
    The above information is quite confusing. Because definitely the pmem0
    device supports dax operation, and the super block is consistent as how
    it was created by mkfs.ext4.
    
    Indeed the failure is from __generic_fsdax_supported() by the following
    code piece,
            if (blocksize != PAGE_SIZE) {
                   pr_debug("%s: error: unsupported blocksize for dax\n",
                                    bdevname(bdev, buf));
                    return false;
            }
    It is because the Ext4 block size is 4KB and kernel page size is 8KB or
    16KB.
    
    It is not simple to make dax_supported() from struct dax_operations
    or __generic_fsdax_supported() to return exact failure type right now.
    So the simplest fix is to use pr_info() to print all the error messages
    inside __generic_fsdax_supported(). Then users may find informative clue
    from the kernel message at least.
    
    Message printed by pr_debug() is very easy to be ignored by users. This
    patch prints error message by pr_info() in __generic_fsdax_supported(),
    when then mount fails, following lines can be found from dmesg output,
     [ 2705.500885] pmem0: error: unsupported blocksize for dax
     [ 2705.500888] EXT4-fs (pmem0): DAX unsupported by block device.
    Now the users may have idea the mount failure is from pmem driver for
    unsupported block size.
    
    Link: https://lore.kernel.org/r/20200725162450.95999-1-colyli@suse.de
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Anthony Iliopoulos <ailiopoulos@suse.com>
    Reported-by: default avatarMichal Suchanek <msuchanek@suse.com>
    Suggested-by: default avatarJan Kara <jack@suse.com>
    Reviewed-by: default avatarJan Kara <jack@suse.com>
    Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
    Reviewed-by: default avatarPankaj Gupta <pankaj.gupta.linux@gmail.com>
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Signed-off-by: default avatarVishal Verma <vishal.l.verma@intel.com>
    23160978
super.c 17.4 KB