Commit ada50827 authored by Jan Kara's avatar Jan Kara Committed by Joel Becker

ocfs2: Handle quota file corruption more gracefully

ocfs2_read_virt_blocks() does BUG when we try to read a block from a file
beyond its end. Since this can happen due to filesystem corruption, it
is not really an appropriate answer. Make ocfs2_read_quota_block() check
the condition and handle it by calling ocfs2_error() and returning EIO.

[ Modified to print ip_blkno in the error - Joel ]
Reported-by: default avatarTristan Ye <tristan.ye@oracle.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
parent b409d7a0
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "sysfile.h" #include "sysfile.h"
#include "dlmglue.h" #include "dlmglue.h"
#include "uptodate.h" #include "uptodate.h"
#include "super.h"
#include "quota.h" #include "quota.h"
static struct workqueue_struct *ocfs2_quota_wq = NULL; static struct workqueue_struct *ocfs2_quota_wq = NULL;
...@@ -114,6 +115,15 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block, ...@@ -114,6 +115,15 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block,
int rc = 0; int rc = 0;
struct buffer_head *tmp = *bh; struct buffer_head *tmp = *bh;
if (i_size_read(inode) >> inode->i_sb->s_blocksize_bits <= v_block) {
ocfs2_error(inode->i_sb,
"Quota file %llu is probably corrupted! Requested "
"to read block %Lu but file has size only %Lu\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno,
(unsigned long long)v_block,
(unsigned long long)i_size_read(inode));
return -EIO;
}
rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0, rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0,
ocfs2_validate_quota_block); ocfs2_validate_quota_block);
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment