On Tue, Jul 07, 2020 at 07:47:46PM +0200, Christoph Hellwig wrote: > If we write to a file that implements ->write_iter there is no need > to change the address limit if we send a kvec down. Implement that > case, and prefer it over using plain ->write with a changed address > limit if available. You are flipping the priorities of ->write and ->write_iter for kernel_write(). Now, there are 4 instances of file_operations where we have both. null_fops and zero_fops are fine either way - ->write() and ->write_iter() do the same thing there (and arguably removing ->write might be the right thing; the only reason I hesistate is that writing to /dev/null *is* critical for many things, including the proper mail delivery ;-) However, the other two (infinibarf and pcm) are different; there we really have different semantics. I don't believe anything writes into either under KERNEL_DS, but having kernel_write() and vfs_write() with subtly different semantics is asking for trouble down the road. How about we remove ->write in null_fops/zero_fops and fail loudly if *both* ->write() and ->write_iter() are present (in kernel_write(), that is)? There's a similar situation on the read side - there we have /dev/null with both ->read() and ->read_iter() (and there "remove ->read" is obviously the right thing to do) *and* we have pcm crap, with different semantics for ->read() and ->read_iter().