From: Gmail <marco.stornelli@gmail.com>
To: linux-fsdevel@vger.kernel.org
Cc: Benjamin LaHaise <bcrl@kvack.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Jan Harkes <jaharkes@cs.cmu.edu>,
coda@cs.cmu.edu, "H. Peter Anvin" <hpa@linux.intel.com>,
Jan Kara <jack@suse.cz>,
linux-kernel@vger.kernel.org, linux-aio@kvack.org,
codalist@coda.cs.cmu.edu
Subject: [PATCH 2/4] fsfreeze: added new file_start_write_killable
Date: Thu, 04 Jul 2013 18:16:46 +0200 [thread overview]
Message-ID: <51D59FEE.6080301@gmail.com> (raw)
Replace file_start_write with file_start_write_killable where
possible.
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
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(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index d92d50f..c4f0b7b 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -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);
diff --git a/fs/aio.c b/fs/aio.c
index 2bbcacf..9e18b80 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -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,
diff --git a/fs/coda/file.c b/fs/coda/file.c
index 380b798..c5708d0 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -79,7 +79,9 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
return -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);
diff --git a/fs/read_write.c b/fs/read_write.c
index 0343000..f0393fe 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -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)
diff --git a/fs/splice.c b/fs/splice.c
index e6b2559..b37c30e 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -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;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 1c75053..9bd3326 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -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))
--
1.7.3.4
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
WARNING: multiple messages have this Message-ID (diff)
From: Gmail <marco.stornelli@gmail.com>
To: linux-fsdevel@vger.kernel.org
Cc: Benjamin LaHaise <bcrl@kvack.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Jan Harkes <jaharkes@cs.cmu.edu>,
coda@cs.cmu.edu, "H. Peter Anvin" <hpa@linux.intel.com>,
Jan Kara <jack@suse.cz>,
linux-kernel@vger.kernel.org, linux-aio@kvack.org,
codalist@TELEMANN.coda.cs.cmu.edu
Subject: [PATCH 2/4] fsfreeze: added new file_start_write_killable
Date: Thu, 04 Jul 2013 18:16:46 +0200 [thread overview]
Message-ID: <51D59FEE.6080301@gmail.com> (raw)
Replace file_start_write with file_start_write_killable where
possible.
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
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(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index d92d50f..c4f0b7b 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -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);
diff --git a/fs/aio.c b/fs/aio.c
index 2bbcacf..9e18b80 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -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,
diff --git a/fs/coda/file.c b/fs/coda/file.c
index 380b798..c5708d0 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -79,7 +79,9 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
return -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);
diff --git a/fs/read_write.c b/fs/read_write.c
index 0343000..f0393fe 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -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)
diff --git a/fs/splice.c b/fs/splice.c
index e6b2559..b37c30e 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -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;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 1c75053..9bd3326 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -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))
--
1.7.3.4
next reply other threads:[~2013-07-04 16:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-04 16:16 Gmail [this message]
2013-07-04 16:16 ` [PATCH 2/4] fsfreeze: added new file_start_write_killable Gmail
-- strict thread matches above, loose matches on Subject: below --
2013-05-04 6:50 Marco Stornelli
2013-05-04 6:50 ` Marco Stornelli
2013-04-26 8:50 Marco Stornelli
2013-04-26 8:50 ` Marco Stornelli
2013-04-26 12:06 ` Matthew Wilcox
2013-04-26 12:06 ` Matthew Wilcox
2013-04-26 13:44 ` Marco Stornelli
2013-04-26 13:44 ` Marco Stornelli
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=51D59FEE.6080301@gmail.com \
--to=marco.stornelli@gmail.com \
--cc=bcrl@kvack.org \
--cc=coda@cs.cmu.edu \
--cc=codalist@coda.cs.cmu.edu \
--cc=hpa@linux.intel.com \
--cc=jack@suse.cz \
--cc=jaharkes@cs.cmu.edu \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/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: link
Be 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.