diff options
author | Jan Kara <jack@suse.cz> | 2014-10-09 06:52:16 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2014-10-09 07:06:14 -0400 |
commit | 6174c2eb8ecef271159bdcde460ce8af54d8f72f (patch) | |
tree | fc00824fdd8231ac9ee32714fc86493149af29d1 /fs/udf/udfdecl.h | |
parent | c53f755d339b5546600c316333140d5fe958941d (diff) |
udf: Fix loading of special inodes
Some UDF media have special inodes (like VAT or metadata partition
inodes) whose link_count is 0. Thus commit 4071b9136223 (udf: Properly
detect stale inodes) broke loading these inodes because udf_iget()
started returning -ESTALE for them. Since we still need to properly
detect stale inodes queried by NFS, create two variants of udf_iget() -
one which is used for looking up special inodes (which ignores
link_count == 0) and one which is used for other cases which return
ESTALE when link_count == 0.
Fixes: 4071b913622316970d0e1919f7d82b4403fec5f2
CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf/udfdecl.h')
-rw-r--r-- | fs/udf/udfdecl.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 742557be9936..1cc3c993ebd0 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -138,7 +138,18 @@ extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, | |||
138 | /* file.c */ | 138 | /* file.c */ |
139 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); | 139 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); |
140 | /* inode.c */ | 140 | /* inode.c */ |
141 | extern struct inode *udf_iget(struct super_block *, struct kernel_lb_addr *); | 141 | extern struct inode *__udf_iget(struct super_block *, struct kernel_lb_addr *, |
142 | bool hidden_inode); | ||
143 | static inline struct inode *udf_iget_special(struct super_block *sb, | ||
144 | struct kernel_lb_addr *ino) | ||
145 | { | ||
146 | return __udf_iget(sb, ino, true); | ||
147 | } | ||
148 | static inline struct inode *udf_iget(struct super_block *sb, | ||
149 | struct kernel_lb_addr *ino) | ||
150 | { | ||
151 | return __udf_iget(sb, ino, false); | ||
152 | } | ||
142 | extern int udf_expand_file_adinicb(struct inode *); | 153 | extern int udf_expand_file_adinicb(struct inode *); |
143 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); | 154 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); |
144 | extern struct buffer_head *udf_bread(struct inode *, int, int, int *); | 155 | extern struct buffer_head *udf_bread(struct inode *, int, int, int *); |