Blame SOURCES/9005-Compat-Add-fiemap_prep-function.patch

Kmods SIG 63c143
From 9d008240e684ea13b35b107589f354a266aca850 Mon Sep 17 00:00:00 2001
Kmods SIG 63c143
From: Peter Georg <peter.georg@physik.uni-regensburg.de>
Kmods SIG 63c143
Date: Wed, 22 Sep 2021 22:32:42 +0200
Kmods SIG 63c143
Subject: [PATCH 9005/9005] Compat: Add fiemap_prep function
Kmods SIG 63c143
Kmods SIG 63c143
---
Kmods SIG 63c143
 src/compat.h | 43 +++++++++++++++++++++++++++++++++++++++++++
Kmods SIG 63c143
 src/file.c   |  2 ++
Kmods SIG 63c143
 2 files changed, 45 insertions(+)
Kmods SIG 63c143
 create mode 100644 src/compat.h
Kmods SIG 63c143
Kmods SIG 63c143
diff --git a/src/compat.h b/src/compat.h
Kmods SIG 63c143
new file mode 100644
Kmods SIG 63c143
index 0000000..9862d76
Kmods SIG 63c143
--- /dev/null
Kmods SIG 63c143
+++ b/src/compat.h
Kmods SIG 63c143
@@ -0,0 +1,43 @@
Kmods SIG 63c143
+ /**
Kmods SIG 63c143
+ * fiemap_prep - check validity of requested flags for fiemap
Kmods SIG 63c143
+ * @inode:	Inode to operate on
Kmods SIG 63c143
+ * @fieinfo:	Fiemap context passed into ->fiemap
Kmods SIG 63c143
+ * @start:	Start of the mapped range
Kmods SIG 63c143
+ * @len:	Length of the mapped range, can be truncated by this function.
Kmods SIG 63c143
+ * @supported_flags:	Set of fiemap flags that the file system understands
Kmods SIG 63c143
+ *
Kmods SIG 63c143
+ * This function must be called from each ->fiemap instance to validate the
Kmods SIG 63c143
+ * fiemap request against the file system parameters.
Kmods SIG 63c143
+ *
Kmods SIG 63c143
+ * Returns 0 on success, or a negative error on failure.
Kmods SIG 63c143
+ */
Kmods SIG 63c143
+static int fiemap_prep(struct inode *inode, struct fiemap_extent_info *fieinfo,
Kmods SIG 63c143
+		u64 start, u64 *len, u32 supported_flags)
Kmods SIG 63c143
+{
Kmods SIG 63c143
+	u64 maxbytes = inode->i_sb->s_maxbytes;
Kmods SIG 63c143
+	u32 incompat_flags;
Kmods SIG 63c143
+	int ret = 0;
Kmods SIG 63c143
+
Kmods SIG 63c143
+	if (*len == 0)
Kmods SIG 63c143
+		return -EINVAL;
Kmods SIG 63c143
+	if (start > maxbytes)
Kmods SIG 63c143
+		return -EFBIG;
Kmods SIG 63c143
+
Kmods SIG 63c143
+	/*
Kmods SIG 63c143
+	 * Shrink request scope to what the fs can actually handle.
Kmods SIG 63c143
+	 */
Kmods SIG 63c143
+	if (*len > maxbytes || (maxbytes - *len) < start)
Kmods SIG 63c143
+		*len = maxbytes - start;
Kmods SIG 63c143
+
Kmods SIG 63c143
+	supported_flags |= FIEMAP_FLAG_SYNC;
Kmods SIG 63c143
+	supported_flags &= FIEMAP_FLAGS_COMPAT;
Kmods SIG 63c143
+	incompat_flags = fieinfo->fi_flags & ~supported_flags;
Kmods SIG 63c143
+	if (incompat_flags) {
Kmods SIG 63c143
+		fieinfo->fi_flags = incompat_flags;
Kmods SIG 63c143
+		return -EBADR;
Kmods SIG 63c143
+	}
Kmods SIG 63c143
+
Kmods SIG 63c143
+	if (fieinfo->fi_flags & FIEMAP_FLAG_SYNC)
Kmods SIG 63c143
+		ret = filemap_write_and_wait(inode->i_mapping);
Kmods SIG 63c143
+	return ret;
Kmods SIG 63c143
+}
Kmods SIG 63c143
diff --git a/src/file.c b/src/file.c
Kmods SIG 63c143
index d89afcd..d72800c 100644
Kmods SIG 63c143
--- a/src/file.c
Kmods SIG 63c143
+++ b/src/file.c
Kmods SIG 63c143
@@ -17,6 +17,8 @@
Kmods SIG 63c143
 #include "ntfs.h"
Kmods SIG 63c143
 #include "ntfs_fs.h"
Kmods SIG 63c143
 
Kmods SIG 63c143
+#include "compat.h"
Kmods SIG 63c143
+
Kmods SIG 63c143
 static int ntfs_ioctl_fitrim(struct ntfs_sb_info *sbi, unsigned long arg)
Kmods SIG 63c143
 {
Kmods SIG 63c143
 	struct fstrim_range __user *user_range;
Kmods SIG 63c143
-- 
Kmods SIG 63c143
2.31.1
Kmods SIG 63c143