[PREVIEW] [PATCH] [V2] staging: erofs: replace BUG_ON with DBG_BUGON
Gao Xiang
gaoxiang25 at huawei.com
Wed Aug 22 12:34:29 AEST 2018
Hi Chen,
On 2018/8/22 10:17, Chen Gong wrote:
> This patch replace BUG_ON with DBG_BUGON, and add necessary error
> handler.
>
> Signed-off-by: Chen Gong <gongchen4 at huawei.com>
> ---
> drivers/staging/erofs/data.c | 31 ++++++++++++++++++++-----------
> drivers/staging/erofs/dir.c | 2 +-
I think it is better to spilt into two patches, the one for raw data access (data.c)
the other for directory operations (dir.c) .
Just as your first version, and the commit message of your first version should also
highlight its scope `to fix data.c'
> 2 files changed, 21 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/staging/erofs/data.c b/drivers/staging/erofs/data.c
> index 0570af5..174feac 100644
> --- a/drivers/staging/erofs/data.c
> +++ b/drivers/staging/erofs/data.c
> @@ -25,7 +25,7 @@ static inline void read_endio(struct bio *bio)
> struct page *page = bvec->bv_page;
>
> /* page is already locked */
> - BUG_ON(PageUptodate(page));
> + DBG_BUGON(PageUptodate(page));
>
> if (unlikely(err))
> SetPageError(page);
> @@ -108,12 +108,12 @@ static int erofs_map_blocks_flatmode(struct inode *inode,
> struct erofs_map_blocks *map,
> int flags)
> {
> + int err = 0;
> erofs_blk_t nblocks, lastblk;
> u64 offset = map->m_la;
> struct erofs_vnode *vi = EROFS_V(inode);
>
> trace_erofs_map_blocks_flatmode_enter(inode, map, flags);
> - BUG_ON(is_inode_layout_compression(inode));
>
> nblocks = DIV_ROUND_UP(inode->i_size, PAGE_SIZE);
> lastblk = nblocks - is_inode_layout_inline(inode);
> @@ -140,18 +140,27 @@ static int erofs_map_blocks_flatmode(struct inode *inode,
> map->m_plen = inode->i_size - offset;
>
> /* inline data should locate in one meta block */
> - BUG_ON(erofs_blkoff(map->m_pa) + map->m_plen > PAGE_SIZE);
> + if(erofs_blkoff(map->m_pa) + map->m_plen > PAGE_SIZE){
> + DBG_BUGON(1);
> + err = -EIO;
> + goto err_out;
> + }
> +
> map->m_flags |= EROFS_MAP_META;
> } else {
> errln("internal error @ nid: %llu (size %llu), m_la 0x%llx",
> vi->nid, inode->i_size, map->m_la);
> - BUG();
> + DBG_BUGON(1);
> + err = -EIO;
> + goto err_out;
> }
>
> out:
> map->m_llen = map->m_plen;
> +
> +err_out:
> trace_erofs_map_blocks_flatmode_exit(inode, map, flags, 0);
> - return 0;
> + return err;
> }
>
> #ifdef CONFIG_EROFS_FS_ZIP
> @@ -207,7 +216,7 @@ static inline struct bio *erofs_read_raw_page(
> erofs_off_t current_block = (erofs_off_t)page->index;
> int err;
>
> - BUG_ON(!nblocks);
> + DBG_BUGON(!nblocks);
>
> if (PageUptodate(page)) {
> err = 0;
> @@ -250,7 +259,7 @@ static inline struct bio *erofs_read_raw_page(
> }
>
> /* for RAW access mode, m_plen must be equal to m_llen */
> - BUG_ON(map.m_plen != map.m_llen);
> + DBG_BUGON(map.m_plen != map.m_llen);
>
> blknr = erofs_blknr(map.m_pa);
> blkoff = erofs_blkoff(map.m_pa);
> @@ -260,7 +269,7 @@ static inline struct bio *erofs_read_raw_page(
> void *vsrc, *vto;
> struct page *ipage;
>
> - BUG_ON(map.m_plen > PAGE_SIZE);
> + DBG_BUGON(map.m_plen > PAGE_SIZE);
>
> ipage = erofs_get_meta_page(inode->i_sb, blknr, 0);
>
> @@ -287,7 +296,7 @@ static inline struct bio *erofs_read_raw_page(
> }
>
> /* pa must be block-aligned for raw reading */
> - BUG_ON(erofs_blkoff(map.m_pa) != 0);
> + DBG_BUGON(erofs_blkoff(map.m_pa));
>
> /* max # of continuous pages */
> if (nblocks > DIV_ROUND_UP(map.m_plen, PAGE_SIZE))
> @@ -355,7 +364,7 @@ static int erofs_raw_access_readpage(struct file *file, struct page *page)
> if (IS_ERR(bio))
> return PTR_ERR(bio);
>
> - BUG_ON(bio != NULL); /* since we have only one bio -- must be NULL */
> + DBG_BUGON(bio != NULL); /* since we have only one bio -- must be NULL */
> return 0;
> }
>
> @@ -393,7 +402,7 @@ static int erofs_raw_access_readpages(struct file *filp,
> /* pages could still be locked */
> put_page(page);
> }
> - BUG_ON(!list_empty(pages));
> + DBG_BUGON(!list_empty(pages));
>
> /* the rare case (end in gaps) */
> if (unlikely(bio != NULL))
> diff --git a/drivers/staging/erofs/dir.c b/drivers/staging/erofs/dir.c
> index be6ae3b..918b66e 100644
> --- a/drivers/staging/erofs/dir.c
> +++ b/drivers/staging/erofs/dir.c
> @@ -54,7 +54,7 @@ static int erofs_fill_dentries(struct dir_context *ctx,
> le16_to_cpu(de[1].nameoff) - nameoff;
>
> /* the corrupted directory found */
> - BUG_ON(de_namelen < 0);
> + DBG_BUGON(de_namelen < 0);
At a glance, it shouldn't be fixed in this way.
Because de_namelen is an on-disk field, it could be corrupted, you should add more error handling and DBG_BUGON(1) to deal with it.
I will review your remaining fixes later. Thanks for your patch. :)
Thanks,
Gao Xiang
>
> #ifdef CONFIG_EROFS_FS_DEBUG
> dbg_namelen = min(EROFS_NAME_LEN - 1, de_namelen);
> -- 1.9.1
>
More information about the Linux-erofs
mailing list