Messages in this thread | | | From | Chao Yu <> | Subject | RE: [f2fs-dev] [PATCH] f2fs: introduce a new direct_IO write path | Date | Thu, 19 Dec 2013 09:12:16 +0800 |
| |
> -----Original Message----- > From: Jaegeuk Kim [mailto:jaegeuk.kim@samsung.com] > Sent: Wednesday, December 18, 2013 8:12 AM > To: linux-fsdevel@vger.kernel.org > Cc: linux-kernel@vger.kernel.org; linux-f2fs-devel@lists.sourceforge.net > Subject: Re: [f2fs-dev] [PATCH] f2fs: introduce a new direct_IO write path > > Change log from v1: > o fix NOSPC error handling > > >From b8511a74fe98b67247a9feeed58441e8f5ffd705 Mon Sep 17 00:00:00 2001 > From: Jaegeuk Kim <jaegeuk.kim@samsung.com> > Date: Mon, 16 Dec 2013 19:04:05 +0900 > Subject: [PATCH] f2fs: introduce a new direct_IO write path > Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > linux-f2fs-devel@lists.sourceforge.net > > Previously, f2fs doesn't support direct IOs with high performance, which > throws > every write requests via the buffered write path, resulting in highly > performance degradation due to memory opeations like copy_from_user. > > This patch introduces a new direct IO path in which every write requests > are > processed by generic blockdev_direct_IO() with enhanced get_block > function. > > The get_data_block() in f2fs handles: > 1. if original data blocks are allocates, then give them to blockdev. > 2. otherwise, > a. preallocate requested block addresses > b. do not use extent cache for better performance > c. give the block addresses to blockdev > > This policy induces that: > - new allocated data are sequentially written to the disk > - updated data are randomly written to the disk. > - f2fs gives consistency on its file meta, not file data.
Looks Nice!
> > Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Reviewed-by: Chao Yu <chao2.yu@samsung.com>
> + > + end_offset = IS_INODE(dn.node_page) ? > + ADDRS_PER_INODE(F2FS_I(inode)) : ADDRS_PER_BLOCK; > + bh_result->b_size = (((size_t)1) << blkbits); > + dn.ofs_in_node++; > + pgofs++; > + > +get_next: > + if (dn.ofs_in_node >= end_offset) { > + if (allocated) > + sync_inode_page(&dn); > + allocated = false;
if (allocated) { sync_inode_page(&dn); allocated = false; } Certainly, it's really not a big deal. :)
Thanks
| |