<div dir="ltr"><div><div class="gmail_default" style="font-family:monospace,monospace">Hi all,</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">I've been looking at rgrp.c:gfs2_alloc_blocks(), which is called from various places to allocate single/multiple blocks for inodes. I've come up with some data structures to accomplish recording of these allocations as extents.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">I'm proposing we add a new metadata type for journal blocks that will hold these extent records.</div></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><font face="monospace">GFS2_METATYPE_EX 15 /* <span class="gmail_default" style="font-family:monospace,monospace">New metadata type for a block that will hold extents</span> */<br><br><span class="gmail_default" style="font-family:monospace,monospace">This structure below will be at the start of the block, followed by a number of alloc_ext structures.</span></font><div><font face="monospace, monospace"><br></font><font face="monospace">struct gfs2_extents {</font><span class="gmail_default" style="font-family:monospace,monospace"> /* This structure is 32 bytes long */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span><font face="monospace">struct gfs2_meta_header ex_header;</font><br><span class="gmail_default" style="font-family:monospace,monospace">    </span><font face="monospace">__be32 ex_count;</font><span class="gmail_default" style="font-family:monospace,monospace"> /* count of number of alloc_ext structs that follow this header. */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span><font face="monospace">__be32 __pad;</font><br><font face="monospace">};</font><br><span class="gmail_default" style="font-family:monospace,monospace"></span><span class="gmail_default" style="font-family:monospace,monospace"></span><div><font face="monospace, monospace"><span class="gmail_default" style="font-family:monospace,monospace">/* flags for the alloc_ext struct */</span><br></font><font face="monospace">#<span class="gmail_default" style="">define</span> AE_FL_<span class="gmail_default" style="font-family:monospace,monospace">XXX</span></font><br><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace"><br></span></font><div><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace"></span>struct alloc_ext {<span class="gmail_default" style="font-family:monospace,monospace"> /* This structure is 48 bytes long */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>struct gfs2_inum ae_num;<span class="gmail_default" style="font-family:monospace,monospace"> /* The inode this allocation/deallocation belongs to */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be32 ae_flags;<span class="gmail_default" style="font-family:monospace,monospace"> /* specifies if we're allocating/deallocating, data/metadata, etc. */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be64 ae_start;<span class="gmail_default" style="font-family:monospace,monospace"> /* starting physical block number of the extent */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be64 ae_len;<span class="gmail_default" style="font-family:monospace,monospace">   /* length of the extent */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be32 ae_uid;<span class="gmail_default" style="font-family:monospace,monospace">   /* user this belongs to, for quota accounting */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be32 ae_gid;<span class="gmail_default" style="font-family:monospace,monospace">   /* group this belongs to, for quota accounting */</span><br><span class="gmail_default" style="font-family:monospace,monospace">    </span>__be32 __pad;<br>};</font></div></div><div><font face="monospace"><br></font></div><div><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace">With 4k block sizes, we can fit 84 extents (10 for 512b, 20 for 1k, </span><span class="gmail_default" style="font-family:monospace,monospace">42 for 2k block sizes) in one block. As we process more allocs/deallocs, we keep creating more such alloc_ext records and tack them to the back of this block if there's space or else create a new block. For smaller extents, this might not be efficient, so we might just want to revert to the old method of recording the bitmap blocks instead.</span></font></div></div><div><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace">During journal replay, we decode these new blocks and flip the corresponding bitmaps for each of the blocks represented in the extents. For the ones where we just recorded the bitmap blocks the old-fashioned way, we also replay them the old-fashioned way. This way we're also backward compatible with an older version of gfs2 that only records the bitmaps.</span></font></div><div><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace">Since we record the uid/gid with each extent, we can do the quota accounting without relying on the quota change file. We might need to keep the quota change file around for backward compatibility and for the cases where we might want to record allocs/deallocs the old-fashioned way.</span></font></div><div><font face="monospace"><span class="gmail_default" style="font-family:monospace,monospace"><br></span></font></div><div><div class="gmail_default" style="font-family:monospace,monospace">I'm going to play around with this and come up with some patches to see if this works and what kind of performance improvements we get. These data structures will mostly likely need reworking and renaming, but this is the general direction I'm thinking along.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Please let me know what you think.</div></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Cheers!</div><div class="gmail_default" style="font-family:monospace,monospace">--Abhi</div></div>