Skip to contentSkip to conversation

ocfs2: add ocfs2_overwrite_io()

PATCH New akpm at linux-foundation.org 3 participants 3 messages Nov 30, 2017 – Dec 22, 2017 OCFS2

lore
Share & tools
lore
#0 lore raw

PATCH 10/11 ocfs2: add ocfs2_overwrite_io()

From: Gang He <[email protected]>
Subject: ocfs2: add ocfs2_overwrite_io()

Add ocfs2_overwrite_io(), which is used to judge if overwrite allocated blocks, otherwise, the write will bring extra block allocation overhead.

---

 fs/ocfs2/extent_map.c |   41 ++++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/extent_map.h |    3 ++
 2 files changed, 44 insertions(+)
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +41 -0
diff -puN fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function fs/ocfs2/extent_map.c
@@ -832,6 +832,47 @@ out:
 	return ret;
 }
 
+/* Is IO overwriting allocated blocks? */
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len)
+{
+	int ret = 0, is_last;
+	u32 mapping_end, cpos;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+	struct ocfs2_extent_rec rec;
+
+	if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
+	   ((map_start + map_len) <= i_size_read(inode)))
+		goto out;
+
+	cpos = map_start >> osb->s_clustersize_bits;
+	mapping_end = ocfs2_clusters_for_bytes(inode->i_sb,
+					       map_start + map_len);
+	is_last = 0;
+	while (cpos < mapping_end && !is_last) {
+		ret = ocfs2_get_clusters_nocache(inode, di_bh, cpos,
+						 NULL, &rec, &is_last);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
+
+		if (rec.e_blkno == 0ULL)
+			break;
+
+		if (rec.e_flags & OCFS2_EXT_REFCOUNTED)
+			break;
+
+		cpos = le32_to_cpu(rec.e_cpos) +
+			le16_to_cpu(rec.e_leaf_clusters);
+	}
+
+	if (cpos < mapping_end)
+		ret = -EAGAIN;
+out:
+	return ret;
+}
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int whence)
 {
 	struct inode *inode = file->f_mapping->host;
fs/ocfs2/extent_map.h renamed from fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function +3 -0
diff -puN fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function fs/ocfs2/extent_map.h
@@ -53,6 +53,9 @@ int ocfs2_extent_map_get_blocks(struct i
 int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 		 u64 map_start, u64 map_len);
 
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len);
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int origin);
 
 int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,

_

#1 lore raw

PATCH 10/11 ocfs2: add ocfs2_overwrite_io()

Hi Gang,

Quoted 32 lines · akpm at linux-foundation.org

From: Gang He <[email protected]>
Subject: ocfs2: add ocfs2_overwrite_io()

Add ocfs2_overwrite_io(), which is used to judge if overwrite allocated blocks, otherwise, the write will bring extra block allocation overhead.

---

 fs/ocfs2/extent_map.c |   41 ++++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/extent_map.h |    3 ++
 2 files changed, 44 insertions(+)

diff -puN fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function fs/ocfs2/extent_map.c

fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +3 -0
@@ -832,6 +832,47 @@ out:
 	return ret;
 }
 
+/* Is IO overwriting allocated blocks? */
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len)

fs/ocfs2/extent_map.c out: · line 847

Quoted 10 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +10 -0
+{
+	int ret = 0, is_last;
+	u32 mapping_end, cpos;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+	struct ocfs2_extent_rec rec;
+
+	if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
+	   ((map_start + map_len) <= i_size_read(inode)))
+		goto out;
+

Should we return -EAGAIN directly when the condition ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) && ((map_start + map_len) > i_size_read(inode))) is true?

Thanks,
Alex

Quoted 53 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +28 -0
+	cpos = map_start >> osb->s_clustersize_bits;
+	mapping_end = ocfs2_clusters_for_bytes(inode->i_sb,
+					       map_start + map_len);
+	is_last = 0;
+	while (cpos < mapping_end && !is_last) {
+		ret = ocfs2_get_clusters_nocache(inode, di_bh, cpos,
+						 NULL, &rec, &is_last);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
+
+		if (rec.e_blkno == 0ULL)
+			break;
+
+		if (rec.e_flags & OCFS2_EXT_REFCOUNTED)
+			break;
+
+		cpos = le32_to_cpu(rec.e_cpos) +
+			le16_to_cpu(rec.e_leaf_clusters);
+	}
+
+	if (cpos < mapping_end)
+		ret = -EAGAIN;
+out:
+	return ret;
+}
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int whence)
 {
 	struct inode *inode = file->f_mapping->host;

diff -puN fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function fs/ocfs2/extent_map.h

fs/ocfs2/extent_map.h renamed from fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function +3 -0
@@ -53,6 +53,9 @@ int ocfs2_extent_map_get_blocks(struct i
 int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 		 u64 map_start, u64 map_len);
 
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len);
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int origin);
 
 int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,

_

_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel at oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

.

#2 lore raw

PATCH 10/11 ocfs2: add ocfs2_overwrite_io()

Hi Alex,

Sorry for replaying your mail so late.

Quoted 53 lines
Quoted 1 line
Quoted 1 line

Hi Gang,

Quoted 8 lines · akpm at linux-foundation.org

From: Gang He <[email protected]>
Subject: ocfs2: add ocfs2_overwrite_io()

Add ocfs2_overwrite_io(), which is used to judge if overwrite allocated blocks, otherwise, the write will bring extra block allocation overhead.

[ghe at suse.com: v2]
Link:

https://urldefense.proofpoint.com/v2/url?u=http-3A__lkml.kernel.org_r_151194
4612-2D9629-2D3-2Dgit-2Dsend-2Demail-2Dghe-40suse.com&d=DwICAg&c=RoP1YumCXCgaWHvlZYR8P Zh8Bv7qIrMUB65eapI_JnE&r=C7gAd4uDxlAvTdc0vmU6X8CMk6L2iDY8-HD0qT6Fo7Y&m=C4AZ7lGI2- gfFtbla8puNvYIA3a9Cr_XOH6oyx94oGo&s=QhxdPyP9gdEJZTa2UhuSk0x7ENXyGXUOIBV_LyP8oZ w&e=

Quoted 1 line

Link:

https://urldefense.proofpoint.com/v2/url?u=http-3A__lkml.kernel.org_r_151177
5987-2D841-2D3-2Dgit-2Dsend-2Demail-2Dghe-40suse.com&d=DwICAg&c=RoP1YumCXCgaWHvlZYR8PZ h8Bv7qIrMUB65eapI_JnE&r=C7gAd4uDxlAvTdc0vmU6X8CMk6L2iDY8-HD0qT6Fo7Y&m=C4AZ7lGI2-g fFtbla8puNvYIA3a9Cr_XOH6oyx94oGo&s=T9Ljku-nipBqCaeXWukY2hAwcHQL95gtlU7pS3l1fgs&e =

Quoted 7 lines
Cc Mark Fasheh <[email protected]>
Cc Joel Becker <[email protected]>
Cc Junxiao Bi <[email protected]>
Cc Joseph Qi <[email protected]>
Cc Changwei Ge <[email protected]>
Quoted 7 lines

---

 fs/ocfs2/extent_map.c |   41 ++++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/extent_map.h |    3 ++
 2 files changed, 44 insertions(+)

diff -puN fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function

fs/ocfs2/extent_map.c

Quoted 15 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +9 -0
@@ -832,6 +832,47 @@ out:
 	return ret;
 }
 
+/* Is IO overwriting allocated blocks? */
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len)
+{
+	int ret = 0, is_last;
+	u32 mapping_end, cpos;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+	struct ocfs2_extent_rec rec;
+
Quoted 8 lines

fs/ocfs2/extent_map.c out: · line 847

Quoted 4 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +4 -0
+	if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
+	   ((map_start + map_len) <= i_size_read(inode)))
+		goto out;
+

Should we return -EAGAIN directly when the condition ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) && ((map_start + map_len) > i_size_read(inode)))
is true?

Yes, here the code can be improved like as below.
e.g.

if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
	if (ocfs2_size_fits_inline_data(di_bh, map_start + map_len))
		goto out;
	else
		return -EAGAIN;
} 

Thanks
Gang

Quoted 59 lines

Thanks,
Alex

Quoted 19 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +19 -0
+	cpos = map_start >> osb->s_clustersize_bits;
+	mapping_end = ocfs2_clusters_for_bytes(inode->i_sb,
+					       map_start + map_len);
+	is_last = 0;
+	while (cpos < mapping_end && !is_last) {
+		ret = ocfs2_get_clusters_nocache(inode, di_bh, cpos,
+						 NULL, &rec, &is_last);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
+
+		if (rec.e_blkno == 0ULL)
+			break;
+
+		if (rec.e_flags & OCFS2_EXT_REFCOUNTED)
+			break;
+
+		cpos = le32_to_cpu(rec.e_cpos) +

fs/ocfs2/extent_map.c out:

Quoted 10 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +9 -0
+			le16_to_cpu(rec.e_leaf_clusters);
+	}
+
+	if (cpos < mapping_end)
+		ret = -EAGAIN;
+out:
+	return ret;
+}
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int 

whence)

Quoted 3 lines
fs/ocfs2/extent_map.c renamed from fs/ocfs2/extent_map.c~ocfs2-add-ocfs2_overwrite_io-function +0 -0
 {
 	struct inode *inode = file->f_mapping->host;

diff -puN fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function

fs/ocfs2/extent_map.h

fs/ocfs2/extent_map.h int ocfs2_extent_map_get_blocks(struct i · line 59

Quoted 10 lines
fs/ocfs2/extent_map.h renamed from fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function +3 -0
@@ -53,6 +53,9 @@ int ocfs2_extent_map_get_blocks(struct i
 int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 		 u64 map_start, u64 map_len);
 
+int ocfs2_overwrite_io(struct inode *inode, struct buffer_head *di_bh,
+		       u64 map_start, u64 map_len);
+
 int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int 

origin);

Quoted 11 lines
fs/ocfs2/extent_map.h renamed from fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function +0 -0
 int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,

_

_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel at oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

.