From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ig0-f170.google.com ([209.85.213.170]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1W8ad9-0006mu-Bi for linux-mtd@lists.infradead.org; Wed, 29 Jan 2014 19:17:01 +0000 Received: by mail-ig0-f170.google.com with SMTP id m12so18051765iga.1 for ; Wed, 29 Jan 2014 11:16:37 -0800 (PST) Date: Wed, 29 Jan 2014 13:13:22 -0600 From: Andrew Ruder To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Subject: Re: [BUG] reproducable ubifs reboot assert and corruption Message-ID: <20140129191322.GC7278@gmail.com> References: <20140122051510.GB17284@gmail.com> <20140127163939.GA27809@gmail.com> <20140129053238.GA6035@gmail.com> <52E8AE25.8080502@nod.at> <20140129154622.GB7278@gmail.com> <52E92494.1090407@nod.at> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="A6N2fC+uXW/VQSAv" Content-Disposition: inline In-Reply-To: <52E92494.1090407@nod.at> Cc: richard@not.at List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , --A6N2fC+uXW/VQSAv Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Jan 29, 2014 at 04:56:04PM +0100, Richard Weinberger wrote: > Does the issue also happen if you disable preemption? > i.e. CONFIG_PREEMPT_NONE=y CONFIG_PREEMPT_NONE=y still breaks. I suspect that sync_filesystem has some blocking behavior that allows other processes to schedule. Another log is attached and the patch I used to create this log is below. I think the most interesting part of this patch is the last hunk that modifies ubifs_remount_ro. This clearly shows that after the mount has been marked as read-only we have dirty inodes waiting for the writeback to come in and hit all the asserts. Here's some of the important parts of the log: 170 pre sync_filesystem # Notice that while we were running sync_filesystem # a inode (0xd75ab658) snuck in with a sys_rename 204 inode: d75ab658 205 ------------[ cut here ]------------ 206 WARNING: CPU: 0 PID: 625 at fs/fs-writeback.c:1213 __mark_inode_dirty+0x2a4/0x2f4() 207 Modules linked in: 208 CPU: 0 PID: 625 Comm: fsstress Tainted: G W 3.12.0-00041-g7f12d39-dirty #250 209 [] (unwind_backtrace+0x0/0x128) from [] (show_stack+0x20/0x24) 210 [] (show_stack+0x20/0x24) from [] (dump_stack+0x20/0x28) 211 [] (dump_stack+0x20/0x28) from [] (warn_slowpath_common+0x78/0x98) 212 [] (warn_slowpath_common+0x78/0x98) from [] (warn_slowpath_null+0x2c/0x34) 213 [] (warn_slowpath_null+0x2c/0x34) from [] (__mark_inode_dirty+0x2a4/0x2f4) 214 [] (__mark_inode_dirty+0x2a4/0x2f4) from [] (ubifs_rename+0x4a4/0x600) 215 [] (ubifs_rename+0x4a4/0x600) from [] (vfs_rename+0x280/0x3f4) 216 [] (vfs_rename+0x280/0x3f4) from [] (SyS_renameat+0x18c/0x218) 217 [] (SyS_renameat+0x18c/0x218) from [] (SyS_rename+0x2c/0x30) 218 [] (SyS_rename+0x2c/0x30) from [] (ret_fast_syscall+0x0/0x2c) 219 ---[ end trace 35ebec8569a53526 ]--- 754 post sync_filesystem 755 pre prepare_remount 756 post prepare_remount 757 prepare_remount success 758 UBIFS: background thread "ubifs_bgt0_0" stops 759 we are now a read-only mount 760 bdi.work_list = d7ac4110, .next = d7ac4110 # WE HAVE DIRTY I/O (notice the .next != &b_dirty) 761 bdi.wb.b_dirty = d7ac40d8, .next = d75accd0 762 bdi.wb.b_io = d7ac40e0, .next = d7ac40e0 763 bdi.wb.b_more_io = d7ac40e8, .next = d7ac40e8 764 do_remount_sb success # And now our friend (inode 0xd75ab658) comes in with a writeback after # we are read-only triggering the assert 779 inode: d75ab658 780 UBIFS assert failed in reserve_space at 125 (pid 11) 781 CPU: 0 PID: 11 Comm: kworker/u2:1 Tainted: G W 3.12.0-00041-g7f12d39-dirty #250 782 Workqueue: writeback bdi_writeback_workfn (flush-ubifs_0_0) 783 [] (unwind_backtrace+0x0/0x128) from [] (show_stack+0x20/0x24) 784 [] (show_stack+0x20/0x24) from [] (dump_stack+0x20/0x28) 785 [] (dump_stack+0x20/0x28) from [] (make_reservation+0x8c/0x560) 786 [] (make_reservation+0x8c/0x560) from [] (ubifs_jnl_write_inode+0xbc/0x214) 787 [] (ubifs_jnl_write_inode+0xbc/0x214) from [] (ubifs_write_inode+0xec/0x17c) 788 [] (ubifs_write_inode+0xec/0x17c) from [] (__writeback_single_inode+0x1fc/0x308) 789 [] (__writeback_single_inode+0x1fc/0x308) from [] (writeback_sb_inodes+0x1f8/0x3c4) 790 [] (writeback_sb_inodes+0x1f8/0x3c4) from [] (__writeback_inodes_wb+0x80/0xc0) 791 [] (__writeback_inodes_wb+0x80/0xc0) from [] (wb_writeback+0x198/0x310) 792 [] (wb_writeback+0x198/0x310) from [] (bdi_writeback_workfn+0x15c/0x454) 793 [] (bdi_writeback_workfn+0x15c/0x454) from [] (process_one_work+0x280/0x420) 794 [] (process_one_work+0x280/0x420) from [] (worker_thread+0x240/0x380) 795 [] (worker_thread+0x240/0x380) from [] (kthread+0xbc/0xc8) 796 [] (kthread+0xbc/0xc8) from [] (ret_from_fork+0x14/0x20) - Andy --- patch --- diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 9f4935b..48e4272 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -93,6 +93,10 @@ static void bdi_queue_work(struct backing_dev_info *bdi, { trace_writeback_queue(bdi, work); + do { + extern bool ubifs_enable_debug; + WARN_ON(ubifs_enable_debug); + } while (0); spin_lock_bh(&bdi->wb_lock); list_add_tail(&work->list, &bdi->work_list); spin_unlock_bh(&bdi->wb_lock); @@ -194,6 +198,11 @@ static void redirty_tail(struct inode *inode, struct bdi_writeback *wb) if (time_before(inode->dirtied_when, tail->dirtied_when)) inode->dirtied_when = jiffies; } + do { + extern bool ubifs_enable_debug; + if (ubifs_enable_debug) pr_info("inode: %p\n", inode); + WARN_ON(ubifs_enable_debug); + } while (0); list_move(&inode->i_wb_list, &wb->b_dirty); } @@ -204,6 +213,11 @@ static void requeue_io(struct inode *inode, struct bdi_writeback *wb) { assert_spin_locked(&wb->list_lock); list_move(&inode->i_wb_list, &wb->b_more_io); + do { + extern bool ubifs_enable_debug; + if (ubifs_enable_debug) pr_info("inode: %p\n", inode); + WARN_ON(ubifs_enable_debug); + } while (0); } static void inode_sync_complete(struct inode *inode) @@ -437,6 +451,8 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) unsigned dirty; int ret; + extern bool ubifs_enable_debug; + if (ubifs_enable_debug) pr_info("inode: %p\n", inode); WARN_ON(!(inode->i_state & I_SYNC)); trace_writeback_single_inode_start(inode, wbc, nr_to_write); @@ -1191,6 +1207,11 @@ void __mark_inode_dirty(struct inode *inode, int flags) inode->dirtied_when = jiffies; list_move(&inode->i_wb_list, &bdi->wb.b_dirty); + do { + extern bool ubifs_enable_debug; + if (ubifs_enable_debug) pr_info("inode: %p\n", inode); + WARN_ON(ubifs_enable_debug); + } while (0); spin_unlock(&bdi->wb.list_lock); if (wakeup_bdi) diff --git a/fs/super.c b/fs/super.c index 0225c20..29afc68 100644 --- a/fs/super.c +++ b/fs/super.c @@ -737,6 +737,12 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) int retval; int remount_ro; + extern bool ubifs_enable_debug; + if (flags & MS_RDONLY) { + ubifs_enable_debug = true; + } + WARN_ON(ubifs_enable_debug); + if (sb->s_writers.frozen != SB_UNFROZEN) return -EBUSY; @@ -747,8 +753,11 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) if (flags & MS_RDONLY) acct_auto_close(sb); + pr_info("pre shrink_dcache_sb\n"); shrink_dcache_sb(sb); + pr_info("pre sync_filesystem\n"); sync_filesystem(sb); + pr_info("post sync_filesystem\n"); remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); @@ -758,9 +767,12 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) if (force) { mark_files_ro(sb); } else { + pr_info("pre prepare_remount\n"); retval = sb_prepare_remount_readonly(sb); + pr_info("post prepare_remount\n"); if (retval) return retval; + pr_info("prepare_remount success\n"); } } @@ -789,6 +801,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) */ if (remount_ro && sb->s_bdev) invalidate_bdev(sb->s_bdev); + pr_info("do_remount_sb success\n"); return 0; cancel_readonly: diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 123c79b..c9f2d5d 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -902,6 +902,8 @@ static int do_writepage(struct page *page, int len) struct inode *inode = page->mapping->host; struct ubifs_info *c = inode->i_sb->s_fs_info; + WARN_ON(c->ro_mount); + #ifdef UBIFS_DEBUG spin_lock(&ui->ui_lock); ubifs_assert(page->index <= ui->synced_i_size << PAGE_CACHE_SIZE); diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 3e4aa72..8cbb731 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -38,6 +38,8 @@ #include #include "ubifs.h" +bool ubifs_enable_debug; + /* * Maximum amount of memory we may 'kmalloc()' without worrying that we are * allocating too much. @@ -1756,6 +1758,11 @@ static void ubifs_remount_ro(struct ubifs_info *c) err = dbg_check_space_info(c); if (err) ubifs_ro_mode(c, err); + pr_info("we are now a read-only mount\n"); + pr_info("bdi.work_list = %p, .next = %p\n", &c->bdi.work_list, c->bdi.work_list.next); + pr_info("bdi.wb.b_dirty = %p, .next = %p\n", &c->bdi.wb.b_dirty, c->bdi.wb.b_dirty.next); + pr_info("bdi.wb.b_io = %p, .next = %p\n", &c->bdi.wb.b_io, c->bdi.wb.b_io.next); + pr_info("bdi.wb.b_more_io = %p, .next = %p\n", &c->bdi.wb.b_more_io, c->bdi.wb.b_more_io.next); mutex_unlock(&c->umount_mutex); } --A6N2fC+uXW/VQSAv Content-Type: application/x-gunzip Content-Disposition: attachment; filename="experiments11.small.txt.gz" Content-Transfer-Encoding: base64 H4sICEow6VIAA2V4cGVyaW1lbnRzMTEuc21hbGwudHh0AL1daY/bSJL9Pr+C8H7xYHzkEZFH YXcBu49BY3t7G9vT2x8GA4GiqLKmq6RaUbLb++s3M8lUSSWqmKQyqgE3bCryZObL40U8MsaL arNe19WuXvyJMVH8+vGHm6Lc7crq02p9W9zvFlDsNsV+vmLud9n+3lTleu1/XjXFcrVeNZ9C ajhOXS/axK/X5X1dvFqUu/LVm6JZ/V9dKFn85+rjn4/yxTblz999DBY3BZecaVHMv+7qpnjN hSn+w6V4U/x4ZMEsQGvhclBtDver9bv39+Uf74of3v9XsV+vdsG8cfbvkQtXgf387UN5W7c1 4S6lblP+zw/fFp/qclFvi81y2dS7m0K52pd3q9u1a4sCV7pvxOFXVymX2rSpbzebha++KwgZ vinmZfwne+N6eLvdP7gejo9cOtum2zeuvM+bu/29b9KbYrXe1dt1edc9a8LD0J7ugctsv46l c9a1uvzj/X1drot6WzZ1a1JvfQPeC/mm+O3HYvdpWzefNneLmwKYVa6g+9AJ9f/u63VVF+v9 /dyn4FJz161otMudd+/zc7m6K+d39WOLdpudq6PLst5+rk8a7v/6+MNys41dUXwq14s7N2hC +3k30uZl9fvt1tV3EaroTF+5ITGb3+7Y4lXR7Mqt6zaXq3s5KH2dwgj8/pdLKZdNSDtjTxOD dIkhJr4PPbTw/ywW9eeV6wHXqraL/d/aMbvdbHbL5pVLiDFh//jzI1R3I/TyCDStsR+Hcdhy FTP+/pcuXwXCSmSHnBX3k+VNAZb70htXxD83+zBGwhA2LoF8NDettVKtsStCxyJO3opvm3sT MRkLtXfW5tBF9WJVetP70hl+gfdbVry+K531zk/78MDV5ddfXe8y9vH7bwX7/i1+Y+1b+PDd x7cfPkj21hX+Hf/W4ocP8J2bevfl3V3x489/c92/qO9cYbZ4e/Tf34tqv3NzcFsX/zh+/icm WPHbh//+6Yef/npTfPPzr77e7qW6vnKNK3fFsnnf7B/q7bvqRrtXstjMtnV4w7Nm/hf2B7L3 7A/BzGvXPuF6c7PY37k2u7H4u+uM1frGPRZn+X6zub/vBkrx02ZX7MpVGDLyHRfvXNMc3PG3 t3rJxULat4vVdve1+BeBbmwLWfz9XyvmhtsS4d//Ubzer7+s1ouZH7G7bVnVrk6+Sm4K/7lY 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 --A6N2fC+uXW/VQSAv--