gfs2: Remove sdp->sd_jheightsize
GFS2 keeps two arrarys in the superblock that define the maximum size of an inode depending on the inode's height: sdp->sd_heightsize defines the heights in units of sb->s_blocksize; sdp->sd_jheightsize defines them in units of sb->s_blocksize - sizeof(struct gfs2_meta_header). These arrays are used to determine when additional layers of indirect blocks are needed. The second array is used for directories which have an additional gfs2_meta_header at the beginning of each block. Distinguishing between these two cases makes no sense: the height required for representing N blocks will come out the same no matter if the calculation is done in gross (sb->s_blocksize) or net (sb->s_blocksize - sizeof(struct gfs2_meta_header)) units. Stuffed directories don't have an additional gfs2_meta_header, but the stuffed case is handled separately for both files and directories, anyway. Remove the unncessary sdp->sd_jheightsize array. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
This commit is contained in:
Родитель
16e205cf42
Коммит
9a38662ba4
|
@ -700,8 +700,6 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
|
|||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_sbd *sdp = GFS2_SB(inode);
|
||||
struct metapath mp = { .mp_aheight = 1, };
|
||||
unsigned int factor = sdp->sd_sb.sb_bsize;
|
||||
const u64 *arr = sdp->sd_heightsize;
|
||||
__be64 *ptr;
|
||||
sector_t lblock;
|
||||
sector_t lend;
|
||||
|
@ -737,22 +735,12 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
|
|||
iomap->flags = IOMAP_F_MERGED;
|
||||
bmap_lock(ip, flags & IOMAP_WRITE);
|
||||
|
||||
/*
|
||||
* Directory data blocks have a struct gfs2_meta_header header, so the
|
||||
* remaining size is smaller than the filesystem block size. Logical
|
||||
* block numbers for directories are in units of this remaining size!
|
||||
*/
|
||||
if (gfs2_is_dir(ip)) {
|
||||
factor = sdp->sd_jbsize;
|
||||
arr = sdp->sd_jheightsize;
|
||||
}
|
||||
|
||||
ret = gfs2_meta_inode_buffer(ip, &mp.mp_bh[0]);
|
||||
if (ret)
|
||||
goto out_release;
|
||||
|
||||
height = ip->i_height;
|
||||
while ((lblock + 1) * factor > arr[height])
|
||||
while ((lblock + 1) * sdp->sd_sb.sb_bsize > sdp->sd_heightsize[height])
|
||||
height++;
|
||||
find_metapath(sdp, lblock, &mp, height);
|
||||
if (height > ip->i_height || gfs2_is_stuffed(ip))
|
||||
|
|
|
@ -696,8 +696,6 @@ struct gfs2_sbd {
|
|||
u32 sd_max_dirres; /* Max blocks needed to add a directory entry */
|
||||
u32 sd_max_height; /* Max height of a file's metadata tree */
|
||||
u64 sd_heightsize[GFS2_MAX_META_HEIGHT + 1];
|
||||
u32 sd_max_jheight; /* Max height of journaled file's meta tree */
|
||||
u64 sd_jheightsize[GFS2_MAX_META_HEIGHT + 1];
|
||||
u32 sd_max_dents_per_leaf; /* Max number of dirents in a leaf block */
|
||||
|
||||
struct gfs2_args sd_args; /* Mount arguments */
|
||||
|
|
|
@ -335,25 +335,6 @@ static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
|
|||
sdp->sd_heightsize[x] = ~0;
|
||||
gfs2_assert(sdp, sdp->sd_max_height <= GFS2_MAX_META_HEIGHT);
|
||||
|
||||
sdp->sd_jheightsize[0] = sdp->sd_sb.sb_bsize -
|
||||
sizeof(struct gfs2_dinode);
|
||||
sdp->sd_jheightsize[1] = sdp->sd_jbsize * sdp->sd_diptrs;
|
||||
for (x = 2;; x++) {
|
||||
u64 space, d;
|
||||
u32 m;
|
||||
|
||||
space = sdp->sd_jheightsize[x - 1] * sdp->sd_inptrs;
|
||||
d = space;
|
||||
m = do_div(d, sdp->sd_inptrs);
|
||||
|
||||
if (d != sdp->sd_jheightsize[x - 1] || m)
|
||||
break;
|
||||
sdp->sd_jheightsize[x] = space;
|
||||
}
|
||||
sdp->sd_max_jheight = x;
|
||||
sdp->sd_jheightsize[x] = ~0;
|
||||
gfs2_assert(sdp, sdp->sd_max_jheight <= GFS2_MAX_META_HEIGHT);
|
||||
|
||||
sdp->sd_max_dents_per_leaf = (sdp->sd_sb.sb_bsize -
|
||||
sizeof(struct gfs2_leaf)) /
|
||||
GFS2_MIN_DIRENT_SIZE;
|
||||
|
|
Загрузка…
Ссылка в новой задаче