From: Jens Axboe <jens.axboe@oracle.com>
To: "Gao, Yunpeng" <yunpeng.gao@intel.com>
Cc: "linux-ide@vger.kernel.org" <linux-ide@vger.kernel.org>
Subject: Re: How to flush write-back cache in block device driver?
Date: Wed, 17 Dec 2008 09:35:41 +0100 [thread overview]
Message-ID: <20081217083540.GE32491@kernel.dk> (raw)
In-Reply-To: <38D9F46DFF92C54980D2F2C1E8EE31301CB4E70F@pdsmsx503.ccr.corp.intel.com>
On Wed, Dec 17 2008, Gao, Yunpeng wrote:
> Hi all,
>
> I'm porting a NAND flash driver to linux 2.6.27. The NAND driver is
> based on NFTL, not kernel MTD subsystem. That is, it will report to
> kernel as a standard linux block device, so it can be used as a normal
> hard disk.
>
> The NAND driver uses an internal write-back cache to improve R/W
> performance. And it provides a function to force flush the cache. But
> as it requires in our project that, after a successful umount to ext3
> file system, even if the system encountered an un-expected power-down,
> user data stored in NAND still need to be correct after system reboot.
>
> Now I have add some code in the driver like this:
> -----------------------------------------------------------------------------------
> static void SBD_prepare_flush(struct request_queue *q, struct request *rq)
> {
> rq->cmd_type = REQ_TYPE_LINUX_BLOCK;
> /* rq->timeout = 5 * HZ; */
> rq->cmd[0] = REQ_LB_OP_FLUSH;
> }
>
> ...
> blk_queue_ordered(dev->queue, QUEUE_ORDERED_DRAIN_FLUSH, SBD_prepare_flush);
> ...
>
> while (((req = elv_next_request(q)) != NULL)) {
> if (req->cmd_type == REQ_TYPE_LINUX_BLOCK &&
> req->cmd[0] == REQ_LB_OP_FLUSH) {
> printk(KERN_ERR "Will flush cache\n");
> /* Cache flush */
> if (GLOB_FTL_Flush_Cache()) {
> printk(KERN_ERR "Failed to flush FTL cache\n");
> end_request(req, 0);
> } else
> end_request(req, 1);
> continue;
> }
>
> if (!blk_fs_request(req)) {
> nand_dbg_print(NAND_DBG_WARN,
> "Spectra: Skip non-fs request\n");
> end_request(req, 0);
> continue;
> }
>
> sectors_xferred = SBD_xfer_request(req);
> success = (sectors_xferred < 0) ? 0 : 1;
> __blk_end_request(req, success ? 0 : -EIO,
> sectors_xferred << 9);
> }
>
> ...
>
> ----------------------------------------------------------------------------------------------------
>
> But this code doesn't work. I mounted ext3 file system, copy a file,
> then wait for serveral minutes, then umount file system and power
> down. And during the whole process, the flush function is never
> called. I tested this in a initrd (busybox) environment.
>
> Does I need to do something else to enable barrier support in linux kernel?
> Or, the driver should flush cache once the 'umount' or 'sync' command
> is executed? But I don't know how to do it.
>
> It'll be very appreciated if you could give me some suggests or
> comments about this. Thank you very much.
For ext3, mount the filesystem with -o barrier=1 as an option to enable
barrier support.
--
Jens Axboe
next prev parent reply other threads:[~2008-12-17 8:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-17 6:36 How to flush write-back cache in block device driver? Gao, Yunpeng
2008-12-17 8:35 ` Jens Axboe [this message]
2008-12-17 10:44 ` Gao, Yunpeng
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=20081217083540.GE32491@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=linux-ide@vger.kernel.org \
--cc=yunpeng.gao@intel.com \
/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.