diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2019-06-04 15:49:36 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2019-06-27 02:14:13 +0200 |
commit | 275f5b99d6d4e6fccb7cea6783460939856c1306 (patch) | |
tree | 9b19ace4d37baa130bafa853bd130c2939cd90a0 /fs/adfs | |
parent | fs/adfs: add helper to get discrecord from map (diff) | |
download | linux-275f5b99d6d4e6fccb7cea6783460939856c1306.tar.xz linux-275f5b99d6d4e6fccb7cea6783460939856c1306.zip |
fs/adfs: add helper to get filesystem size
Add a helper to get the filesystem size from the disc record and
eliminate the "s_size" member of the adfs superblock structure.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/adfs')
-rw-r--r-- | fs/adfs/adfs.h | 7 | ||||
-rw-r--r-- | fs/adfs/super.c | 17 |
2 files changed, 9 insertions, 15 deletions
diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h index 5a72a0ea03bd..ab13b5dd34a3 100644 --- a/fs/adfs/adfs.h +++ b/fs/adfs/adfs.h @@ -58,7 +58,6 @@ struct adfs_sb_info { __u32 s_ids_per_zone; /* max. no ids in one zone */ __u32 s_idlen; /* length of ID in map */ __u32 s_map_size; /* sector size of a map */ - unsigned long s_size; /* total size (in blocks) of this fs */ signed int s_map2blk; /* shift left by this for map->sector*/ unsigned int s_log2sharesize;/* log2 share size */ __le32 s_version; /* disc format version */ @@ -201,3 +200,9 @@ struct adfs_discrecord *adfs_map_discrecord(struct adfs_discmap *dm) { return (void *)(dm[0].dm_bh->b_data + 4); } + +static inline u64 adfs_disc_size(const struct adfs_discrecord *dr) +{ + return (u64)le32_to_cpu(dr->disc_size_high) << 32 | + le32_to_cpu(dr->disc_size); +} diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 533c9601a670..7f6d00467baa 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c @@ -220,12 +220,13 @@ static int adfs_statfs(struct dentry *dentry, struct kstatfs *buf) { struct super_block *sb = dentry->d_sb; struct adfs_sb_info *sbi = ADFS_SB(sb); + struct adfs_discrecord *dr = adfs_map_discrecord(sbi->s_map); u64 id = huge_encode_dev(sb->s_bdev->bd_dev); buf->f_type = ADFS_SUPER_MAGIC; buf->f_namelen = sbi->s_namelen; buf->f_bsize = sb->s_blocksize; - buf->f_blocks = sbi->s_size; + buf->f_blocks = adfs_disc_size(dr) >> sb->s_blocksize_bits; buf->f_files = sbi->s_ids_per_zone * sbi->s_map_size; buf->f_bavail = buf->f_bfree = adfs_map_free(sb); @@ -329,8 +330,7 @@ static struct adfs_discmap *adfs_read_map(struct super_block *sb, struct adfs_di i = zone - 1; dm[0].dm_startblk = 0; dm[0].dm_startbit = ADFS_DR_SIZE_BITS; - dm[i].dm_endbit = (le32_to_cpu(dr->disc_size_high) << (32 - dr->log2bpmb)) + - (le32_to_cpu(dr->disc_size) >> dr->log2bpmb) + + dm[i].dm_endbit = (adfs_disc_size(dr) >> dr->log2bpmb) + (ADFS_DR_SIZE_BITS - i * zone_size); if (adfs_checkmap(sb, dm)) @@ -346,16 +346,6 @@ error_free: return ERR_PTR(-EIO); } -static inline unsigned long adfs_discsize(struct adfs_discrecord *dr, int block_bits) -{ - unsigned long discsize; - - discsize = le32_to_cpu(dr->disc_size_high) << (32 - block_bits); - discsize |= le32_to_cpu(dr->disc_size) >> block_bits; - - return discsize; -} - static int adfs_fill_super(struct super_block *sb, void *data, int silent) { struct adfs_discrecord *dr; @@ -445,7 +435,6 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) asb->s_idlen = dr->idlen; asb->s_map_size = dr->nzones | (dr->nzones_high << 8); asb->s_map2blk = dr->log2bpmb - dr->log2secsize; - asb->s_size = adfs_discsize(dr, sb->s_blocksize_bits); asb->s_version = dr->format_version; asb->s_log2sharesize = dr->log2sharesize; |