From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: Re: [PATCH-v2 1/2] fs: make sure the timestamps for lazytime inodes eventually get written Date: Tue, 17 Mar 2015 11:29:22 +0100 Message-ID: <20150317102922.GC23155@quack.suse.cz> References: <1426533260-3305-1-git-send-email-tytso@mit.edu> <1426533260-3305-2-git-send-email-tytso@mit.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Linux Filesystem Development List , jack@suse.cz, torvalds@linux-foundation.org, viro@zeniv.linux.org.uk, stable@vger.kernel.org To: Theodore Ts'o Return-path: Content-Disposition: inline In-Reply-To: <1426533260-3305-2-git-send-email-tytso@mit.edu> Sender: stable-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Mon 16-03-15 15:14:19, Ted Tso wrote: > Jan Kara pointed out that if there is an inode which is constantly > getting dirtied with I_DIRTY_PAGES, an inode with an updated timestamp > will never be written since inode->dirtied_when is constantly getting > updated. We fix this by adding an extra field to the inode, > dirtied_time_when, so inodes with a stale dirtytime can get detected > and handled. > > In addition, if we have a dirtytime inode caused by an atime update, > and there is no write activity on the file system, we need to have a > secondary system to make sure these inodes get written out. We do > this by setting up a second delayed work structure which wakes up the > CPU much more rarely compared to writeback_expire_centisecs. > > Signed-off-by: Theodore Ts'o > Cc: stable@vger.kernel.org Since this was merged in rc1, I don't think CC to stable is needed. > @@ -505,12 +518,17 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) > spin_lock(&inode->i_lock); > > dirty = inode->i_state & I_DIRTY; > - if (((dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) && > - (inode->i_state & I_DIRTY_TIME)) || > - (inode->i_state & I_DIRTY_TIME_EXPIRED)) { > - dirty |= I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED; > - trace_writeback_lazytime(inode); > - } > + if (inode->i_state & I_DIRTY_TIME) { > + if ((dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) || > + unlikely(inode->i_state & I_DIRTY_TIME_EXPIRED) || > + unlikely(time_after((inode->dirtied_time_when + > + dirtytime_expire_interval * HZ), > + jiffies))) { The time comparison is the other way around, isn't it? After fixing that feel free to add: Reviewed-by: Jan Kara Honza -- Jan Kara SUSE Labs, CR