[GFS2] Reduce inode size by merging fields
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 6 Feb 2008 09:25:45 +0000 (09:25 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 31 Mar 2008 09:40:37 +0000 (10:40 +0100)
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>
fs/gfs2/bmap.c
fs/gfs2/incore.h
fs/gfs2/inode.c
fs/gfs2/rgrp.c

index 2011dd27f8d6100e56b8cffffdedec2ffa122b08..30d718b3438f3daf85e29905db2b08880bc5452f 100644 (file)
@@ -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;
index b67e44baa73ced65f18ef329342cf7e78711d964..c50dcdf7992931f80568a1739fa229621a8c8249 100644 (file)
@@ -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;
index 65fdfee9ca9b45614f0d9a6964aedbbdecc1acb0..c3fe8aa03c4ec09794392c6d1ea0b7a088eb42f3 100644 (file)
@@ -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);
index 3f10b1fafd663a6186b1102ce9f36b4db5e05ea8..66193b45e50bad4f5986f0ab45aa72a83a99f30c 100644 (file)
@@ -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--;