Re: [PATCH] udf: Fix free space reporting for metadata and virtual partitions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday 09 January 2020 13:44:05 Jan Kara wrote:
> On Wed 08-01-20 23:32:40, Pali Rohár wrote:
> > On Wednesday 08 January 2020 13:19:19 Jan Kara wrote:
> > > Free space on filesystems with metadata or virtual partition maps
> > > currently gets misreported. This is because these partitions are just
> > > remapped onto underlying real partitions from which keep track of free
> > > blocks. Take this remapping into account when counting free blocks as
> > > well.
> > > 
> > > Reported-by: Pali Rohár <pali.rohar@xxxxxxxxx>
> > > Signed-off-by: Jan Kara <jack@xxxxxxx>
> > > ---
> > >  fs/udf/super.c | 19 ++++++++++++++-----
> > >  1 file changed, 14 insertions(+), 5 deletions(-)
> > > 
> > > I plan to take this patch to my tree.
> > > 
> > > diff --git a/fs/udf/super.c b/fs/udf/super.c
> > > index 8c28e93e9b73..b89e420a4b85 100644
> > > --- a/fs/udf/super.c
> > > +++ b/fs/udf/super.c
> > > @@ -2492,17 +2492,26 @@ static unsigned int udf_count_free_table(struct super_block *sb,
> > >  static unsigned int udf_count_free(struct super_block *sb)
> > >  {
> > >  	unsigned int accum = 0;
> > > -	struct udf_sb_info *sbi;
> > > +	struct udf_sb_info *sbi = UDF_SB(sb);
> > >  	struct udf_part_map *map;
> > > +	unsigned int part = sbi->s_partition;
> > > +	int ptype = sbi->s_partmaps[part].s_partition_type;
> > > +
> > > +	if (ptype == UDF_METADATA_MAP25) {
> > > +		part = sbi->s_partmaps[part].s_type_specific.s_metadata.
> > > +							s_phys_partition_ref;
> > > +	} else if (ptype == UDF_VIRTUAL_MAP15 || ptype == UDF_VIRTUAL_MAP20) {
> > > +		part = UDF_I(sbi->s_vat_inode)->i_location.
> > > +							partitionReferenceNum;
> > 
> > Hello! I do not think that it make sense to report "free blocks" for
> > discs with Virtual partition. By definition of VAT, all blocks prior to
> > VAT are already "read-only" and therefore these blocks cannot be use for
> > writing new data by any implementation. And because VAT is stored on the
> > last block, in our model all blocks are "occupied".
> 
> Fair enough. Let's just always return 0 for disks with VAT partition.
> 
> > > +	}
> > >  
> > > -	sbi = UDF_SB(sb);
> > >  	if (sbi->s_lvid_bh) {
> > >  		struct logicalVolIntegrityDesc *lvid =
> > >  			(struct logicalVolIntegrityDesc *)
> > >  			sbi->s_lvid_bh->b_data;
> > > -		if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) {
> > > +		if (le32_to_cpu(lvid->numOfPartitions) > part) {
> > >  			accum = le32_to_cpu(
> > > -					lvid->freeSpaceTable[sbi->s_partition]);
> > > +					lvid->freeSpaceTable[part]);
> > 
> > And in any case freeSpaceTable should not be used for discs with VAT.
> > And we should ignore its value for discs with VAT.
> > 
> > UDF 2.60 2.2.6.2: Free Space Table values be maintained ... except ...
> > for a virtual partition ...
> > 
> > And same applies for "partition with Access Type pseudo-overwritable".
> 
> Well this is handled by the 'accum == 0xffffffff' condition below. So we
> effectively ignore these values.

Ok.

> > >  			if (accum == 0xFFFFFFFF)
> > >  				accum = 0;
> > >  		}
> 
> 								Honza

-- 
Pali Rohár
pali.rohar@xxxxxxxxx



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux