From: Lachlan McIlroy <lachlan@sgi.com>
To: xfs-oss <xfs@oss.sgi.com>
Subject: [RFC, PATCH] XFS_TRANS_DEBUG fixes
Date: Fri, 05 Dec 2008 18:10:24 +1100 [thread overview]
Message-ID: <4938D3E0.5050501@sgi.com> (raw)
XFS_TRANS_DEBUG is not enabled on a debug build and has suffered some bit rot.
Below is a set of fixes to get it working again. Whether it's of any use I don't
know but if we are going to carry the code we might as well make it work.
Some of the things I had to do to get it to work (and could be done some other
way) are:
- all buffers that are logged need to be mapped into kernel space so the
debugging code can make a copy of the buffer data and compare it later.
The easiest way to do that is to make all buffers mapped in xfs_bug_get_flags()
when XFS_TRANS_DEBUG is set.
- turning XFS_TRANS_DEBUG on does make the system run really slow (even slower
than a normal debug build) so we might want to keep it optional.
- Some bit setting functions (btst()/bset()/bfset()) appear to be missing so
I've coded up some trivial versions. There maybe some linux kernel functions
that do the same thing.
- the transaction debugging code will detect if we have modified more data in a
buffer than we have indicated to be logged. This picked up two places where
we modify a inode cluster buffer without logging it - firstly when we create
a new inode cluster we zero the entire buffer but only log the inode fields
(ie data after the xfs_dicore_t finishes is modified) and secondly the bulkstat
hack that zeroes the di_mode. I don't know if not logging these buffer changes
is actually a bug or not.
Is this debugging code worth hanging onto or should we just ditch the whole lot?
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index cd89c56..4ee182c 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -584,6 +584,10 @@ xfs_buf_get_flags(
xfs_buf_t *bp, *new_bp;
int error = 0, i;
+#ifdef XFS_TRANS_DEBUG
+ flags |= XBF_MAPPED;
+#endif
+
new_bp = xfs_buf_allocate(flags);
if (unlikely(!new_bp))
return NULL;
diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h
index 17254b5..3df4a54 100644
--- a/fs/xfs/xfs.h
+++ b/fs/xfs/xfs.h
@@ -38,6 +38,7 @@
#define XFS_RW_TRACE 1
#define XFS_BUF_TRACE 1
#define XFS_INODE_TRACE 1
+#define XFS_TRANS_DEBUG 1
#define XFS_FILESTREAMS_TRACE 1
#endif
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index d245d04..bb019a0 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -35,6 +35,37 @@ kmem_zone_t *xfs_buf_item_zone;
#ifdef XFS_TRANS_DEBUG
/*
+ * Test bit b in bitmap bp
+ */
+int
+btst(char *bp, int b)
+{
+ return (*(bp + (b >> 3)) & (0x80 >> (b & 0x7)));
+}
+
+/*
+ * Set bit b in bitmap bp
+ */
+void
+bset(char *bp, int b)
+{
+ *(bp + (b >> 3)) |= (0x80 >> (b & 0x7));
+}
+
+/*
+ * Set a bit field of length len in bitmap bp starting at b
+ */
+void
+bfset(char *bp, int b, int len)
+{
+ while (len) {
+ bset(bp, b);
+ len--;
+ b++;
+ }
+}
+
+/*
* This function uses an alternate strategy for tracking the bytes
* that the user requests to be logged. This can then be used
* in conjunction with the bli_orig array in the buf log item to
@@ -126,7 +157,7 @@ xfs_buf_item_log_check(
for (x = 0; x < XFS_BUF_COUNT(bp); x++) {
if (orig[x] != buffer[x] && !btst(bip->bli_logged, x))
cmn_err(CE_PANIC,
- "xfs_buf_item_log_check bip %x buffer %x orig %x index %d",
+ "xfs_buf_item_log_check bip %p buffer %p orig %p index %d",
bip, bp, orig, x);
}
}
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c
index e6ebbae..681d622 100644
--- a/fs/xfs/xfs_ialloc.c
+++ b/fs/xfs/xfs_ialloc.c
@@ -353,6 +353,8 @@ xfs_ialloc_ag_alloc(
* transactions causing a lot of log traffic.
*/
xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog);
+ xfs_trans_log_buf(tp, fbuf, 0,
+ (ninodes << args.mp->m_sb.sb_inodelog) - 1);
for (i = 0; i < ninodes; i++) {
int ioffset = i << args.mp->m_sb.sb_inodelog;
uint isize = sizeof(struct xfs_dinode);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 063da34..9d5df3a 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2121,6 +2121,7 @@ xfs_ifree(
{
int error;
int delete;
+ int offset;
xfs_ino_t first_ino;
xfs_dinode_t *dip;
xfs_buf_t *ibp;
@@ -2179,6 +2180,8 @@ xfs_ifree(
* in the future.
*/
dip->di_mode = 0;
+ offset = ip->i_imap.im_boffset + offsetof(xfs_dinode_t, di_mode);
+ xfs_trans_log_buf(tp, ibp, offset, (offset + sizeof(__be16) - 1));
if (delete) {
xfs_ifree_cluster(ip, tp, first_ino);
@@ -2598,9 +2601,7 @@ xfs_iflush_fork(
char *cp;
xfs_ifork_t *ifp;
xfs_mount_t *mp;
-#ifdef XFS_TRANS_DEBUG
- int first;
-#endif
+
static const short brootflag[2] =
{ XFS_ILOG_DBROOT, XFS_ILOG_ABROOT };
static const short dataflag[2] =
@@ -3004,9 +3005,6 @@ xfs_iflush_int(
xfs_inode_log_item_t *iip;
xfs_dinode_t *dip;
xfs_mount_t *mp;
-#ifdef XFS_TRANS_DEBUG
- int first;
-#endif
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
ASSERT(!completion_done(&ip->i_flush));
--- a/fs/xfs/xfsidbg.c 2008-12-04 14:04:58.000000000 +1100
+++ b/fs/xfs/xfsidbg.c 2008-12-04 13:58:54.000000000 +1100
@@ -3231,7 +3208,7 @@ xfs_buf_item_print(xfs_buf_log_item_t *b
kdb_printf("blf flags: ");
printflags((uint)blip->bli_format.blf_flags, blf_flags, NULL);
#ifdef XFS_TRANS_DEBUG
- kdb_printf("orig 0x%x logged 0x%x",
+ kdb_printf("orig 0x%p logged 0x%p",
blip->bli_orig, blip->bli_logged);
#endif
kdb_printf("\n");
@@ -3599,7 +3576,7 @@ xfs_inode_item_print(xfs_inode_log_item_
ilip->ili_ilock_recur, ilip->ili_iolock_recur,
ilip->ili_extents_buf);
#ifdef XFS_TRANS_DEBUG
- kdb_printf("root bytes %d root orig 0x%x\n",
+ kdb_printf("root bytes %d root orig 0x%p\n",
ilip->ili_root_size, ilip->ili_orig_root);
#endif
kdb_printf("size %d ", ilip->ili_format.ilf_size);
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next reply other threads:[~2008-12-05 7:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-05 7:10 Lachlan McIlroy [this message]
2008-12-08 22:54 ` [RFC, PATCH] XFS_TRANS_DEBUG fixes Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4938D3E0.5050501@sgi.com \
--to=lachlan@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.