ocfs2: add ocfs2_overwrite_io()
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
@@ -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
@@ -53,6 +53,9 @@ int ocfs2_extent_map_get_blocks(struct iint 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,
_
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: addocfs2_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]Signed-off-by Gang He <[email protected]>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]>Signed-off-by Andrew Morton <[email protected]>---
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-functionfs/ocfs2/extent_map.cfs/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-functionfs/ocfs2/extent_map.hfs/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 iint 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.
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: addocfs2_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
Signed-off-by Gang He <[email protected]>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]>Signed-off-by Andrew Morton <[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.cQuoted 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
-EAGAINdirectly 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,
AlexQuoted 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, intwhence)
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.hfs/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 iint 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, intorigin);
Quoted 11 lines
fs/ocfs2/extent_map.h renamed from fs/ocfs2/extent_map.h~ocfs2-add-ocfs2_overwrite_io-function +0
-0int 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.