fsfreeze: added new file_start_write_killable
Subsystems (4)
PATCH 2/4 fsfreeze: added new file_start_write_killable
Replace file_start_write with file_start_write_killable where possible.
Signed-off-by Marco Stornelli <[email protected]>
Reviewed-by Jan Kara <[email protected]>
--- drivers/block/loop.c | 4 +++- fs/aio.c | 8 ++++++-- fs/coda/file.c | 4 +++- fs/read_write.c | 38 ++++++++++++++++++++++---------------- fs/splice.c | 4 +++- include/linux/fs.h | 17 +++++++++++++++++ 6 files changed, 54 insertions(+), 21 deletions(-)
drivers/block/loop.c +3 -1
@@ -230,7 +230,9 @@ static int __do_lo_send_write(struct file *file,ssize_t bw;mm_segment_t old_fs =get_fs (); -file_start_write (file); + bw =file_start_write_killable (file); +if (bw <0 ) +return bw;set_fs (get_ds ()); bw = file->f_op->write (file, buf, len, &pos);set_fs (old_fs);
fs/aio.c +6 -2
@@ -915,8 +915,12 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb, int rw, aio_rw_op *rw_op)if (iocb->ki_pos <0 )return -EINVAL ; -if (rw ==WRITE ) -file_start_write (file); +if (rw ==WRITE ) { + ret =file_start_write_killable (file); +if (ret <0 ) +return ret; + } + do { ret = rw_op(iocb, &iocb->ki_iovec[iocb->ki_cur_seg], iocb->ki_nr_segs - iocb->ki_cur_seg,
fs/coda/file.c +3 -1
@@ -79,7 +79,9 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, loreturn -EINVAL ; host_inode =file_inode (host_file); -file_start_write (host_file); + ret =file_start_write_killable (host_file); +if (ret <0 ) +return ret;mutex_lock (&coda_inode->i_mutex); ret = host_file->f_op->write (host_file, buf, count, ppos);
fs/read_write.c +22 -16
@@ -439,21 +439,23 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_return -EFAULT ; ret =rw_verify_area (WRITE , file, pos, count); -if (ret >=0 ) { - count = ret; -file_start_write (file); -if (file->f_op->write) - ret = file->f_op->write (file, buf, count, pos); -else - ret =do_sync_write (file, buf, count, pos); -if (ret >0 ) { -fsnotify_modify (file); -add_wchar (current, ret); - } -inc_syscw (current); -file_end_write (file); +if (ret <0 ) + goto out; + count = ret; + ret =file_start_write_killable (file); +if (ret <0 ) + goto out; +if (file->f_op->write) + ret = file->f_op->write (file, buf, count, pos); +else + ret =do_sync_write (file, buf, count, pos); +if (ret >0 ) { +fsnotify_modify (file); +add_wchar (current, ret); } - +inc_syscw (current); +file_end_write (file); +out:return ret; }
@@ -721,7 +723,9 @@ static ssize_t do_readv_writev(int type, struct file *file, }else { fn = (io_fn_t )file->f_op->write; fnv = file->f_op->aio_write; -file_start_write (file); + ret =file_start_write_killable (file); +if (ret <0 ) + goto out; }if (fnv)
@@ -901,7 +905,9 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, }else { fn = (io_fn_t )file->f_op->write; fnv = file->f_op->aio_write; -file_start_write (file); + ret =file_start_write_killable (file); +if (ret <0 ) + goto out; }if (fnv)
fs/splice.c +3 -1
@@ -1115,7 +1115,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,else splice_write = default_file_splice_write; -file_start_write (out); + ret =file_start_write_killable (out); +if (ret <0 ) +return ret; ret =splice_write (pipe, out, ppos, len, flags);file_end_write (out);return ret;
include/linux/fs.h +17 -0
@@ -1404,6 +1404,16 @@ static inline void sb_start_write(struct super_block *sb)__sb_start_write (sb,SB_FREEZE_WRITE ,FREEZE_WAIT ); } +/** +* sb_start_write_killable - get write access to a superblock +* @sb: the super we write to +* +*/ +static inline int sb_start_write_killable (struct super_block *sb) +{ +return __sb_start_write (sb,SB_FREEZE_WRITE ,FREEZE_WAIT_KILLABLE ); +} +static inline int sb_start_write_trylock (struct super_block *sb) {return __sb_start_write (sb,SB_FREEZE_WRITE ,FREEZE_NOWAIT );
@@ -2227,6 +2237,13 @@ static inline struct inode *file_inode(struct file *f)return f->f_inode; } +static inline int file_start_write_killable (struct file *file) +{ +if (!S_ISREG (file_inode (file)->i_mode)) +return 1 ; +return sb_start_write_killable (file_inode (file)->i_sb); +} +static inline void file_start_write (struct file *file) {if (!S_ISREG (file_inode (file)->i_mode))
Signature · 7 lines
1.7.3.4 -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to [email protected]. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"[email protected]">[email protected]</a>