Assertion failed: atomic_read(&mp->m_active_trans)

Donald Douwsma
2008-11-25T08:00:03Z

[-- Attachment #1: Type: text/plain, Size: 1634 bytes --]

We still occasionally see transactions in flight after remounting
read-only. This has come up a few times in the past, but we never
seem to have gotten to the bottom of it.

http://www.gossamer-threads.com/lists/linux/kernel/868139

Most recently we've seen this on 2.6.27, when unmounting the root
filesystem during shutdown/reboot.

Stack traceback for pid 13170
0xffff81024dcd9080 13170 12901 1 1 R 0xffff81024dcd93c0 *mount
rsp rip Function (args)
0xffff8101fb977d18 0xffffffff803b8acd assfail+0x1a (invalid, invalid, invalid)
0xffff8101fb977d50 0xffffffff803a57e4 xfs_attr_quiesce+0x4a (0xffff8102211e4b20)
0xffff8101fb977d70 0xffffffff803a589b xfs_mntupdate+0x7c (0xffff8102211e4b20, invalid, invalid)
0xffff8101fb977d90 0xffffffff803b7cf6 xfs_fs_remount+0x49 (invalid, 0xffff8101fb977dd4, invalid)
0xffff8101fb977dc0 0xffffffff802830fe do_remount_sb+0xe9 (0xffff81025c804670, invalid, 0xffff8101ee490000, invalid)
0xffff8101fb977e00 0xffffffff8029698d do_remount+0x7d (0xffff8101fb977e58, invalid, invalid, 0xffff8101ee490000)
0xffff8101fb977e40 0xffffffff802974fd do_mount+0x13b (0xffff8102079c2000, 0xffff8102004ea000, 0xffff810219cb0000, invalid, 0xffff8101ee490000)
0xffff8101fb977f20 0xffffffff8029761a sys_mount+0x89 (0x523d90, invalid, invalid, 0xffffffffc0ed0021, 0x523e30)
0xffff8101fb977f80 0xffffffff8020b18b system_call_after_swapgs+0x7b (invalid, invalid, invalid, invalid, invalid, invalid)

Previously we've discussed changing the ASSERT_ALWAYS to a normal
ASSERT to lessen the impact for users. Any objections to doing this
until we fix the underlying problem?

Don

[-- Attachment #2: Dont-assert-if-transactions-are-in-flight-for-release-builds --]
[-- Type: text/plain, Size: 492 bytes --]

Dont assert if transactions are in flight for release builds.

--- a/fs/xfs/linux-2.6/xfs_sync.c
+++ b/fs/xfs/linux-2.6/xfs_sync.c
@@ -371,7 +371,7 @@ xfs_quiesce_attr(
/* flush inodes and push all remaining buffers out to disk */
xfs_quiesce_fs(mp);

- ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);
+ ASSERT(atomic_read(&mp->m_active_trans) == 0);

/* Push the superblock and write an unmount record */
error = xfs_log_sbcount(mp, 1);

[-- Attachment #3: Type: text/plain, Size: 121 bytes --]