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

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

udf: Preserve link count of system files



commit fc8033a34a3ca7d23353e645e6dde5d364ac5f12 upstream.

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 avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7bd8d9e1
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1388,6 +1388,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;
@@ -1723,8 +1724,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
@@ -147,6 +147,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
@@ -44,7 +44,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;
	union {
		struct short_ad	*i_sad;
		struct long_ad		*i_lad;