Commit 160cc266 authored by Joseph Qi's avatar Joseph Qi Committed by Linus Torvalds

ocfs2: set append dio as a ro compat feature

Intruduce a bit OCFS2_FEATURE_RO_COMPAT_APPEND_DIO and check it in
write flow. If the bit is not set, fall back to the old way.
Signed-off-by: default avatarJoseph Qi <joseph.qi@huawei.com>
Cc: Weiwei Wang <wangww631@huawei.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Xuejiufei <xuejiufei@huawei.com>
Cc: alex chen <alex.chen@huawei.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4813962b
...@@ -2212,6 +2212,15 @@ static int ocfs2_prepare_inode_for_write(struct file *file, ...@@ -2212,6 +2212,15 @@ static int ocfs2_prepare_inode_for_write(struct file *file,
break; break;
} }
/*
* Fallback to old way if the feature bit is not set.
*/
if (end > i_size_read(inode) &&
!ocfs2_supports_append_dio(osb)) {
*direct_io = 0;
break;
}
/* /*
* We don't fill holes during direct io, so * We don't fill holes during direct io, so
* check for them here. If any are found, the * check for them here. If any are found, the
...@@ -2220,7 +2229,13 @@ static int ocfs2_prepare_inode_for_write(struct file *file, ...@@ -2220,7 +2229,13 @@ static int ocfs2_prepare_inode_for_write(struct file *file,
*/ */
ret = ocfs2_check_range_for_holes(inode, saved_pos, count); ret = ocfs2_check_range_for_holes(inode, saved_pos, count);
if (ret == 1) { if (ret == 1) {
*direct_io = 0; /*
* Fallback to old way if the feature bit is not set.
* Otherwise try dio first and then complete the rest
* request through buffer io.
*/
if (!ocfs2_supports_append_dio(osb))
*direct_io = 0;
ret = 0; ret = 0;
} else if (ret < 0) } else if (ret < 0)
mlog_errno(ret); mlog_errno(ret);
......
...@@ -500,6 +500,14 @@ static inline int ocfs2_writes_unwritten_extents(struct ocfs2_super *osb) ...@@ -500,6 +500,14 @@ static inline int ocfs2_writes_unwritten_extents(struct ocfs2_super *osb)
return 0; return 0;
} }
static inline int ocfs2_supports_append_dio(struct ocfs2_super *osb)
{
if (osb->s_feature_ro_compat & OCFS2_FEATURE_RO_COMPAT_APPEND_DIO)
return 1;
return 0;
}
static inline int ocfs2_supports_inline_data(struct ocfs2_super *osb) static inline int ocfs2_supports_inline_data(struct ocfs2_super *osb)
{ {
if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_INLINE_DATA) if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_INLINE_DATA)
......
...@@ -105,7 +105,8 @@ ...@@ -105,7 +105,8 @@
| OCFS2_FEATURE_INCOMPAT_CLUSTERINFO) | OCFS2_FEATURE_INCOMPAT_CLUSTERINFO)
#define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \ #define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \
| OCFS2_FEATURE_RO_COMPAT_USRQUOTA \ | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \
| OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA \
| OCFS2_FEATURE_RO_COMPAT_APPEND_DIO)
/* /*
* Heartbeat-only devices are missing journals and other files. The * Heartbeat-only devices are missing journals and other files. The
...@@ -199,6 +200,11 @@ ...@@ -199,6 +200,11 @@
#define OCFS2_FEATURE_RO_COMPAT_USRQUOTA 0x0002 #define OCFS2_FEATURE_RO_COMPAT_USRQUOTA 0x0002
#define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA 0x0004 #define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA 0x0004
/*
* Append Direct IO support
*/
#define OCFS2_FEATURE_RO_COMPAT_APPEND_DIO 0x0008
/* The byte offset of the first backup block will be 1G. /* The byte offset of the first backup block will be 1G.
* The following will be 4G, 16G, 64G, 256G and 1T. * The following will be 4G, 16G, 64G, 256G and 1T.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment