From: Jan Kara <jack@suse.cz> To: LKML <linux-kernel@vger.kernel.org> Cc: hch@infradead.org, Jan Kara <jack@suse.cz>, Evgeniy Polyakov <zbr@ioremap.net>, ocfs2-devel@oss.oracle.com, Joel Becker <joel.becker@oracle.com> Subject: [PATCH 02/17] vfs: Export __generic_file_aio_write() and add some comments Date: Wed, 19 Aug 2009 18:04:29 +0200 [thread overview] Message-ID: <1250697884-22288-3-git-send-email-jack@suse.cz> (raw) In-Reply-To: <1250697884-22288-1-git-send-email-jack@suse.cz> Rename __generic_file_aio_write_nolock() to __generic_file_aio_write(), add comments to write helpers explaining how they should be used and export __generic_file_aio_write() since it will be used by some filesystems. CC: Evgeniy Polyakov <zbr@ioremap.net> CC: ocfs2-devel@oss.oracle.com CC: Joel Becker <joel.becker@oracle.com> Signed-off-by: Jan Kara <jack@suse.cz> --- include/linux/fs.h | 2 + mm/filemap.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/include/linux/fs.h b/include/linux/fs.h index cb365ad..1edd159 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2195,6 +2195,8 @@ extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size); int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); +extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, + loff_t *); extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); extern ssize_t generic_file_aio_write_nolock(struct kiocb *, const struct iovec *, unsigned long, loff_t); diff --git a/mm/filemap.c b/mm/filemap.c index 65b2e50..554a396 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2368,9 +2368,27 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, } EXPORT_SYMBOL(generic_file_buffered_write); -static ssize_t -__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, - unsigned long nr_segs, loff_t *ppos) +/** + * __generic_file_aio_write - write data to a file + * @iocb: IO state structure (file, offset, etc.) + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @ppos: position where to write + * + * This function does all the work needed for actually writing data to a + * file. It does all basic checks, removes SUID from the file, updates + * modification times and calls proper subroutines depending on whether we + * do direct IO or a standard buffered write. + * + * It expects i_mutex to be grabbed unless we work on a block device or similar + * object which does not need locking at all. + * + * This function does *not* take care of syncing data in case of O_SYNC write. + * A caller has to handle it. This is mainly due to the fact that we want to + * avoid syncing under i_mutex. + */ +ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, + unsigned long nr_segs, loff_t *ppos) { struct file *file = iocb->ki_filp; struct address_space * mapping = file->f_mapping; @@ -2467,7 +2485,23 @@ out: current->backing_dev_info = NULL; return written ? written : err; } +EXPORT_SYMBOL(__generic_file_aio_write); + +/** + * generic_file_aio_write_nolock - write data, usually to a device + * @iocb: IO state structure + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @pos: position in file where to write + * + * This is a wrapper around __generic_file_aio_write() which takes care of + * syncing the file in case of O_SYNC file. It does not take i_mutex for the + * write itself but may do so during syncing. It is meant for users like block + * devices which do not need i_mutex during write. If your filesystem needs to + * do a write but already holds i_mutex, use __generic_file_aio_write() + * directly and then sync the file like generic_file_aio_write(). + */ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { @@ -2478,8 +2512,7 @@ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, BUG_ON(iocb->ki_pos != pos); - ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, - &iocb->ki_pos); + ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { ssize_t err; @@ -2492,6 +2525,17 @@ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, } EXPORT_SYMBOL(generic_file_aio_write_nolock); +/** + * generic_file_aio_write - write data to a file + * @iocb: IO state structure + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @pos: position in file where to write + * + * This is a wrapper around __generic_file_aio_write() to be used by most + * filesystems. It takes care of syncing the file in case of O_SYNC file + * and acquires i_mutex as needed. + */ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { @@ -2503,8 +2547,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, BUG_ON(iocb->ki_pos != pos); mutex_lock(&inode->i_mutex); - ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, - &iocb->ki_pos); + ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { -- 1.6.0.2
WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz> To: LKML <linux-kernel@vger.kernel.org> Cc: hch@infradead.org, Jan Kara <jack@suse.cz>, Evgeniy Polyakov <zbr@ioremap.net>, ocfs2-devel@oss.oracle.com, Joel Becker <joel.becker@oracle.com> Subject: [Ocfs2-devel] [PATCH 02/17] vfs: Export __generic_file_aio_write() and add some comments Date: Wed, 19 Aug 2009 18:04:29 +0200 [thread overview] Message-ID: <1250697884-22288-3-git-send-email-jack@suse.cz> (raw) In-Reply-To: <1250697884-22288-1-git-send-email-jack@suse.cz> Rename __generic_file_aio_write_nolock() to __generic_file_aio_write(), add comments to write helpers explaining how they should be used and export __generic_file_aio_write() since it will be used by some filesystems. CC: Evgeniy Polyakov <zbr@ioremap.net> CC: ocfs2-devel at oss.oracle.com CC: Joel Becker <joel.becker@oracle.com> Signed-off-by: Jan Kara <jack@suse.cz> --- include/linux/fs.h | 2 + mm/filemap.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/include/linux/fs.h b/include/linux/fs.h index cb365ad..1edd159 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2195,6 +2195,8 @@ extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size); int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); +extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, + loff_t *); extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); extern ssize_t generic_file_aio_write_nolock(struct kiocb *, const struct iovec *, unsigned long, loff_t); diff --git a/mm/filemap.c b/mm/filemap.c index 65b2e50..554a396 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2368,9 +2368,27 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, } EXPORT_SYMBOL(generic_file_buffered_write); -static ssize_t -__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, - unsigned long nr_segs, loff_t *ppos) +/** + * __generic_file_aio_write - write data to a file + * @iocb: IO state structure (file, offset, etc.) + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @ppos: position where to write + * + * This function does all the work needed for actually writing data to a + * file. It does all basic checks, removes SUID from the file, updates + * modification times and calls proper subroutines depending on whether we + * do direct IO or a standard buffered write. + * + * It expects i_mutex to be grabbed unless we work on a block device or similar + * object which does not need locking at all. + * + * This function does *not* take care of syncing data in case of O_SYNC write. + * A caller has to handle it. This is mainly due to the fact that we want to + * avoid syncing under i_mutex. + */ +ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, + unsigned long nr_segs, loff_t *ppos) { struct file *file = iocb->ki_filp; struct address_space * mapping = file->f_mapping; @@ -2467,7 +2485,23 @@ out: current->backing_dev_info = NULL; return written ? written : err; } +EXPORT_SYMBOL(__generic_file_aio_write); + +/** + * generic_file_aio_write_nolock - write data, usually to a device + * @iocb: IO state structure + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @pos: position in file where to write + * + * This is a wrapper around __generic_file_aio_write() which takes care of + * syncing the file in case of O_SYNC file. It does not take i_mutex for the + * write itself but may do so during syncing. It is meant for users like block + * devices which do not need i_mutex during write. If your filesystem needs to + * do a write but already holds i_mutex, use __generic_file_aio_write() + * directly and then sync the file like generic_file_aio_write(). + */ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { @@ -2478,8 +2512,7 @@ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, BUG_ON(iocb->ki_pos != pos); - ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, - &iocb->ki_pos); + ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { ssize_t err; @@ -2492,6 +2525,17 @@ ssize_t generic_file_aio_write_nolock(struct kiocb *iocb, } EXPORT_SYMBOL(generic_file_aio_write_nolock); +/** + * generic_file_aio_write - write data to a file + * @iocb: IO state structure + * @iov: vector with data to write + * @nr_segs: number of segments in the vector + * @pos: position in file where to write + * + * This is a wrapper around __generic_file_aio_write() to be used by most + * filesystems. It takes care of syncing the file in case of O_SYNC file + * and acquires i_mutex as needed. + */ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { @@ -2503,8 +2547,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, BUG_ON(iocb->ki_pos != pos); mutex_lock(&inode->i_mutex); - ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, - &iocb->ki_pos); + ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { -- 1.6.0.2
next prev parent reply other threads:[~2009-08-19 16:04 UTC|newest] Thread overview: 142+ messages / expand[flat|nested] mbox.gz Atom feed top 2009-08-19 16:04 [PATCH 0/17] Make O_SYNC handling use standard syncing path Jan Kara 2009-08-19 16:04 ` [PATCH 01/17] vfs: Introduce filemap_fdatawait_range Jan Kara 2009-08-19 16:10 ` Christoph Hellwig 2009-08-19 16:04 ` Jan Kara [this message] 2009-08-19 16:04 ` [Ocfs2-devel] [PATCH 02/17] vfs: Export __generic_file_aio_write() and add some comments Jan Kara 2009-08-19 16:11 ` Christoph Hellwig 2009-08-19 16:11 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-20 12:04 ` Jan Kara 2009-08-20 12:04 ` [Ocfs2-devel] " Jan Kara 2009-08-19 20:22 ` Evgeniy Polyakov 2009-08-19 20:22 ` [Ocfs2-devel] " Evgeniy Polyakov 2009-08-20 12:31 ` Jan Kara 2009-08-20 12:31 ` [Ocfs2-devel] " Jan Kara 2009-08-20 13:30 ` Evgeniy Polyakov 2009-08-20 13:30 ` [Ocfs2-devel] " Evgeniy Polyakov 2009-08-20 13:52 ` Jan Kara 2009-08-20 13:52 ` [Ocfs2-devel] " Jan Kara 2009-08-20 13:58 ` Evgeniy Polyakov 2009-08-20 13:58 ` [Ocfs2-devel] " Evgeniy Polyakov 2009-08-19 16:04 ` [PATCH 03/17] vfs: Remove syncing from generic_file_direct_write() and generic_file_buffered_write() Jan Kara 2009-08-19 16:04 ` [Ocfs2-devel] " Jan Kara 2009-08-19 16:04 ` Jan Kara 2009-08-19 16:18 ` Christoph Hellwig 2009-08-19 16:18 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-19 16:18 ` Christoph Hellwig 2009-08-20 13:31 ` Jan Kara 2009-08-20 13:31 ` [Ocfs2-devel] " Jan Kara 2009-08-20 13:31 ` Jan Kara 2009-08-19 16:04 ` [PATCH 04/17] pohmelfs: Use __generic_file_aio_write instead of generic_file_aio_write_nolock Jan Kara 2009-08-19 16:04 ` [PATCH 05/17] ocfs2: " Jan Kara 2009-08-19 16:04 ` [Ocfs2-devel] " Jan Kara 2009-08-19 16:04 ` [PATCH 06/17] vfs: Remove sync_page_range_nolock Jan Kara 2009-08-19 16:21 ` Christoph Hellwig 2009-08-19 16:04 ` [PATCH 07/17] vfs: Introduce new helpers for syncing after writing to O_SYNC file or IS_SYNC inode Jan Kara 2009-08-19 16:04 ` [Ocfs2-devel] " Jan Kara 2009-08-19 16:04 ` Jan Kara 2009-08-19 16:26 ` Christoph Hellwig 2009-08-19 16:26 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-19 16:26 ` Christoph Hellwig 2009-08-20 12:15 ` Jan Kara 2009-08-20 12:15 ` [Ocfs2-devel] " Jan Kara 2009-08-20 12:15 ` Jan Kara 2009-08-20 16:27 ` Christoph Hellwig 2009-08-20 16:27 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-20 16:27 ` Christoph Hellwig 2009-08-21 15:23 ` Jan Kara 2009-08-21 15:23 ` [Ocfs2-devel] " Jan Kara 2009-08-21 15:23 ` Jan Kara 2009-08-21 15:32 ` Christoph Hellwig 2009-08-21 15:32 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-21 15:32 ` Christoph Hellwig 2009-08-21 15:48 ` Jan Kara 2009-08-21 15:48 ` [Ocfs2-devel] " Jan Kara 2009-08-21 15:48 ` Jan Kara 2009-08-26 18:22 ` Christoph Hellwig 2009-08-26 18:22 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-26 18:22 ` Christoph Hellwig 2009-08-27 0:04 ` Christoph Hellwig 2009-08-27 0:04 ` [Ocfs2-devel] " Christoph Hellwig 2009-08-27 0:04 ` Christoph Hellwig 2009-08-19 16:04 ` [PATCH 08/17] ext2: Update comment about generic_osync_inode Jan Kara 2009-08-19 16:04 ` [PATCH 09/17] ext3: Remove syncing logic from ext3_file_write Jan Kara 2009-08-19 16:04 ` [PATCH 10/17] ext4: Remove syncing logic from ext4_file_write Jan Kara 2009-08-19 16:04 ` Jan Kara 2009-08-19 16:04 ` [PATCH 11/17] fat: Opencode sync_page_range_nolock() Jan Kara 2009-08-19 16:04 ` [PATCH 12/17] ntfs: Use new syncing helpers and update comments Jan Kara 2009-08-19 16:04 ` [PATCH 13/17] ocfs2: Update syncing after splicing to match generic version Jan Kara 2009-08-19 16:04 ` [Ocfs2-devel] " Jan Kara 2009-08-21 1:36 ` Joel Becker 2009-08-21 1:36 ` Joel Becker 2009-08-21 14:30 ` Jan Kara 2009-08-21 14:30 ` Jan Kara 2009-08-19 16:04 ` [PATCH 14/17] xfs: Use new syncing helper Jan Kara 2009-08-19 16:04 ` Jan Kara 2009-08-19 16:33 ` Christoph Hellwig 2009-08-19 16:33 ` Christoph Hellwig 2009-08-20 12:22 ` Jan Kara 2009-08-20 12:22 ` Jan Kara 2009-08-19 16:04 ` [PATCH 15/17] pohmelfs: " Jan Kara 2009-08-19 16:04 ` [PATCH 16/17] nfs: Remove reference to generic_osync_inode from a comment Jan Kara 2009-08-19 16:04 ` [PATCH 17/17] vfs: Remove generic_osync_inode() and sync_page_range() Jan Kara 2009-08-20 22:12 ` O_DIRECT and barriers Christoph Hellwig 2009-08-21 11:40 ` Jens Axboe 2009-08-21 13:54 ` Jamie Lokier 2009-08-21 14:26 ` Christoph Hellwig 2009-08-21 15:24 ` Jamie Lokier 2009-08-21 17:45 ` Christoph Hellwig 2009-08-21 19:18 ` Ric Wheeler 2009-08-22 0:50 ` Jamie Lokier 2009-08-22 2:19 ` Theodore Tso 2009-08-22 2:31 ` Theodore Tso 2009-08-24 2:34 ` Christoph Hellwig 2009-08-27 14:34 ` Jamie Lokier 2009-08-27 17:10 ` adding proper O_SYNC/O_DSYNC, was " Christoph Hellwig 2009-08-27 17:24 ` Ulrich Drepper 2009-08-27 17:24 ` Ulrich Drepper 2009-08-28 15:46 ` Christoph Hellwig 2009-08-28 16:06 ` Ulrich Drepper 2009-08-28 16:06 ` Ulrich Drepper 2009-08-28 16:17 ` Christoph Hellwig 2009-08-28 16:33 ` Ulrich Drepper 2009-08-28 16:33 ` Ulrich Drepper 2009-08-28 16:41 ` Christoph Hellwig 2009-08-28 20:51 ` Ulrich Drepper 2009-08-28 20:51 ` Ulrich Drepper 2009-08-28 21:08 ` Christoph Hellwig 2009-08-28 21:16 ` Trond Myklebust 2009-08-28 21:29 ` Christoph Hellwig 2009-08-28 21:43 ` Trond Myklebust 2009-08-28 22:39 ` Christoph Hellwig 2009-08-30 16:44 ` Jamie Lokier 2009-08-28 16:46 ` Jamie Lokier 2009-08-29 0:59 ` Jamie Lokier 2009-08-28 16:44 ` Jamie Lokier 2009-08-28 16:50 ` Jamie Lokier 2009-08-28 21:08 ` Ulrich Drepper 2009-08-28 21:08 ` Ulrich Drepper 2009-08-30 16:58 ` Jamie Lokier 2009-08-30 17:48 ` Jamie Lokier 2009-08-28 23:06 ` Jamie Lokier 2009-08-28 23:46 ` Christoph Hellwig 2009-08-21 22:08 ` Theodore Tso 2009-08-21 22:38 ` Joel Becker 2009-08-21 22:45 ` Joel Becker 2009-08-22 2:11 ` Theodore Tso 2009-08-24 2:42 ` Christoph Hellwig 2009-08-24 2:37 ` Christoph Hellwig 2009-08-24 2:37 ` Christoph Hellwig 2009-08-21 22:45 ` Joel Becker 2009-08-22 0:56 ` Jamie Lokier 2009-08-22 2:06 ` Theodore Tso 2009-08-26 6:34 ` Dave Chinner 2009-08-26 6:34 ` Dave Chinner 2009-08-26 15:01 ` Jamie Lokier 2009-08-26 18:47 ` Theodore Tso 2009-08-27 14:50 ` Jamie Lokier 2009-08-21 14:20 ` Christoph Hellwig 2009-08-21 15:06 ` James Bottomley 2009-08-21 15:23 ` Christoph Hellwig 2009-08-21 16:59 [PATCH 01/17] vfs: Introduce filemap_fdatawait_range Jan Kara 2009-08-21 16:59 ` [PATCH 02/17] vfs: Export __generic_file_aio_write() and add some comments Jan Kara 2009-08-21 17:23 [PATCH 0/17] Make O_SYNC handling use standard syncing path (Version 2) Jan Kara 2009-08-21 17:23 ` [PATCH 02/17] vfs: Export __generic_file_aio_write() and add some comments Jan Kara 2009-08-21 17:23 ` 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=1250697884-22288-3-git-send-email-jack@suse.cz \ --to=jack@suse.cz \ --cc=hch@infradead.org \ --cc=joel.becker@oracle.com \ --cc=linux-kernel@vger.kernel.org \ --cc=ocfs2-devel@oss.oracle.com \ --cc=zbr@ioremap.net \ /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: linkBe 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.