On Fri, 8 Mar 2019 at 08:31, Christoph Hellwig wrote:
> On Wed, Feb 27, 2019 at 07:03:59PM +0100, Andreas Gruenbacher wrote:
> > Hi Christoph,
> >
> > I've tried to get your feedback on the lockdep_assert_held in
> > iomap_dio_rw in January and didn't hear back from you. Could you
> > please have a look?
>
> Well, I guess we can drop the assert. But I'd really like to retain
> a comment that we require the caller to have a lock - unlike what
> most filesystems do with the old generic direct I/O code, which
> leads to all kinds of issues.
Something like the below perhaps?
Thanks,
Andreas
--
[PATCH] iomap: iomap_dio_rw: Allow filesystem specific locking
Allow filesystem specific locking for reads via iomap_dio_rw. Document that
some form of locking is required.
Signed-off-by: Andreas Gruenbacher
---
fs/iomap.c | 6 +-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/fs/iomap.c b/fs/iomap.c
index a3088fae567ba..03b6ccc2b94fc 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -1793,6 +1793,9 @@ iomap_dio_actor(struct inode *inode, loff_t pos, loff_t
length,
* can be mapped into multiple disjoint IOs and only a subset of the IOs issued
* may be pure data writes. In that case, we still need to do a full data sync
* completion.
+ *
+ * The caller must hold the inode lock or an equivalent filesystem specific
+ * lock.
*/
ssize_t
iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
@@ -1807,7 +1810,8 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
struct blk_plug plug;
struct iomap_dio *dio;
- lockdep_assert_held(>i_rwsem);
+ if (iov_iter_rw(iter) == WRITE)
+ lockdep_assert_held(>i_rwsem);
if (!count)
return 0;
--
2.20.1