mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-20 14:16:02 +00:00
udf: fix anchor point detection
According to ECMA 167 rev. 3 (see 3/8.4.2.1), Anchor Volume Descriptor Pointer should be recorded at two or more anchor points located at sectors 256, N, N - 256, where N - is a largest logical sector number at volume space. So we should always try to detect N on UDF volume before trying to find Anchor Volume Descriptor (i.e. calling to udf_find_anchor()). That said, all this patch does is updates the s_last_block even if the udf_vrs() returns positive value. Originally written and tested by Yuri Per, ported on latest mainline by me. Signed-off-by: Yuri Per <Yuri.Per@acronis.com> Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Cc: Max Lyadvinsky <Max.Lyadvinsky@acronis.com> Cc: Vladimir Simonov <Vladimir.Simonov@acronis.com> Cc: Andrew Neporada <Andrew.Neporada@acronis.com> Cc: Kirill Korotaev <dev@openvz.org> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
b80697c14d
commit
d0db181c07
1 changed files with 6 additions and 9 deletions
|
@ -1425,7 +1425,7 @@ static noinline int udf_process_sequence(struct super_block *sb, long block,
|
|||
static int udf_check_valid(struct super_block *sb, int novrs, int silent)
|
||||
{
|
||||
long block;
|
||||
struct udf_sb_info *sbi;
|
||||
struct udf_sb_info *sbi = UDF_SB(sb);
|
||||
|
||||
if (novrs) {
|
||||
udf_debug("Validity check skipped because of novrs option\n");
|
||||
|
@ -1434,15 +1434,12 @@ static int udf_check_valid(struct super_block *sb, int novrs, int silent)
|
|||
/* Check that it is NSR02 compliant */
|
||||
/* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
|
||||
block = udf_vrs(sb, silent);
|
||||
if (block != -1)
|
||||
return !block;
|
||||
|
||||
sbi = UDF_SB(sb);
|
||||
udf_debug("Failed to read byte 32768. Assuming open "
|
||||
"disc. Skipping validity check\n");
|
||||
if (!sbi->s_last_block)
|
||||
if (block == -1)
|
||||
udf_debug("Failed to read byte 32768. Assuming open "
|
||||
"disc. Skipping validity check\n");
|
||||
if (block && !sbi->s_last_block)
|
||||
sbi->s_last_block = udf_get_last_block(sb);
|
||||
return 0;
|
||||
return !block;
|
||||
}
|
||||
|
||||
static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
|
||||
|
|
Loading…
Reference in a new issue