Re: [PATCH 3/5 resend] VFS: Fix s_umount thaw/write deadlock
From: Christoph Hellwig <hch@infradead.org>
Date: 2011-12-09 11:47:45
Also in:
linux-fsdevel, lkml
On Thu, Dec 08, 2011 at 12:16:58AM +0100, Jan Kara wrote:
quoted
We make sure to not dirty any new inodes after the first phase of the freeze, so this should be a BUG_ON/WARN_ON.This is not really true in presence of mmaped writes. To block mmaped writes on a frozen filesystem, we need some synchronization between page_mkwrite() and freezing code. Currently, to avoid any additional locking overhead, we set page dirty and *then* check for filesystem being frozen. Only this order can make sure either the page is written (and write-protected) or the frozen check triggers and we wait... (see the comment in block_page_mkwrite()). The nasty sideeffect of this is that there can be dirty pages & inodes on a frozen filesystem. We are blocked in the page fault of these pages so user cannot write any data to these pages but still they are marked dirty. Alternatively we could have a different mechanism (rw semaphore?) to synchronize page faults and freezing but I'd hate the overhead for the case almost noone cares about...
I think the is the only sensible way to go forward. Requiring hacks in lots of random places to work around the fact that a single place that might actually dirty pages despite supposedly blocking that from happen simply isn't maintainable over the long run.
quoted
quoted
+ */ + if (vfs_is_frozen(sb)) { + ret = -EBUSY; + goto out_drop_super; + }How about spending the three minutes to figure it out? Q_GETFMT/Q_GETINFO/Q_XGETQSTAT and Q_GETQUOTA are the obvious read-only candidates.Q_GETQUOTA can actually cause filesystem modification (reservation of space in quota file) but the others are read-only. Also after some thought I'd prefer that quotactl(8) just blocks to be consistent with how other syscalls behave...
How can a simple dqget cause modifications in the VFS quota code? Dirting anything for a simple read of the quota information is not only completely non-obvious but also doesn't make much sene. We don't dirty metadata on stat() either..