|
@@ -378,6 +378,20 @@ static inline void xfs_ifunlock(struct xfs_inode *ip)
|
|
|
#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \
|
|
|
>> XFS_ILOCK_SHIFT)
|
|
|
|
|
|
+/*
|
|
|
+ * Layouts are broken in the BREAK_WRITE case to ensure that
|
|
|
+ * layout-holders do not collide with local writes. Additionally,
|
|
|
+ * layouts are broken in the BREAK_UNMAP case to make sure the
|
|
|
+ * layout-holder has a consistent view of the file's extent map. While
|
|
|
+ * BREAK_WRITE breaks can be satisfied by recalling FL_LAYOUT leases,
|
|
|
+ * BREAK_UNMAP breaks additionally require waiting for busy dax-pages to
|
|
|
+ * go idle.
|
|
|
+ */
|
|
|
+enum layout_break_reason {
|
|
|
+ BREAK_WRITE,
|
|
|
+ BREAK_UNMAP,
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* For multiple groups support: if S_ISGID bit is set in the parent
|
|
|
* directory, group of new file is set to that of the parent, and
|
|
@@ -443,6 +457,8 @@ enum xfs_prealloc_flags {
|
|
|
|
|
|
int xfs_update_prealloc_flags(struct xfs_inode *ip,
|
|
|
enum xfs_prealloc_flags flags);
|
|
|
+int xfs_break_layouts(struct inode *inode, uint *iolock,
|
|
|
+ enum layout_break_reason reason);
|
|
|
|
|
|
/* from xfs_iops.c */
|
|
|
extern void xfs_setup_inode(struct xfs_inode *ip);
|