linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
  • * [PATCH v2] ovl: fix null pointer when filesystem doesn't support direct IO
           [not found] <20210918121346.12084-1-huangjianan@oppo.com>
           [not found] ` <3633c6e5-028c-fc77-3b8e-da9903f97ac5@139.com>
    @ 2021-09-22  3:47 ` Huang Jianan
      2021-09-22  5:09   ` Chengguang Xu
      1 sibling, 1 reply; 12+ messages in thread
    From: Huang Jianan @ 2021-09-22  3:47 UTC (permalink / raw)
      To: linux-unionfs, miklos, linux-erofs, xiang, chao
      Cc: huangjianan, guoweichao, yh, zhangshiming, guanyuwei, jnhuang95,
    	linux-kernel, linux-fsdevel
    
    At present, overlayfs provides overlayfs inode to users. Overlayfs
    inode provides ovl_aops with noop_direct_IO to avoid open failure
    with O_DIRECT. But some compressed filesystems, such as erofs and
    squashfs, don't support direct_IO.
    
    Users who use f_mapping->a_ops->direct_IO to check O_DIRECT support,
    will read file through this way. This will cause overlayfs to access
    a non-existent direct_IO function and cause panic due to null pointer:
    
    Kernel panic - not syncing: CFI failure (target: 0x0)
    CPU: 6 PID: 247 Comm: loop0
    Call Trace:
     panic+0x188/0x45c
     __cfi_slowpath+0x0/0x254
     __cfi_slowpath+0x200/0x254
     generic_file_read_iter+0x14c/0x150
     vfs_iocb_iter_read+0xac/0x164
     ovl_read_iter+0x13c/0x2fc
     lo_rw_aio+0x2bc/0x458
     loop_queue_work+0x4a4/0xbc0
     kthread_worker_fn+0xf8/0x1d0
     loop_kthread_worker_fn+0x24/0x38
     kthread+0x29c/0x310
     ret_from_fork+0x10/0x30
    
    The filesystem may only support direct_IO for some file types. For
    example, erofs supports direct_IO for uncompressed files. So reset
    f_mapping->a_ops to NULL when the file doesn't support direct_IO to
    fix this problem.
    
    Fixes: 5b910bd615ba ("ovl: fix GPF in swapfile_activate of file from overlayfs over xfs")
    Signed-off-by: Huang Jianan <huangjianan@oppo.com>
    ---
    Change since v1:
     - Return error to user rather than fall back to buffered io. (Chengguang Xu)
    
     fs/overlayfs/file.c | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
    index d081faa55e83..38118d3b46f8 100644
    --- a/fs/overlayfs/file.c
    +++ b/fs/overlayfs/file.c
    @@ -157,6 +157,10 @@ static int ovl_open(struct inode *inode, struct file *file)
     	if (IS_ERR(realfile))
     		return PTR_ERR(realfile);
     
    +	if ((f->f_flags & O_DIRECT) && (!realfile->f_mapping->a_ops ||
    +		!realfile->f_mapping->a_ops->direct_IO))
    +		file->f_mapping->a_ops = NULL;
    +
     	file->private_data = realfile;
     
     	return 0;
    -- 
    2.25.1
    
    
    ^ permalink raw reply related	[flat|nested] 12+ messages in thread

  • end of thread, other threads:[~2021-09-28  7:17 UTC | newest]
    
    Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <20210918121346.12084-1-huangjianan@oppo.com>
         [not found] ` <3633c6e5-028c-fc77-3b8e-da9903f97ac5@139.com>
    2021-09-22  3:39   ` [PATCH] ovl: fix null pointer when filesystem doesn't support direct IO Huang Jianan
    2021-09-22  3:47 ` [PATCH v2] " Huang Jianan
    2021-09-22  5:09   ` Chengguang Xu
    2021-09-22  7:18     ` Huang Jianan
    2021-09-22  7:23       ` [PATCH v3] " Huang Jianan
    2021-09-22  8:06         ` Chengguang Xu
    2021-09-22  8:24           ` Huang Jianan
    2021-09-22 13:20             ` [PATCH v3] ovl: fix null pointer when filesystemdoesn'tsupportdirect IO Chengguang Xu
    2021-09-22 14:00               ` Miklos Szeredi
    2021-09-27  9:38                 ` Miklos Szeredi
    2021-09-28  7:01                   ` Huang Jianan
    2021-09-28  7:17                     ` Miklos Szeredi
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox;
    as well as URLs for NNTP newsgroup(s).