ocfs2-devel.oss.oracle.com archive mirror
 help / color / mirror / Atom feed
* [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
@ 2010-07-29 12:00 Jan Kara
  2010-07-29 12:00 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Remove ocfs2_sync_inode() Jan Kara
  2010-07-30  2:07 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Tao Ma
  0 siblings, 2 replies; 6+ messages in thread
From: Jan Kara @ 2010-07-29 12:00 UTC (permalink / raw)
  To: ocfs2-devel

We have to issue a cache flush during fdatasync even if inode doesn't have
I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
observe fdatasync() guarantees.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ocfs2/file.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 2b10b36..5659d85 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -36,6 +36,7 @@
 #include <linux/writeback.h>
 #include <linux/falloc.h>
 #include <linux/quotaops.h>
+#include <linux/blkdev.h>
 
 #define MLOG_MASK_PREFIX ML_INODE
 #include <cluster/masklog.h>
@@ -190,8 +191,15 @@ static int ocfs2_sync_file(struct file *file, int datasync)
 	if (err)
 		goto bail;
 
-	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
+	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) {
+		/*
+		 * Although inode doesn't need writing, we still have to flush
+		 * drive's caches to get data to the platter
+		 */
+		blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL,
+				   BLKDEV_IFL_WAIT);
 		goto bail;
+	}
 
 	journal = osb->journal->j_journal;
 	err = jbd2_journal_force_commit(journal);
-- 
1.6.4.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Ocfs2-devel] [PATCH 2/2] ocfs2: Remove ocfs2_sync_inode()
  2010-07-29 12:00 [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Jan Kara
@ 2010-07-29 12:00 ` Jan Kara
  2010-07-30  2:07 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Tao Ma
  1 sibling, 0 replies; 6+ messages in thread
From: Jan Kara @ 2010-07-29 12:00 UTC (permalink / raw)
  To: ocfs2-devel

ocfs2_sync_inode() is used only from ocfs2_sync_file(). But all data has
already been written before calling ocfs2_sync_file() and ocfs2 doesn't use
inode's private_list for tracking metadata buffers thus sync_mapping_buffers()
is superfluous as well.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ocfs2/file.c |   10 ----------
 1 files changed, 0 insertions(+), 10 deletions(-)

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 5659d85..2e341a2 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -64,12 +64,6 @@
 
 #include "buffer_head_io.h"
 
-static int ocfs2_sync_inode(struct inode *inode)
-{
-	filemap_fdatawrite(inode->i_mapping);
-	return sync_mapping_buffers(inode->i_mapping);
-}
-
 static int ocfs2_init_file_private(struct inode *inode, struct file *file)
 {
 	struct ocfs2_file_private *fp;
@@ -187,10 +181,6 @@ static int ocfs2_sync_file(struct file *file, int datasync)
 	mlog_entry("(0x%p, 0x%p, %d, '%.*s')\n", file, dentry, datasync,
 		   dentry->d_name.len, dentry->d_name.name);
 
-	err = ocfs2_sync_inode(dentry->d_inode);
-	if (err)
-		goto bail;
-
 	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) {
 		/*
 		 * We still have to flush drive's caches to get data to the
-- 
1.6.4.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
  2010-07-29 12:00 [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Jan Kara
  2010-07-29 12:00 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Remove ocfs2_sync_inode() Jan Kara
@ 2010-07-30  2:07 ` Tao Ma
  2010-07-30  2:12   ` Sunil Mushran
  2010-07-30 14:47   ` Jan Kara
  1 sibling, 2 replies; 6+ messages in thread
From: Tao Ma @ 2010-07-30  2:07 UTC (permalink / raw)
  To: ocfs2-devel

Hi Jan,

On 07/29/2010 08:00 PM, Jan Kara wrote:
> We have to issue a cache flush during fdatasync even if inode doesn't have
> I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
> observe fdatasync() guarantees.
I am fine with the patch from the code's perspective.

But I just noticed the discussion in fsdevel with the subject "relaxed 
barrier semantics", so with barrier there will be a massive slowdowns 
according to Christoph. And as ocfs2 is mainly used with some SAN, I 
guess in most cases the storage will have a battery backed cache, so we 
may not need this?

Sunil, Joel and Mark, Did you have any user data that most of the ocfs2 
system is used on or can we start a survey in ocfs2-users?

Regards,
Tao

> Signed-off-by: Jan Kara<jack@suse.cz>
> ---
>   fs/ocfs2/file.c |   10 +++++++++-
>   1 files changed, 9 insertions(+), 1 deletions(-)
>
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index 2b10b36..5659d85 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -36,6 +36,7 @@
>   #include<linux/writeback.h>
>   #include<linux/falloc.h>
>   #include<linux/quotaops.h>
> +#include<linux/blkdev.h>
>
>   #define MLOG_MASK_PREFIX ML_INODE
>   #include<cluster/masklog.h>
> @@ -190,8 +191,15 @@ static int ocfs2_sync_file(struct file *file, int datasync)
>   	if (err)
>   		goto bail;
>
> -	if (datasync&&  !(inode->i_state&  I_DIRTY_DATASYNC))
> +	if (datasync&&  !(inode->i_state&  I_DIRTY_DATASYNC)) {
> +		/*
> +		 * Although inode doesn't need writing, we still have to flush
> +		 * drive's caches to get data to the platter
> +		 */
> +		blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL,
> +				   BLKDEV_IFL_WAIT);
>   		goto bail;
> +	}
>
>   	journal = osb->journal->j_journal;
>   	err = jbd2_journal_force_commit(journal);

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
  2010-07-30  2:07 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Tao Ma
@ 2010-07-30  2:12   ` Sunil Mushran
  2010-07-30 14:47   ` Jan Kara
  1 sibling, 0 replies; 6+ messages in thread
From: Sunil Mushran @ 2010-07-30  2:12 UTC (permalink / raw)
  To: ocfs2-devel


On 07/29/2010 07:07 PM, Tao Ma wrote:
> Hi Jan,
>
> On 07/29/2010 08:00 PM, Jan Kara wrote:
>> We have to issue a cache flush during fdatasync even if inode doesn't 
>> have
>> I_DIRTY_DATASYNC set because we still have to get written *data* to 
>> disk to
>> observe fdatasync() guarantees.
> I am fine with the patch from the code's perspective.
>
> But I just noticed the discussion in fsdevel with the subject "relaxed 
> barrier semantics", so with barrier there will be a massive slowdowns 
> according to Christoph. And as ocfs2 is mainly used with some SAN, I 
> guess in most cases the storage will have a battery backed cache, so 
> we may not need this?
>
> Sunil, Joel and Mark, Did you have any user data that most of the 
> ocfs2 system is used on or can we start a survey in ocfs2-users?

A SAN with a battery backed cache is a safe assumption. That's
why we don't enable barrier by default.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
  2010-07-30  2:07 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Tao Ma
  2010-07-30  2:12   ` Sunil Mushran
@ 2010-07-30 14:47   ` Jan Kara
  2010-08-02  5:47     ` Tao Ma
  1 sibling, 1 reply; 6+ messages in thread
From: Jan Kara @ 2010-07-30 14:47 UTC (permalink / raw)
  To: ocfs2-devel

On Fri 30-07-10 10:07:07, Tao Ma wrote:
> Hi Jan,
> 
> On 07/29/2010 08:00 PM, Jan Kara wrote:
> >We have to issue a cache flush during fdatasync even if inode doesn't have
> >I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
> >observe fdatasync() guarantees.
> I am fine with the patch from the code's perspective.
> 
> But I just noticed the discussion in fsdevel with the subject
> "relaxed barrier semantics", so with barrier there will be a massive
> slowdowns according to Christoph. And as ocfs2 is mainly used with
> some SAN, I guess in most cases the storage will have a battery
> backed cache, so we may not need this?
  Yes, barriers are rather heavy operation and battery backed SANs don't
need them. In this regard, you are right my patch forgot to check the
OCFS2_MOUNT_BARRIER option. But when the option is set, we must send the
barrier. Otherwise we risk user's data on crash... Below is a fixed version
of the patch.

									Honza
---
From 61c46d394bdc9915554b499f7c3154bde13f3ee5 Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Thu, 29 Jul 2010 13:32:19 +0200
Subject: [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync

We have to issue a cache flush during fdatasync even if inode doesn't have
I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
observe fdatasync() guarantees.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ocfs2/file.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 2b10b36..3ed8efd 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -36,6 +36,7 @@
 #include <linux/writeback.h>
 #include <linux/falloc.h>
 #include <linux/quotaops.h>
+#include <linux/blkdev.h>
 
 #define MLOG_MASK_PREFIX ML_INODE
 #include <cluster/masklog.h>
@@ -190,8 +191,16 @@ static int ocfs2_sync_file(struct file *file, int datasync)
 	if (err)
 		goto bail;
 
-	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
+	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) {
+		/*
+		 * We still have to flush drive's caches to get data to the
+		 * platter
+		 */
+		if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
+			blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL,
+					   NULL, BLKDEV_IFL_WAIT);
 		goto bail;
+	}
 
 	journal = osb->journal->j_journal;
 	err = jbd2_journal_force_commit(journal);
-- 
1.6.4.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
  2010-07-30 14:47   ` Jan Kara
@ 2010-08-02  5:47     ` Tao Ma
  0 siblings, 0 replies; 6+ messages in thread
From: Tao Ma @ 2010-08-02  5:47 UTC (permalink / raw)
  To: ocfs2-devel



On 07/30/2010 10:47 PM, Jan Kara wrote:
> On Fri 30-07-10 10:07:07, Tao Ma wrote:
>> Hi Jan,
>>
>> On 07/29/2010 08:00 PM, Jan Kara wrote:
>>> We have to issue a cache flush during fdatasync even if inode doesn't have
>>> I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
>>> observe fdatasync() guarantees.
>> I am fine with the patch from the code's perspective.
>>
>> But I just noticed the discussion in fsdevel with the subject
>> "relaxed barrier semantics", so with barrier there will be a massive
>> slowdowns according to Christoph. And as ocfs2 is mainly used with
>> some SAN, I guess in most cases the storage will have a battery
>> backed cache, so we may not need this?
>    Yes, barriers are rather heavy operation and battery backed SANs don't
> need them. In this regard, you are right my patch forgot to check the
> OCFS2_MOUNT_BARRIER option. But when the option is set, we must send the
> barrier. Otherwise we risk user's data on crash... Below is a fixed version
> of the patch.
oh, yes, so ack.

Regards,
Tao
>
> 									Honza
> ---
>  From 61c46d394bdc9915554b499f7c3154bde13f3ee5 Mon Sep 17 00:00:00 2001
> From: Jan Kara<jack@suse.cz>
> Date: Thu, 29 Jul 2010 13:32:19 +0200
> Subject: [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync
>
> We have to issue a cache flush during fdatasync even if inode doesn't have
> I_DIRTY_DATASYNC set because we still have to get written *data* to disk to
> observe fdatasync() guarantees.
>
> Signed-off-by: Jan Kara<jack@suse.cz>
> ---
>   fs/ocfs2/file.c |   11 ++++++++++-
>   1 files changed, 10 insertions(+), 1 deletions(-)
>
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index 2b10b36..3ed8efd 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -36,6 +36,7 @@
>   #include<linux/writeback.h>
>   #include<linux/falloc.h>
>   #include<linux/quotaops.h>
> +#include<linux/blkdev.h>
>
>   #define MLOG_MASK_PREFIX ML_INODE
>   #include<cluster/masklog.h>
> @@ -190,8 +191,16 @@ static int ocfs2_sync_file(struct file *file, int datasync)
>   	if (err)
>   		goto bail;
>
> -	if (datasync&&  !(inode->i_state&  I_DIRTY_DATASYNC))
> +	if (datasync&&  !(inode->i_state&  I_DIRTY_DATASYNC)) {
> +		/*
> +		 * We still have to flush drive's caches to get data to the
> +		 * platter
> +		 */
> +		if (osb->s_mount_opt&  OCFS2_MOUNT_BARRIER)
> +			blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL,
> +					   NULL, BLKDEV_IFL_WAIT);
>   		goto bail;
> +	}
>
>   	journal = osb->journal->j_journal;
>   	err = jbd2_journal_force_commit(journal);

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-08-02  5:47 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-29 12:00 [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Jan Kara
2010-07-29 12:00 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Remove ocfs2_sync_inode() Jan Kara
2010-07-30  2:07 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Flush drive's caches on fdatasync Tao Ma
2010-07-30  2:12   ` Sunil Mushran
2010-07-30 14:47   ` Jan Kara
2010-08-02  5:47     ` Tao Ma

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).