Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec852375 authored by Jan Kara's avatar Jan Kara Committed by Greg Kroah-Hartman
Browse files

udf: Preserve link count of system files



[ Upstream commit fc8033a34a3ca7d23353e645e6dde5d364ac5f12 ]

System files in UDF filesystem have link count 0. To not confuse VFS we
fudge the link count to be 1 when reading such inodes however we forget
to restore the link count of 0 when writing such inodes. Fix that.

CC: stable@vger.kernel.org
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent c72225ea
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1375,6 +1375,7 @@ static int udf_read_inode(struct inode *inode, bool hidden_inode)
		ret = -EIO;
		goto out;
	}
	iinfo->i_hidden = hidden_inode;
	iinfo->i_unique = 0;
	iinfo->i_lenEAttr = 0;
	iinfo->i_lenExtents = 0;
@@ -1694,8 +1695,12 @@ static int udf_update_inode(struct inode *inode, int do_sync)

	if (S_ISDIR(inode->i_mode) && inode->i_nlink > 0)
		fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
	else {
		if (iinfo->i_hidden)
			fe->fileLinkCount = cpu_to_le16(0);
		else
			fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
	}

	fe->informationLength = cpu_to_le64(inode->i_size);

+1 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ static struct inode *udf_alloc_inode(struct super_block *sb)
	ei->i_next_alloc_goal = 0;
	ei->i_strat4096 = 0;
	ei->i_streamdir = 0;
	ei->i_hidden = 0;
	init_rwsem(&ei->i_data_sem);
	ei->cached_extent.lstart = -1;
	spin_lock_init(&ei->i_extent_cache_lock);
+2 −1
Original line number Diff line number Diff line
@@ -43,7 +43,8 @@ struct udf_inode_info {
	unsigned		i_use : 1;	/* unallocSpaceEntry */
	unsigned		i_strat4096 : 1;
	unsigned		i_streamdir : 1;
	unsigned		reserved : 25;
	unsigned		i_hidden : 1;	/* hidden system inode */
	unsigned		reserved : 24;
	__u8			*i_data;
	struct kernel_lb_addr	i_locStreamdir;
	__u64			i_lenStreams;