Re: [PATCH RESEND 1/2] staging: erofs: introduce EFSCORRUPTED and more logs

2019-08-14 Thread Chao Yu
On 2019/8/14 12:32, Gao Xiang wrote:
> Previously, EROFS uses EIO to indicate that filesystem is
> corrupted as well, but other filesystems tend to use
> EUCLEAN instead, let's follow what others do right now.
> 
> Also, add some more prints to the syslog.
> 
> Suggested-by: Pavel Machek 
> Signed-off-by: Gao Xiang 

Reviewed-by: Chao Yu 

Thanks,


[PATCH RESEND 1/2] staging: erofs: introduce EFSCORRUPTED and more logs

2019-08-13 Thread Gao Xiang
Previously, EROFS uses EIO to indicate that filesystem is
corrupted as well, but other filesystems tend to use
EUCLEAN instead, let's follow what others do right now.

Also, add some more prints to the syslog.

Suggested-by: Pavel Machek 
Signed-off-by: Gao Xiang 
---
[RESEND]: add Pavel to the recipient as well...Forgive me... no logic change.

This patchset has dependency on the previous patchset yesterday
 https://lore.kernel.org/lkml/20190813023054.73126-1-gaoxian...@huawei.com/

Thanks,
Gao Xiang

 drivers/staging/erofs/data.c |  6 --
 drivers/staging/erofs/dir.c  | 15 ---
 drivers/staging/erofs/inode.c| 17 -
 drivers/staging/erofs/internal.h |  2 ++
 drivers/staging/erofs/namei.c|  6 --
 drivers/staging/erofs/xattr.c|  5 +++--
 drivers/staging/erofs/zmap.c |  5 +++--
 7 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/drivers/staging/erofs/data.c b/drivers/staging/erofs/data.c
index 4cdb743c8b8d..72c4b4c5296b 100644
--- a/drivers/staging/erofs/data.c
+++ b/drivers/staging/erofs/data.c
@@ -143,10 +143,12 @@ static int erofs_map_blocks_flatmode(struct inode *inode,
vi->xattr_isize + erofs_blkoff(map->m_la);
map->m_plen = inode->i_size - offset;
 
-   /* inline data should locate in one meta block */
+   /* inline data should be located in one meta block */
if (erofs_blkoff(map->m_pa) + map->m_plen > PAGE_SIZE) {
+   errln("inline data cross block boundary @ nid %llu",
+ vi->nid);
DBG_BUGON(1);
-   err = -EIO;
+   err = -EFSCORRUPTED;
goto err_out;
}
 
diff --git a/drivers/staging/erofs/dir.c b/drivers/staging/erofs/dir.c
index 2fbfc4935077..01efc96e1212 100644
--- a/drivers/staging/erofs/dir.c
+++ b/drivers/staging/erofs/dir.c
@@ -34,7 +34,7 @@ static void debug_one_dentry(unsigned char d_type, const char 
*de_name,
 #endif
 }
 
-static int erofs_fill_dentries(struct dir_context *ctx,
+static int erofs_fill_dentries(struct inode *dir, struct dir_context *ctx,
   void *dentry_blk, unsigned int *ofs,
   unsigned int nameoff, unsigned int maxsize)
 {
@@ -63,8 +63,9 @@ static int erofs_fill_dentries(struct dir_context *ctx,
/* a corrupted entry is found */
if (unlikely(nameoff + de_namelen > maxsize ||
 de_namelen > EROFS_NAME_LEN)) {
+   errln("bogus dirent @ nid %llu", EROFS_V(dir)->nid);
DBG_BUGON(1);
-   return -EIO;
+   return -EFSCORRUPTED;
}
 
debug_one_dentry(d_type, de_name, de_namelen);
@@ -104,10 +105,9 @@ static int erofs_readdir(struct file *f, struct 
dir_context *ctx)
 
if (unlikely(nameoff < sizeof(struct erofs_dirent) ||
 nameoff >= PAGE_SIZE)) {
-   errln("%s, invalid de[0].nameoff %u",
- __func__, nameoff);
-
-   err = -EIO;
+   errln("%s, invalid de[0].nameoff %u @ nid %llu",
+ __func__, nameoff, EROFS_V(dir)->nid);
+   err = -EFSCORRUPTED;
goto skip_this;
}
 
@@ -123,7 +123,8 @@ static int erofs_readdir(struct file *f, struct dir_context 
*ctx)
goto skip_this;
}
 
-   err = erofs_fill_dentries(ctx, de, , nameoff, maxsize);
+   err = erofs_fill_dentries(dir, ctx, de, ,
+ nameoff, maxsize);
 skip_this:
kunmap(dentry_page);
 
diff --git a/drivers/staging/erofs/inode.c b/drivers/staging/erofs/inode.c
index 286729143365..461fd4213ce7 100644
--- a/drivers/staging/erofs/inode.c
+++ b/drivers/staging/erofs/inode.c
@@ -43,7 +43,7 @@ static int read_inode(struct inode *inode, void *data)
else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode))
inode->i_rdev = 0;
else
-   return -EIO;
+   goto bogusimode;
 
i_uid_write(inode, le32_to_cpu(v2->i_uid));
i_gid_write(inode, le32_to_cpu(v2->i_gid));
@@ -76,7 +76,7 @@ static int read_inode(struct inode *inode, void *data)
else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode))
inode->i_rdev = 0;
else
-   return -EIO;
+   goto bogusimode;
 
i_uid_write(inode, le16_to_cpu(v1->i_uid));
i_gid_write(inode, le16_to_cpu(v1->i_gid));
@@ -104,6 +104,11 @@ static int read_inode(struct inode *inode, void *data)
else