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: Tristan Ye <tristan.ye@oracle.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
Родитель
b409d7a0ab
Коммит
ada508274b
|
@ -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,
|
||||||
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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче