All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@fb.com>
Cc: David Howells <dhowells@redhat.com>, Tejun Heo <tj@kernel.org>,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org,
	ceph-devel@vger.kernel.org
Subject: [PATCH 04/12] block_dev: only write bdev inode on close
Date: Thu,  8 Jan 2015 18:45:25 +0100	[thread overview]
Message-ID: <1420739133-27514-5-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1420739133-27514-1-git-send-email-hch@lst.de>

Since "bdi: reimplement bdev_inode_switch_bdi()" the block device code
writes out all dirty data whenever switching the backing_dev_info for
a block device inode.  But a block device inode can only be dirtied
when it is in use, which means we only have to write it out on the
final blkdev_put, but not when doing a blkdev_get.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/block_dev.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index b48c41b..288ba70 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -49,6 +49,17 @@ inline struct block_device *I_BDEV(struct inode *inode)
 }
 EXPORT_SYMBOL(I_BDEV);
 
+static void bdev_write_inode(struct inode *inode)
+{
+	spin_lock(&inode->i_lock);
+	while (inode->i_state & I_DIRTY) {
+		spin_unlock(&inode->i_lock);
+		WARN_ON_ONCE(write_inode_now(inode, true));
+		spin_lock(&inode->i_lock);
+	}
+	spin_unlock(&inode->i_lock);
+}
+
 /*
  * Move the inode from its current bdi to a new bdi.  Make sure the inode
  * is clean before moving so that it doesn't linger on the old bdi.
@@ -56,16 +67,10 @@ EXPORT_SYMBOL(I_BDEV);
 static void bdev_inode_switch_bdi(struct inode *inode,
 			struct backing_dev_info *dst)
 {
-	while (true) {
-		spin_lock(&inode->i_lock);
-		if (!(inode->i_state & I_DIRTY)) {
-			inode->i_data.backing_dev_info = dst;
-			spin_unlock(&inode->i_lock);
-			return;
-		}
-		spin_unlock(&inode->i_lock);
-		WARN_ON_ONCE(write_inode_now(inode, true));
-	}
+	spin_lock(&inode->i_lock);
+	WARN_ON_ONCE(inode->i_state & I_DIRTY);
+	inode->i_data.backing_dev_info = dst;
+	spin_unlock(&inode->i_lock);
 }
 
 /* Kill _all_ buffers and pagecache , dirty or not.. */
@@ -1464,9 +1469,11 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
 		WARN_ON_ONCE(bdev->bd_holders);
 		sync_blockdev(bdev);
 		kill_bdev(bdev);
-		/* ->release can cause the old bdi to disappear,
-		 * so must switch it out first
+		/*
+		 * ->release can cause the queue to disappaear, so flush all
+		 * dirty data before.
 		 */
+		bdev_write_inode(bdev->bd_inode);
 		bdev_inode_switch_bdi(bdev->bd_inode,
 					&default_backing_dev_info);
 	}
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@fb.com>
Cc: David Howells <dhowells@redhat.com>, Tejun Heo <tj@kernel.org>,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org,
	ceph-devel@vger.kernel.org
Subject: [PATCH 04/12] block_dev: only write bdev inode on close
Date: Thu,  8 Jan 2015 18:45:25 +0100	[thread overview]
Message-ID: <1420739133-27514-5-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1420739133-27514-1-git-send-email-hch@lst.de>

Since "bdi: reimplement bdev_inode_switch_bdi()" the block device code
writes out all dirty data whenever switching the backing_dev_info for
a block device inode.  But a block device inode can only be dirtied
when it is in use, which means we only have to write it out on the
final blkdev_put, but not when doing a blkdev_get.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/block_dev.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index b48c41b..288ba70 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -49,6 +49,17 @@ inline struct block_device *I_BDEV(struct inode *inode)
 }
 EXPORT_SYMBOL(I_BDEV);
 
+static void bdev_write_inode(struct inode *inode)
+{
+	spin_lock(&inode->i_lock);
+	while (inode->i_state & I_DIRTY) {
+		spin_unlock(&inode->i_lock);
+		WARN_ON_ONCE(write_inode_now(inode, true));
+		spin_lock(&inode->i_lock);
+	}
+	spin_unlock(&inode->i_lock);
+}
+
 /*
  * Move the inode from its current bdi to a new bdi.  Make sure the inode
  * is clean before moving so that it doesn't linger on the old bdi.
@@ -56,16 +67,10 @@ EXPORT_SYMBOL(I_BDEV);
 static void bdev_inode_switch_bdi(struct inode *inode,
 			struct backing_dev_info *dst)
 {
-	while (true) {
-		spin_lock(&inode->i_lock);
-		if (!(inode->i_state & I_DIRTY)) {
-			inode->i_data.backing_dev_info = dst;
-			spin_unlock(&inode->i_lock);
-			return;
-		}
-		spin_unlock(&inode->i_lock);
-		WARN_ON_ONCE(write_inode_now(inode, true));
-	}
+	spin_lock(&inode->i_lock);
+	WARN_ON_ONCE(inode->i_state & I_DIRTY);
+	inode->i_data.backing_dev_info = dst;
+	spin_unlock(&inode->i_lock);
 }
 
 /* Kill _all_ buffers and pagecache , dirty or not.. */
@@ -1464,9 +1469,11 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
 		WARN_ON_ONCE(bdev->bd_holders);
 		sync_blockdev(bdev);
 		kill_bdev(bdev);
-		/* ->release can cause the old bdi to disappear,
-		 * so must switch it out first
+		/*
+		 * ->release can cause the queue to disappaear, so flush all
+		 * dirty data before.
 		 */
+		bdev_write_inode(bdev->bd_inode);
 		bdev_inode_switch_bdi(bdev->bd_inode,
 					&default_backing_dev_info);
 	}
-- 
1.9.1

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@fb.com>
Cc: linux-nfs@vger.kernel.org, linux-mm@kvack.org,
	David Howells <dhowells@redhat.com>,
	linux-fsdevel@vger.kernel.org, linux-mtd@lists.infradead.org,
	Tejun Heo <tj@kernel.org>,
	ceph-devel@vger.kernel.org
Subject: [PATCH 04/12] block_dev: only write bdev inode on close
Date: Thu,  8 Jan 2015 18:45:25 +0100	[thread overview]
Message-ID: <1420739133-27514-5-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1420739133-27514-1-git-send-email-hch@lst.de>

Since "bdi: reimplement bdev_inode_switch_bdi()" the block device code
writes out all dirty data whenever switching the backing_dev_info for
a block device inode.  But a block device inode can only be dirtied
when it is in use, which means we only have to write it out on the
final blkdev_put, but not when doing a blkdev_get.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/block_dev.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index b48c41b..288ba70 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -49,6 +49,17 @@ inline struct block_device *I_BDEV(struct inode *inode)
 }
 EXPORT_SYMBOL(I_BDEV);
 
+static void bdev_write_inode(struct inode *inode)
+{
+	spin_lock(&inode->i_lock);
+	while (inode->i_state & I_DIRTY) {
+		spin_unlock(&inode->i_lock);
+		WARN_ON_ONCE(write_inode_now(inode, true));
+		spin_lock(&inode->i_lock);
+	}
+	spin_unlock(&inode->i_lock);
+}
+
 /*
  * Move the inode from its current bdi to a new bdi.  Make sure the inode
  * is clean before moving so that it doesn't linger on the old bdi.
@@ -56,16 +67,10 @@ EXPORT_SYMBOL(I_BDEV);
 static void bdev_inode_switch_bdi(struct inode *inode,
 			struct backing_dev_info *dst)
 {
-	while (true) {
-		spin_lock(&inode->i_lock);
-		if (!(inode->i_state & I_DIRTY)) {
-			inode->i_data.backing_dev_info = dst;
-			spin_unlock(&inode->i_lock);
-			return;
-		}
-		spin_unlock(&inode->i_lock);
-		WARN_ON_ONCE(write_inode_now(inode, true));
-	}
+	spin_lock(&inode->i_lock);
+	WARN_ON_ONCE(inode->i_state & I_DIRTY);
+	inode->i_data.backing_dev_info = dst;
+	spin_unlock(&inode->i_lock);
 }
 
 /* Kill _all_ buffers and pagecache , dirty or not.. */
@@ -1464,9 +1469,11 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
 		WARN_ON_ONCE(bdev->bd_holders);
 		sync_blockdev(bdev);
 		kill_bdev(bdev);
-		/* ->release can cause the old bdi to disappear,
-		 * so must switch it out first
+		/*
+		 * ->release can cause the queue to disappaear, so flush all
+		 * dirty data before.
 		 */
+		bdev_write_inode(bdev->bd_inode);
 		bdev_inode_switch_bdi(bdev->bd_inode,
 					&default_backing_dev_info);
 	}
-- 
1.9.1

  parent reply	other threads:[~2015-01-08 17:45 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-08 17:45 backing_dev_info cleanups & lifetime rule fixes Christoph Hellwig
2015-01-08 17:45 ` Christoph Hellwig
2015-01-08 17:45 ` Christoph Hellwig
2015-01-08 17:45 ` [PATCH 01/12] fs: deduplicate noop_backing_dev_info Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 17:00   ` Tejun Heo
2015-01-11 17:00     ` Tejun Heo
2015-01-11 17:00     ` Tejun Heo
2015-01-08 17:45 ` [PATCH 02/12] fs: kill BDI_CAP_SWAP_BACKED Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 17:05   ` Tejun Heo
2015-01-11 17:05     ` Tejun Heo
2015-01-11 17:05     ` Tejun Heo
2015-01-08 17:45 ` [PATCH 03/12] fs: introduce f_op->mmap_capabilities for nommu mmap support Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 17:24   ` Tejun Heo
2015-01-11 17:24     ` Tejun Heo
2015-01-11 17:24     ` Tejun Heo
2015-01-08 17:45 ` Christoph Hellwig [this message]
2015-01-08 17:45   ` [PATCH 04/12] block_dev: only write bdev inode on close Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 17:32   ` Tejun Heo
2015-01-11 17:32     ` Tejun Heo
2015-01-11 17:32     ` Tejun Heo
2015-01-12 12:33     ` Christoph Hellwig
2015-01-12 12:33       ` Christoph Hellwig
2015-01-12 12:33       ` Christoph Hellwig
     [not found] ` <1420739133-27514-1-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2015-01-08 17:45   ` [PATCH 05/12] block_dev: get bdev inode bdi directly from the block device Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-11 17:40     ` Tejun Heo
2015-01-11 17:40       ` Tejun Heo
2015-01-11 17:40       ` Tejun Heo
2015-01-08 17:45   ` [PATCH 09/12] ceph: remove call to bdi_unregister Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-08 17:45     ` Christoph Hellwig
2015-01-08 17:45 ` [PATCH 06/12] nilfs2: set up s_bdi like the generic mount_bdev code Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 17:41   ` Tejun Heo
2015-01-11 17:41     ` Tejun Heo
2015-01-11 17:41     ` Tejun Heo
2015-01-08 17:45 ` [PATCH 07/12] fs: export inode_to_bdi and use it in favor of mapping->backing_dev_info Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
     [not found]   ` <1420739133-27514-8-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2015-01-11 18:16     ` Tejun Heo
2015-01-11 18:16       ` Tejun Heo
2015-01-11 18:16       ` Tejun Heo
2015-01-11 18:16       ` Tejun Heo
2015-01-12 12:36       ` Christoph Hellwig
2015-01-12 12:36         ` Christoph Hellwig
2015-01-12 12:36         ` Christoph Hellwig
2015-01-08 17:45 ` [PATCH 08/12] fs: remove mapping->backing_dev_info Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 18:20   ` Tejun Heo
2015-01-11 18:20     ` Tejun Heo
2015-01-11 18:20     ` Tejun Heo
2015-01-08 17:45 ` [PATCH 10/12] nfs: don't call bdi_unregister Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45 ` [PATCH 11/12] fs: don't reassign dirty inodes to default_backing_dev_info Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 18:33   ` Tejun Heo
2015-01-11 18:33     ` Tejun Heo
2015-01-11 18:33     ` Tejun Heo
2015-01-08 17:45 ` [PATCH 12/12] fs: remove default_backing_dev_info Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-08 17:45   ` Christoph Hellwig
2015-01-11 18:39   ` Tejun Heo
2015-01-11 18:39     ` Tejun Heo
2015-01-11 18:39     ` Tejun Heo
2015-01-14  9:42 backing_dev_info cleanups & lifetime rule fixes V2 Christoph Hellwig
2015-01-14  9:42 ` [PATCH 04/12] block_dev: only write bdev inode on close Christoph Hellwig
2015-01-14  9:42   ` Christoph Hellwig
2015-01-14  9:42   ` Christoph Hellwig
2015-01-14 12:58   ` Jan Kara
2015-01-14 12:58     ` Jan Kara
2015-01-14 12:58     ` Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1420739133-27514-5-git-send-email-hch@lst.de \
    --to=hch@lst.de \
    --cc=axboe@fb.com \
    --cc=ceph-devel@vger.kernel.org \
    --cc=dhowells@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.