[GFS2] Reduce inode size by merging fields
There were three fields being used to keep track of the location of the most recently allocated block for each inode. These have been merged into a single field in order to better keep the data and metadata for an inode close on disk, and also to reduce the space required for storage. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
Родитель
9feb7c889f
Коммит
ce276b06e8
|
@ -1020,9 +1020,7 @@ static int trunc_end(struct gfs2_inode *ip)
|
|||
|
||||
if (!ip->i_di.di_size) {
|
||||
ip->i_height = 0;
|
||||
ip->i_di.di_goal_meta =
|
||||
ip->i_di.di_goal_data =
|
||||
ip->i_no_addr;
|
||||
ip->i_goal = ip->i_no_addr;
|
||||
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
|
||||
}
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
|
||||
|
|
|
@ -241,8 +241,6 @@ enum {
|
|||
struct gfs2_dinode_host {
|
||||
u64 di_size; /* number of bytes in file */
|
||||
u64 di_blocks; /* number of blocks in file */
|
||||
u64 di_goal_meta; /* rgrp to alloc from next */
|
||||
u64 di_goal_data; /* data block goal */
|
||||
u64 di_generation; /* generation number for NFS */
|
||||
u32 di_flags; /* GFS2_DIF_... */
|
||||
/* These only apply to directories */
|
||||
|
@ -262,8 +260,7 @@ struct gfs2_inode {
|
|||
struct gfs2_holder i_iopen_gh;
|
||||
struct gfs2_holder i_gh; /* for prepare/commit_write only */
|
||||
struct gfs2_alloc *i_alloc;
|
||||
u64 i_last_rg_alloc;
|
||||
|
||||
u64 i_goal; /* goal block for allocations */
|
||||
struct rw_semaphore i_rw_mutex;
|
||||
u8 i_height;
|
||||
u8 i_depth;
|
||||
|
|
|
@ -282,8 +282,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
|
|||
ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
|
||||
ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
|
||||
|
||||
di->di_goal_meta = be64_to_cpu(str->di_goal_meta);
|
||||
di->di_goal_data = be64_to_cpu(str->di_goal_data);
|
||||
ip->i_goal = be64_to_cpu(str->di_goal_meta);
|
||||
di->di_generation = be64_to_cpu(str->di_generation);
|
||||
|
||||
di->di_flags = be32_to_cpu(str->di_flags);
|
||||
|
@ -1404,8 +1403,8 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
|
|||
str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
|
||||
str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec);
|
||||
|
||||
str->di_goal_meta = cpu_to_be64(di->di_goal_meta);
|
||||
str->di_goal_data = cpu_to_be64(di->di_goal_data);
|
||||
str->di_goal_meta = cpu_to_be64(ip->i_goal);
|
||||
str->di_goal_data = cpu_to_be64(ip->i_goal);
|
||||
str->di_generation = cpu_to_be64(di->di_generation);
|
||||
|
||||
str->di_flags = cpu_to_be32(di->di_flags);
|
||||
|
@ -1433,10 +1432,8 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
|
|||
printk(KERN_INFO " di_size = %llu\n", (unsigned long long)di->di_size);
|
||||
printk(KERN_INFO " di_blocks = %llu\n",
|
||||
(unsigned long long)di->di_blocks);
|
||||
printk(KERN_INFO " di_goal_meta = %llu\n",
|
||||
(unsigned long long)di->di_goal_meta);
|
||||
printk(KERN_INFO " di_goal_data = %llu\n",
|
||||
(unsigned long long)di->di_goal_data);
|
||||
printk(KERN_INFO " i_goal = %llu\n",
|
||||
(unsigned long long)ip->i_goal);
|
||||
printk(KERN_INFO " di_flags = 0x%.8X\n", di->di_flags);
|
||||
printk(KERN_INFO " i_height = %u\n", ip->i_height);
|
||||
printk(KERN_INFO " i_depth = %u\n", ip->i_depth);
|
||||
|
|
|
@ -915,24 +915,20 @@ static struct inode *try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked)
|
|||
static struct gfs2_rgrpd *recent_rgrp_first(struct gfs2_sbd *sdp,
|
||||
u64 rglast)
|
||||
{
|
||||
struct gfs2_rgrpd *rgd = NULL;
|
||||
struct gfs2_rgrpd *rgd;
|
||||
|
||||
spin_lock(&sdp->sd_rindex_spin);
|
||||
|
||||
if (list_empty(&sdp->sd_rindex_recent_list))
|
||||
goto out;
|
||||
|
||||
if (!rglast)
|
||||
goto first;
|
||||
|
||||
list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
|
||||
if (rgd->rd_addr == rglast)
|
||||
goto out;
|
||||
if (rglast) {
|
||||
list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
|
||||
if (rgrp_contains_block(rgd, rglast))
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
first:
|
||||
rgd = list_entry(sdp->sd_rindex_recent_list.next, struct gfs2_rgrpd,
|
||||
rd_recent);
|
||||
rgd = NULL;
|
||||
if (!list_empty(&sdp->sd_rindex_recent_list))
|
||||
rgd = list_entry(sdp->sd_rindex_recent_list.next,
|
||||
struct gfs2_rgrpd, rd_recent);
|
||||
out:
|
||||
spin_unlock(&sdp->sd_rindex_spin);
|
||||
return rgd;
|
||||
|
@ -1078,7 +1074,7 @@ static struct inode *get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
|
|||
|
||||
/* Try recently successful rgrps */
|
||||
|
||||
rgd = recent_rgrp_first(sdp, ip->i_last_rg_alloc);
|
||||
rgd = recent_rgrp_first(sdp, ip->i_goal);
|
||||
|
||||
while (rgd) {
|
||||
rg_locked = 0;
|
||||
|
@ -1162,8 +1158,6 @@ static struct inode *get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
|
|||
}
|
||||
|
||||
out:
|
||||
ip->i_last_rg_alloc = rgd->rd_addr;
|
||||
|
||||
if (begin) {
|
||||
recent_rgrp_add(rgd);
|
||||
rgd = gfs2_rgrpd_get_next(rgd);
|
||||
|
@ -1425,8 +1419,8 @@ u64 gfs2_alloc_data(struct gfs2_inode *ip)
|
|||
u32 goal, blk;
|
||||
u64 block;
|
||||
|
||||
if (rgrp_contains_block(rgd, ip->i_di.di_goal_data))
|
||||
goal = ip->i_di.di_goal_data - rgd->rd_data0;
|
||||
if (rgrp_contains_block(rgd, ip->i_goal))
|
||||
goal = ip->i_goal - rgd->rd_data0;
|
||||
else
|
||||
goal = rgd->rd_last_alloc_data;
|
||||
|
||||
|
@ -1435,7 +1429,7 @@ u64 gfs2_alloc_data(struct gfs2_inode *ip)
|
|||
rgd->rd_last_alloc_data = blk;
|
||||
|
||||
block = rgd->rd_data0 + blk;
|
||||
ip->i_di.di_goal_data = block;
|
||||
ip->i_goal = block;
|
||||
|
||||
gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
|
||||
rgd->rd_rg.rg_free--;
|
||||
|
@ -1470,8 +1464,8 @@ u64 gfs2_alloc_meta(struct gfs2_inode *ip)
|
|||
u32 goal, blk;
|
||||
u64 block;
|
||||
|
||||
if (rgrp_contains_block(rgd, ip->i_di.di_goal_meta))
|
||||
goal = ip->i_di.di_goal_meta - rgd->rd_data0;
|
||||
if (rgrp_contains_block(rgd, ip->i_goal))
|
||||
goal = ip->i_goal - rgd->rd_data0;
|
||||
else
|
||||
goal = rgd->rd_last_alloc_meta;
|
||||
|
||||
|
@ -1480,7 +1474,7 @@ u64 gfs2_alloc_meta(struct gfs2_inode *ip)
|
|||
rgd->rd_last_alloc_meta = blk;
|
||||
|
||||
block = rgd->rd_data0 + blk;
|
||||
ip->i_di.di_goal_meta = block;
|
||||
ip->i_goal = block;
|
||||
|
||||
gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
|
||||
rgd->rd_rg.rg_free--;
|
||||
|
|
Загрузка…
Ссылка в новой задаче