Merge 4.14.36 into android-4.14
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / fs / ext4 / inode.c
index e8017aefbd44f5bdf8978abe7fc1cffef8ffa084..4f26c7a04a63c7da3b24710232d762249956a296 100644 (file)
@@ -3638,7 +3638,6 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
-       struct ext4_inode_info *ei = EXT4_I(inode);
        ssize_t ret;
        loff_t offset = iocb->ki_pos;
        size_t count = iov_iter_count(iter);
@@ -3662,7 +3661,7 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
                        goto out;
                }
                orphan = 1;
-               ei->i_disksize = inode->i_size;
+               ext4_update_i_disksize(inode, inode->i_size);
                ext4_journal_stop(handle);
        }
 
@@ -3770,7 +3769,7 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
                if (ret > 0) {
                        loff_t end = offset + ret;
                        if (end > inode->i_size) {
-                               ei->i_disksize = end;
+                               ext4_update_i_disksize(inode, end);
                                i_size_write(inode, end);
                                /*
                                 * We're going to return a positive `ret'
@@ -4744,6 +4743,12 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
                goto bad_inode;
        raw_inode = ext4_raw_inode(&iloc);
 
+       if ((ino == EXT4_ROOT_INO) && (raw_inode->i_links_count == 0)) {
+               EXT4_ERROR_INODE(inode, "root inode unallocated");
+               ret = -EFSCORRUPTED;
+               goto bad_inode;
+       }
+
        if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) {
                ei->i_extra_isize = le16_to_cpu(raw_inode->i_extra_isize);
                if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize >