Message ID | 1471845085-9590-1-git-send-email-daeho.jeong@samsung.com |
---|---|
State | Awaiting Upstream, archived |
Headers | show |
On Mon, Aug 22, 2016 at 02:51:25PM +0900, Daeho Jeong wrote: > Now, ext4_do_update_inode() clears high 16-bit fields of uid/gid > of deleted and evicted inode to fix up interoperability with old > kernels. However, it checks only i_dtime of an inode to determine > whether the inode was deleted and evicted, and this is very risky, > because i_dtime can be used for the pointer maintaining orphan inode > list, too. We need to further check whether the i_dtime is being > used for the orphan inode list even if the i_dtime is not NULL. > > We found that high 16-bit fields of uid/gid of inode are unintentionally > and permanently cleared when the inode truncation is just triggered, > but not finished, and the inode metadata, whose high uid/gid bits are > cleared, is written on disk, and the sudden power-off follows that > in order. > > Signed-off-by: Daeho Jeong <daeho.jeong@samsung.com> > Signed-off-by: Hobin Woo <hobin.woo@samsung.com> Thanks, applied. - Ted -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f7140ca..bb5aede 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4785,14 +4785,14 @@ static int ext4_do_update_inode(handle_t *handle, * Fix up interoperability with old kernels. Otherwise, old inodes get * re-used with the upper 16 bits of the uid/gid intact */ - if (!ei->i_dtime) { + if (ei->i_dtime && list_empty(&ei->i_orphan)) { + raw_inode->i_uid_high = 0; + raw_inode->i_gid_high = 0; + } else { raw_inode->i_uid_high = cpu_to_le16(high_16_bits(i_uid)); raw_inode->i_gid_high = cpu_to_le16(high_16_bits(i_gid)); - } else { - raw_inode->i_uid_high = 0; - raw_inode->i_gid_high = 0; } } else { raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(i_uid));