On Thu, 23 Sept 2021 at 15:08, Chengguang Xu <cgxu519@xxxxxxxxxxxx> wrote: > > Now drop overlayfs' inode will sync dirty data, > so we change to only drop clean inode. > > The purpose of doing this is to keep compatible > behavior with before because without this change > dropping overlayfs inode will not trigger syncing > of underlying dirty inode. > > Signed-off-by: Chengguang Xu <cgxu519@xxxxxxxxxxxx> > --- > fs/overlayfs/super.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index cddae3ca2fa5..bf4000eb9be8 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -441,11 +441,25 @@ static int ovl_write_inode(struct inode *inode, > return ret; > } > > +/* > + * In iput_final(), clean inode will drop directly and dirty inode will > + * keep in the cache until write back to sync dirty data then add to lru > + * list to wait reclaim. > + */ > +static int ovl_drop_inode(struct inode *inode) > +{ > + struct inode *upper = ovl_inode_upper(inode); > + > + if (!upper || !(inode->i_state & I_DIRTY_ALL)) Could we check upper dirtyness here? That would give a more precise result. Alternatively don't set .drop_inode (i.e. use generic_drop_inode()) and set I_DONTCACHE on overlay inodes. That would cause the upper inode to be always written back before eviction. The latter would result in simpler logic, and I think performance-wise it wouldn't matter. But I may be missing something. Thanks, Miklos