diff options
| author | Christoph Hellwig <hch@lst.de> | 2009-08-20 17:43:41 +0200 | 
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2009-09-14 17:08:15 +0200 | 
| commit | eef99380679e20e7edc096aa4d8a98b875404d79 (patch) | |
| tree | 358a39148e8513eed9ba6aaff13f6bf660a2ce1e | |
| parent | 918941a3f3d46c2a69971b4718aaf13b1be2f1a7 (diff) | |
| download | linux-eef99380679e20e7edc096aa4d8a98b875404d79.tar.bz2 | |
vfs: Rename generic_file_aio_write_nolock
generic_file_aio_write_nolock() is now used only by block devices and raw
character device. Filesystems should use __generic_file_aio_write() in case
generic_file_aio_write() doesn't suit them. So rename the function to
blkdev_aio_write() and move it to fs/blockdev.c.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
| -rw-r--r-- | drivers/char/raw.c | 2 | ||||
| -rw-r--r-- | fs/block_dev.c | 29 | ||||
| -rw-r--r-- | include/linux/fs.h | 6 | ||||
| -rw-r--r-- | mm/filemap.c | 39 | 
4 files changed, 33 insertions, 43 deletions
| diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 05f9d18b9361..40268db02e22 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c @@ -246,7 +246,7 @@ static const struct file_operations raw_fops = {  	.read	=	do_sync_read,  	.aio_read = 	generic_file_aio_read,  	.write	=	do_sync_write, -	.aio_write = 	generic_file_aio_write_nolock, +	.aio_write =	blkdev_aio_write,  	.open	=	raw_open,  	.release=	raw_release,  	.ioctl	=	raw_ioctl, diff --git a/fs/block_dev.c b/fs/block_dev.c index 94dfda24c06e..3581a4e53942 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1405,6 +1405,33 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)  }  /* + * Write data to the block device.  Only intended for the block device itself + * and the raw driver which basically is a fake block device. + * + * Does not take i_mutex for the write and thus is not for general purpose + * use. + */ +ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, +			 unsigned long nr_segs, loff_t pos) +{ +	struct file *file = iocb->ki_filp; +	ssize_t ret; + +	BUG_ON(iocb->ki_pos != pos); + +	ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); +	if (ret > 0 || ret == -EIOCBQUEUED) { +		ssize_t err; + +		err = generic_write_sync(file, pos, ret); +		if (err < 0 && ret > 0) +			ret = err; +	} +	return ret; +} +EXPORT_SYMBOL_GPL(blkdev_aio_write); + +/*   * Try to release a page associated with block device when the system   * is under memory pressure.   */ @@ -1436,7 +1463,7 @@ const struct file_operations def_blk_fops = {  	.read		= do_sync_read,  	.write		= do_sync_write,    	.aio_read	= generic_file_aio_read, -  	.aio_write	= generic_file_aio_write_nolock, +	.aio_write	= blkdev_aio_write,  	.mmap		= generic_file_mmap,  	.fsync		= block_fsync,  	.unlocked_ioctl	= block_ioctl, diff --git a/include/linux/fs.h b/include/linux/fs.h index ea099d3a18d9..6c1be3a4edea 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2207,8 +2207,6 @@ extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsig  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);  extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *,  		unsigned long *, loff_t, loff_t *, size_t, size_t);  extern ssize_t generic_file_buffered_write(struct kiocb *, const struct iovec *, @@ -2218,6 +2216,10 @@ extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t l  extern int generic_segment_checks(const struct iovec *iov,  		unsigned long *nr_segs, size_t *count, int access_flags); +/* fs/block_dev.c */ +extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, +				unsigned long nr_segs, loff_t pos); +  /* fs/splice.c */  extern ssize_t generic_file_splice_read(struct file *, loff_t *,  		struct pipe_inode_info *, size_t, unsigned int); diff --git a/mm/filemap.c b/mm/filemap.c index f863e1d7e227..3587554f45ef 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2462,45 +2462,6 @@ out:  }  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) -{ -	struct file *file = iocb->ki_filp; -	struct address_space *mapping = file->f_mapping; -	struct inode *inode = mapping->host; -	ssize_t ret; - -	BUG_ON(iocb->ki_pos != pos); - -	ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); - -	if ((ret > 0 || ret == -EIOCBQUEUED) && -	    ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { -		ssize_t err; - -		err = sync_page_range_nolock(inode, mapping, pos, ret); -		if (err < 0 && ret > 0) -			ret = err; -	} -	return ret; -} -EXPORT_SYMBOL(generic_file_aio_write_nolock); -  /**   * generic_file_aio_write - write data to a file   * @iocb:	IO state structure |