summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Henrie <alexhenrie24@gmail.com>2024-02-07 19:21:32 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-13 12:50:15 +0200
commitb02e6ba55997926c961a95cdaf9de91f75b0b5c3 (patch)
tree40def24cc75c38cdeebb8fc7fc4585a3a535a75a
parentedf82aa7e9eb864a09229392054d131b34a5c9e8 (diff)
downloadlinux-stable-b02e6ba55997926c961a95cdaf9de91f75b0b5c3.tar.gz
linux-stable-b02e6ba55997926c961a95cdaf9de91f75b0b5c3.tar.bz2
linux-stable-b02e6ba55997926c961a95cdaf9de91f75b0b5c3.zip
isofs: handle CDs with bad root inode but good Joliet root directory
[ Upstream commit 4243bf80c79211a8ca2795401add9c4a3b1d37ca ] I have a CD copy of the original Tom Clancy's Ghost Recon game from 2001. The disc mounts without error on Windows, but on Linux mounting fails with the message "isofs_fill_super: get root inode failed". The error originates in isofs_read_inode, which returns -EIO because de_len is 0. The superblock on this disc appears to be intentionally corrupt as a form of copy protection. When the root inode is unusable, instead of giving up immediately, try to continue with the Joliet file table. This fixes the Ghost Recon CD and probably other copy-protected CDs too. Signed-off-by: Alex Henrie <alexhenrie24@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz> Message-Id: <20240208022134.451490-1-alexhenrie24@gmail.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--fs/isofs/inode.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 6e4e2cfd40b9..aec11a7676c9 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -910,8 +910,22 @@ root_found:
* we then decide whether to use the Joliet descriptor.
*/
inode = isofs_iget(s, sbi->s_firstdatazone, 0);
- if (IS_ERR(inode))
- goto out_no_root;
+
+ /*
+ * Fix for broken CDs with a corrupt root inode but a correct Joliet
+ * root directory.
+ */
+ if (IS_ERR(inode)) {
+ if (joliet_level && sbi->s_firstdatazone != first_data_zone) {
+ printk(KERN_NOTICE
+ "ISOFS: root inode is unusable. "
+ "Disabling Rock Ridge and switching to Joliet.");
+ sbi->s_rock = 0;
+ inode = NULL;
+ } else {
+ goto out_no_root;
+ }
+ }
/*
* Fix for broken CDs with Rock Ridge and empty ISO root directory but