On Fri, Jul 28, 2017 at 12:13:52PM -0700, Matthew Wilcox wrote: > On Sat, Jul 29, 2017 at 02:29:58AM +0800, weiping zhang wrote: > > Some filesystems not support O_DIRECT, when user open with O_DIRECT , > > an errno -EINVAL return to userspace by open_check_o_direct, but the > > file has been created, it's a strange thing. Add a checking for that > > can avoid creating file if fs not support O_DIRECT. > > > if (error) > > goto out_dput; > > + /* if fs not support direct io, delete this inode */ > > + if (unlikely(open_flag & O_DIRECT) && > > + !(dentry->d_inode->i_mapping && > > + dentry->d_inode->i_mapping->a_ops && > > + dentry->d_inode->i_mapping->a_ops->direct_IO) && > > + dir_inode->i_op->unlink) { > > + error = dir_inode->i_op->unlink(dir_inode, dentry); > > + if (error == 0) > > + error = -EINVAL; > > + goto out_dput; > > Surely it's better to change the prototype of ->create to take open_flag > (like atomic_open does) and then have the filesystem check for O_DIRECT? > This solution seems quite inelegant to me. thanks your better suggestion, the only concern for me is Viro said: >>Not to mention the modules, or filesystems where that depends upon e.g. mount flags... So I try to find a common way to do that, the positve: only modify 1 file, no affect any specific filysystems, the negtive: this patch seems ugly. if we add/change prototype of ->create every fs will be patched. And if you are in favor of me changing prototype of ->create ,I will send a new patch.