diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index ecb8e05b8b84..afea481cd6ee 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -3079,6 +3079,9 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip) } ip->i_size = le64_to_cpu(dip->di_size); + if (S_ISREG(ip->i_mode) && ip->i_size < 0) + return -EFSCORRUPTED; + inode_set_atime(ip, le32_to_cpu(dip->di_atime.tv_sec), le32_to_cpu(dip->di_atime.tv_nsec)); inode_set_mtime(ip, le32_to_cpu(dip->di_mtime.tv_sec), diff --git a/fs/jfs/jfs_imap.h b/fs/jfs/jfs_imap.h index dd7409febe28..025d72890dac 100644 --- a/fs/jfs/jfs_imap.h +++ b/fs/jfs/jfs_imap.h @@ -35,6 +35,8 @@ #define INOPBLK(pxd,ino,l2nbperpg) (addressPXD((pxd)) + \ ((((ino) & (INOSPEREXT-1)) >> L2INOSPERPAGE) << (l2nbperpg))) +#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ + /* * inode allocation map: *