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 <tytso@xxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx 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 <jack@xxxxxxx> Honza -- Jan Kara <jack@xxxxxxx> SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html