<br><br><div class="gmail_quote">On Wed, Sep 26, 2012 at 12:17 AM, Dave Chinner <span dir="ltr"><<a href="mailto:david@fromorbit.com" target="_blank">david@fromorbit.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wrote:<br>
> thanks Dave for prompt reply, I meant to implement option 2 as you<br>
> explained (option 3). I will start working on it tomorrow. In the mean<br>
> time, I also had to put something in xfs_repair for the files which<br>
> already exists on the disk. Would you guys willing to review/comment on<br>
> that ?<br>
<br>
</div>Sure.<br>
<div class="HOEnZb"><div class="h5"><br>
Cheers,<br>
<br>
Dave.<br>
--<br>
Dave Chinner<br>
<a href="mailto:david@fromorbit.com">david@fromorbit.com</a><br>
</div></div></blockquote></div><br><div>following are my changes for xfs_repair. my goal is to keep changes minimum as they may not included in upstream. I had to do these changes as we already have files with extent map not properly aligned.</div>
<div>As we know, this happens only when we are growing a file in a realtime volume. by keeping this in mind, I am checking if start of a record in extent map is not aligned, check previous record and if they are contiguous, we can skip that part of record. </div>
<div><br></div><div>let me know if you any issues with this or if someone has better approach. I would like to use pointers for prev and irec but again, I wanted to keep changes minimum</div><div><br></div><div>thanks</div>
<div>anand</div><div><br></div><div><br></div><div><div>XFS currently can have records in extent map, which starts from unaligned block w.r.t rextsize.</div><div><br></div><div>--------------------------------------</div>
<div><br></div><div>xfs_repair considers this as a bug (multiple claims for a one real time extent) and deletes the file.</div><div>This patch addresses the issue, by comparing current and previous records and make sure they are</div>
<div>contiguous and not overlapped.</div><div><br></div><div>diff --git a/repair/dinode.c b/repair/dinode.c</div><div>index 5a2da39..5537f1c 100644</div><div>--- a/repair/dinode.c</div><div>+++ b/repair/dinode.c</div><div>
@@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t<span class="Apple-tab-span" style="white-space:pre">        </span>*mp,</div><div> static int</div><div> process_rt_rec(</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_mount_t<span class="Apple-tab-span" style="white-space:pre">                </span>*mp,</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>xfs_bmbt_irec_t <span class="Apple-tab-span" style="white-space:pre">        </span>*prev,</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_bmbt_irec_t <span class="Apple-tab-span" style="white-space:pre">        </span>*irec,</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_ino_t<span class="Apple-tab-span" style="white-space:pre">                </span>ino,</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_drfsbno_t<span class="Apple-tab-span" style="white-space:pre">                </span>*tot,</div>
<div>@@ -413,8 +414,11 @@ process_rt_rec(</div><div> {</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_dfsbno_t<span class="Apple-tab-span" style="white-space:pre">                </span>b;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_drtbno_t<span class="Apple-tab-span" style="white-space:pre">                </span>ext;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>xfs_drtbno_t<span class="Apple-tab-span" style="white-space:pre">                </span>start_block;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>xfs_filblks_t<span class="Apple-tab-span" style="white-space:pre">                </span>block_count;</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>int<span class="Apple-tab-span" style="white-space:pre">                        </span>state;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>int<span class="Apple-tab-span" style="white-space:pre">                        </span>pwe;<span class="Apple-tab-span" style="white-space:pre">                </span>/* partially-written extent */</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>int <span class="Apple-tab-span" style="white-space:pre">                        </span>rtext_remainder;<span class="Apple-tab-span" style="white-space:pre">        </span>/* start block is not aligned w.r.t rextsize */</div>
<div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>/*</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span> * check numeric validity of the extent</div><div>@@ -461,12 +465,32 @@ _("malformed rt inode extent [%" PRIu64 " %" PRIu64 "] (fs rtext size = %u)\n"),</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>return 1;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div> </div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>/* If we have start of record unaligned w.r.t to rextsize, see</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span> * if we are sharing this realtime extent with previous record. sharing is only</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span> * allowed with previous extent. fail otherwise.</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span> * Also, if above condition is true, align start block and block count</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span> */</div><div>
+<span class="Apple-tab-span" style="white-space:pre">        </span>rtext_remainder = irec->br_startblock % mp->m_sb.sb_rextsize;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>if (rtext_remainder) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>do_warn(</div><div>+_("data fork in rt ino %" PRIu64 " has unalinged start block %"PRIu64 "\n"),</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>ino,</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>irec->br_startblock);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if ((prev->br_startoff + prev->br_blockcount == irec->br_startoff) &&</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span> (prev->br_startblock + prev->br_blockcount == irec->br_startblock)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>start_block = irec->br_startblock + (mp->m_sb.sb_rextsize - rtext_remainder);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>block_count = irec->br_blockcount - (mp->m_sb.sb_rextsize - rtext_remainder);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>} else {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>start_block = irec->br_startblock;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>block_count = irec->br_blockcount;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>+</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>/*</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span> * set the appropriate number of extents</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span> * this iterates block by block, this can be optimised using extents</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span> */</div><div>
-<span class="Apple-tab-span" style="white-space:pre">        </span>for (b = irec->br_startblock; b < irec->br_startblock +</div><div>-<span class="Apple-tab-span" style="white-space:pre">                        </span>irec->br_blockcount; b += mp->m_sb.sb_rextsize) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>for (b = start_block; b < start_block + block_count; b += mp->m_sb.sb_rextsize) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize;</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) &&</div><div> <span class="Apple-tab-span" style="white-space:pre">                                </span>irec->br_state == XFS_EXT_UNWRITTEN &&</div>
<div>@@ -548,6 +572,7 @@ process_bmbt_reclist_int(</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>int<span class="Apple-tab-span" style="white-space:pre">                        </span>check_dups,</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>int<span class="Apple-tab-span" style="white-space:pre">                        </span>whichfork)</div>
<div> {</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>xfs_bmbt_irec_t<span class="Apple-tab-span" style="white-space:pre">                </span>prev;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_bmbt_irec_t<span class="Apple-tab-span" style="white-space:pre">                </span>irec;</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_dfilblks_t<span class="Apple-tab-span" style="white-space:pre">                </span>cp = 0;<span class="Apple-tab-span" style="white-space:pre">                </span>/* prev count */</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>xfs_dfsbno_t<span class="Apple-tab-span" style="white-space:pre">                </span>sp = 0;<span class="Apple-tab-span" style="white-space:pre">                </span>/* prev start */</div>
<div>@@ -574,6 +599,11 @@ process_bmbt_reclist_int(</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>else</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>ftype = _("regular");</div>
<div> </div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>prev.br_startoff = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>prev.br_blockcount = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>prev.br_startblock = 0;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>prev.br_state = 0;</div><div>+</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>for (i = 0; i < *numrecs; i++) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>libxfs_bmbt_disk_get_all(rp + i, &irec);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>if (i == 0)</div><div>@@ -610,12 +640,13 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                        </span> * realtime bitmaps don't use AG locks, so returning</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> * immediately is fine for this code path.</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                        </span> */</div><div>-<span class="Apple-tab-span" style="white-space:pre">                        </span>if (process_rt_rec(mp, &irec, ino, tot, check_dups))</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>if (process_rt_rec(mp, &prev, &irec, ino, tot, check_dups))</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                                </span>return 1;</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span>/*</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> * skip rest of loop processing since that'irec.br_startblock</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                        </span> * all for regular file forks and attr forks</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>memcpy(&prev, &irec, sizeof(xfs_bmbt_irec_t));</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                        </span>continue;</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div> </div><div><br></div></div>