lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 13 Jan 2020 13:51:59 -0800 From: "Darrick J. Wong" <darrick.wong@...cle.com> To: Ritesh Harjani <riteshh@...ux.ibm.com> Cc: linux-ext4@...r.kernel.org, tytso@....edu, jack@...e.cz Subject: Re: [RFC 1/2] iomap: direct-io: Move inode_dio_begin before filemap_write_and_wait_range On Mon, Jan 13, 2020 at 04:34:21PM +0530, Ritesh Harjani wrote: > Some filesystems (e.g. ext4) need to know in it's writeback path, that > whether DIO is in progress or not. This info may be needed to avoid the > stale data exposure race with DIO reads. Does XFS have this problem too? Admittedly dio read during mmap write is probably not well supported. ;) > Signed-off-by: Ritesh Harjani <riteshh@...ux.ibm.com> > --- > fs/iomap/direct-io.c | 17 +++++++++++++---- Might want to cc fsdevel and the iomap maintainers... --D > 1 file changed, 13 insertions(+), 4 deletions(-) > > diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c > index 23837926c0c5..d1c159bd3854 100644 > --- a/fs/iomap/direct-io.c > +++ b/fs/iomap/direct-io.c > @@ -468,9 +468,18 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, > flags |= IOMAP_NOWAIT; > } > > + /* > + * Call inode_dio_begin() before we write out and wait for writeback to > + * complete. This may be needed by some filesystems to prevent race > + * like stale data exposure by DIO reads. > + */ > + inode_dio_begin(inode); > + /* So that i_dio_count is incremented before below operation */ > + smp_mb__after_atomic(); > + > ret = filemap_write_and_wait_range(mapping, pos, end); > if (ret) > - goto out_free_dio; > + goto out_end_dio; > > /* > * Try to invalidate cache pages for the range we're direct > @@ -488,11 +497,9 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, > !inode->i_sb->s_dio_done_wq) { > ret = sb_init_dio_done_wq(inode->i_sb); > if (ret < 0) > - goto out_free_dio; > + goto out_end_dio; > } > > - inode_dio_begin(inode); > - > blk_start_plug(&plug); > do { > ret = iomap_apply(inode, pos, count, flags, ops, dio, > @@ -568,6 +575,8 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, > > return iomap_dio_complete(dio); > > +out_end_dio: > + inode_dio_end(inode); > out_free_dio: > kfree(dio); > return ret; > -- > 2.21.0 >
Powered by blists - more mailing lists