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>
This commit is contained in:
committed by
Jan Kara
parent
918941a3f3
commit
eef9938067
@@ -246,7 +246,7 @@ static const struct file_operations raw_fops = {
|
|||||||
.read = do_sync_read,
|
.read = do_sync_read,
|
||||||
.aio_read = generic_file_aio_read,
|
.aio_read = generic_file_aio_read,
|
||||||
.write = do_sync_write,
|
.write = do_sync_write,
|
||||||
.aio_write = generic_file_aio_write_nolock,
|
.aio_write = blkdev_aio_write,
|
||||||
.open = raw_open,
|
.open = raw_open,
|
||||||
.release= raw_release,
|
.release= raw_release,
|
||||||
.ioctl = raw_ioctl,
|
.ioctl = raw_ioctl,
|
||||||
|
@@ -1404,6 +1404,33 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|||||||
return blkdev_ioctl(bdev, mode, cmd, arg);
|
return blkdev_ioctl(bdev, mode, cmd, 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
|
* Try to release a page associated with block device when the system
|
||||||
* is under memory pressure.
|
* is under memory pressure.
|
||||||
@@ -1436,7 +1463,7 @@ const struct file_operations def_blk_fops = {
|
|||||||
.read = do_sync_read,
|
.read = do_sync_read,
|
||||||
.write = do_sync_write,
|
.write = do_sync_write,
|
||||||
.aio_read = generic_file_aio_read,
|
.aio_read = generic_file_aio_read,
|
||||||
.aio_write = generic_file_aio_write_nolock,
|
.aio_write = blkdev_aio_write,
|
||||||
.mmap = generic_file_mmap,
|
.mmap = generic_file_mmap,
|
||||||
.fsync = block_fsync,
|
.fsync = block_fsync,
|
||||||
.unlocked_ioctl = block_ioctl,
|
.unlocked_ioctl = block_ioctl,
|
||||||
|
@@ -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,
|
extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long,
|
||||||
loff_t *);
|
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);
|
|
||||||
extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *,
|
extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *,
|
||||||
unsigned long *, loff_t, loff_t *, size_t, size_t);
|
unsigned long *, loff_t, loff_t *, size_t, size_t);
|
||||||
extern ssize_t generic_file_buffered_write(struct kiocb *, const struct iovec *,
|
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,
|
extern int generic_segment_checks(const struct iovec *iov,
|
||||||
unsigned long *nr_segs, size_t *count, int access_flags);
|
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 */
|
/* fs/splice.c */
|
||||||
extern ssize_t generic_file_splice_read(struct file *, loff_t *,
|
extern ssize_t generic_file_splice_read(struct file *, loff_t *,
|
||||||
struct pipe_inode_info *, size_t, unsigned int);
|
struct pipe_inode_info *, size_t, unsigned int);
|
||||||
|
39
mm/filemap.c
39
mm/filemap.c
@@ -2462,45 +2462,6 @@ out:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__generic_file_aio_write);
|
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
|
* generic_file_aio_write - write data to a file
|
||||||
* @iocb: IO state structure
|
* @iocb: IO state structure
|
||||||
|
Reference in New Issue
Block a user