diff options
Diffstat (limited to 'fs/udf/inode.c')
-rw-r--r-- | fs/udf/inode.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 08598843288f..c9b4df5810d5 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -1277,7 +1277,7 @@ update_time: | |||
1277 | */ | 1277 | */ |
1278 | #define UDF_MAX_ICB_NESTING 1024 | 1278 | #define UDF_MAX_ICB_NESTING 1024 |
1279 | 1279 | ||
1280 | static int udf_read_inode(struct inode *inode) | 1280 | static int udf_read_inode(struct inode *inode, bool hidden_inode) |
1281 | { | 1281 | { |
1282 | struct buffer_head *bh = NULL; | 1282 | struct buffer_head *bh = NULL; |
1283 | struct fileEntry *fe; | 1283 | struct fileEntry *fe; |
@@ -1436,8 +1436,11 @@ reread: | |||
1436 | 1436 | ||
1437 | link_count = le16_to_cpu(fe->fileLinkCount); | 1437 | link_count = le16_to_cpu(fe->fileLinkCount); |
1438 | if (!link_count) { | 1438 | if (!link_count) { |
1439 | ret = -ESTALE; | 1439 | if (!hidden_inode) { |
1440 | goto out; | 1440 | ret = -ESTALE; |
1441 | goto out; | ||
1442 | } | ||
1443 | link_count = 1; | ||
1441 | } | 1444 | } |
1442 | set_nlink(inode, link_count); | 1445 | set_nlink(inode, link_count); |
1443 | 1446 | ||
@@ -1826,7 +1829,8 @@ out: | |||
1826 | return err; | 1829 | return err; |
1827 | } | 1830 | } |
1828 | 1831 | ||
1829 | struct inode *udf_iget(struct super_block *sb, struct kernel_lb_addr *ino) | 1832 | struct inode *__udf_iget(struct super_block *sb, struct kernel_lb_addr *ino, |
1833 | bool hidden_inode) | ||
1830 | { | 1834 | { |
1831 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); | 1835 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); |
1832 | struct inode *inode = iget_locked(sb, block); | 1836 | struct inode *inode = iget_locked(sb, block); |
@@ -1839,7 +1843,7 @@ struct inode *udf_iget(struct super_block *sb, struct kernel_lb_addr *ino) | |||
1839 | return inode; | 1843 | return inode; |
1840 | 1844 | ||
1841 | memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); | 1845 | memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); |
1842 | err = udf_read_inode(inode); | 1846 | err = udf_read_inode(inode, hidden_inode); |
1843 | if (err < 0) { | 1847 | if (err < 0) { |
1844 | iget_failed(inode); | 1848 | iget_failed(inode); |
1845 | return ERR_PTR(err); | 1849 | return ERR_PTR(err); |