[parted-devel] [PATCH] libparted: Add support for MBR id and GPT GUID of UDF filesystem
Pali Rohár
pali.rohar at gmail.com
Fri Aug 24 08:29:15 BST 2018
On Thursday 23 August 2018 13:18:58 Phillip Susi wrote:
> On 8/23/2018 12:53 PM, Pali Rohár wrote:
> > UDF must have VRS and AVDP. So first check if there is VRS. Check for
> > AVDP does not make sense if VRS was not detected (VRS = Volume
>
> Right... with you so far.
>
> > Recognition Sequence). And normally AVDP should be at block 256 (but
> > other 3 locations are possible too). So algorithm is:
> >
> > for possible AVDP locations do:
> > for every valid block size do:
> > if there is no valid VRS for block size:
> > continue
> > if AVDP at location for block size is missing:
> > continue
> > report valid UDF with block size
> >
> > But to prevent calling detection of VRS multiple times for different
> > AVDP location, result of VRS detection is cached.
>
> Right... you only need to check for vrs once per block size...
>
> > And because size of VSD is min(2048, block size), detection for VRS with
> > block sizes 512 - 2048 is same too.
>
> Wait... the *size* of the vsd is min(2048, block size), but it's
> *offset* is still a multiple of block size isn't it?
No, offset where VRS starts is fixed to 32kB, independently of block
size.
> So only if it is
> in block 0 will it look the same for 512-2048 block size right? If it
> is in some other block then it won't be detected for all 3 block sizes.
For UDF block size 512 - 2048, size of VSD blocks in VRS is always 2048.
> > So 3 loops is just optimization. First one checks VRS for block size 512
> > - 2048 with (the most common) AVDP location 256. Second loop checks VRS
>
> I see. If the vrs *offset* is also always at a multiple of
> min(2048,block size), then all 64 possible locations for the 3 sizes are
> the same, so you only need to probe 2048 and check the two smaller sizes
> too.
Yes, probe for VSD with 2048 VSD length, and check for AVDP with UDF
block size 512, 1024 and 2048.
> > and AVDP 256 for higher block sizes and last loop use cached result of
> > VRS and checks remaining (less common) AVDP location for every block
> > size.
>
> So you are trying to check only the most common anchor position first
> for each detected block size so that if one or two vrs checks were false
> positives, you don't waste as much time checking the other 3 anchor
> locations?
No, I'm checking for all possible location. But for "most common"
location (AVDP at 256) is checked as the first. Later (in the last
loop) are checked other AVDP locations.
> This will result in slightly less IO needed to correctly detect most
> valid udf filesystems
Yes.
> but most of the time you are going to be probing
> something that isn't udf, so you're still going to have to check all of
> the less likely locations anyhow, so I think the optimization isn't
> really worth the increased complexity.
Why not? For valid UDF filesystem we finish detection as early as
possible.
--
Pali Rohár
pali.rohar at gmail.com
More information about the parted-devel
mailing list