A 'lease_direct' lease requires that the vma have a valid MAP_DIRECT
mapping established. For xfs we establish a new lease and then check if
the MAP_DIRECT mapping has been broken. We want to be sure that the
process will receive notification that the MAP_DIRECT mapping is being
torn down so it knows why other code paths are throwing failures.
For example in the RDMA/ibverbs case we want ibv_reg_mr() to fail if the
MAP_DIRECT mapping is invalid or in the process of being invalidated.
Cc: Jan Kara <jack@suse.cz>
Cc: Jeff Moyer <redacted>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Dave Chinner <david@fromorbit.com>
Cc: "Darrick J. Wong" <redacted>
Cc: Ross Zwisler <redacted>
Cc: Jeff Layton <redacted>
Cc: "J. Bruce Fields" <redacted>
Signed-off-by: Dan Williams <redacted>
---
fs/xfs/xfs_file.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index e35518600e28..823b65f17429 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1166,6 +1166,33 @@ xfs_filemap_direct_close(
put_map_direct_vma(vma->vm_private_data);
}
+static struct lease_direct *
+xfs_filemap_direct_lease(
+ struct vm_area_struct *vma,
+ void (*break_fn)(void *),
+ void *owner)
+{
+ struct lease_direct *ld;
+
+ ld = map_direct_lease(vma, break_fn, owner);
+
+ if (IS_ERR(ld))
+ return ld;
+
+ /*
+ * We now have an established lease while the base MAP_DIRECT
+ * lease was not broken. So, we know that the "lease holder" will
+ * receive a SIGIO notification when the lease is broken and
+ * take any necessary cleanup actions.
+ */
+ if (!is_map_direct_broken(vma->vm_private_data))
+ return ld;
+
+ map_direct_lease_destroy(ld);
+
+ return ERR_PTR(-ENXIO);
+}
+
static const struct vm_operations_struct xfs_file_vm_direct_ops = {
.fault = xfs_filemap_fault,
.huge_fault = xfs_filemap_huge_fault,@@ -1175,6 +1202,7 @@ static const struct vm_operations_struct xfs_file_vm_direct_ops = {
.open = xfs_filemap_direct_open,
.close = xfs_filemap_direct_close,
+ .lease_direct = xfs_filemap_direct_lease,
};
static const struct vm_operations_struct xfs_file_vm_ops = {
--To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>