Hi, I was looking at generic_osync_inode() and found out it's kind of inconsistent with what we have in fsync() path and does not work in all cases e.g. on ext3 / ext4. The problem is that filesystem never actually gets to know that it should sync all metadata needed to reach the data - generic_osync_inode() only does sync_mapping_buffers() but e.g. ext3 / ext4 don't track metadata buffers there. Then it does write_inode_now() which would actually flush the journal, but it does so only in case inode is I_DIRTY_DATASYNC... So there are cases where we sync the data but leave metadata uncommitted. What I'd imagine is that generic_osync_inode() would be just like fdatasync call, only we'd have to add a possibility to avoid fdatawrite / fdatawait as some callers submit / wait for data themselves. That would nicely unify those syncing paths. The only small problem is with an interface since ->fsync() callback takes preferably struct file * and at least struct dentry *, while generic_osync_inode takes just inode. Most of the callers actually have a struct file * pointer but sync_page_range[_nolock]() do not, so that would have to be solved somehow. Any opinions / ideas? Honza -- Jan Kara <jack@xxxxxxx> SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html