fsfreeze: return EINTR from mnt_want_write and mnt_want_write_file
PATCH 4/4 fsfreeze: return EINTR from mnt_want_write and mnt_want_write_file
Replaced sb_start_write with sb_start_write_killable inside mnt_want_write and mnt_want_write_file.
Signed-off-by Marco Stornelli <[email protected]>
Reviewed-by Jan Kara <[email protected]>
--- fs/namei.c | 6 ++++++ fs/namespace.c | 8 ++++++-- ipc/mqueue.c | 6 +++++- 3 files changed, 17 insertions(+), 3 deletions(-)
fs/namei.c +6 -0
@@ -2750,6 +2750,8 @@ static int do_last(struct nameidata *nd, struct path *path, retry_lookup:if (op->open_flag & (O_CREAT |O_TRUNC |O_WRONLY |O_RDWR )) { error =mnt_want_write (nd->path.mnt); +if (error == -EINTR ) + goto out;if (!error) got_write = true;/*
@@ -3053,6 +3055,10 @@ struct dentry *kern_path_create(int dfd, const char *pathname,/* don't fail immediately if it's r/o, at least try to report other errors */ err2 =mnt_want_write (nd.path.mnt); +if (err2 == -EINTR ) { + dentry =ERR_PTR (-EINTR ); + goto out; + }/* * Do the final lookup. */
fs/namespace.c +6 -2
@@ -345,7 +345,9 @@ int mnt_want_write(struct vfsmount *m) {int ret; -sb_start_write (m->mnt_sb); + ret =sb_start_write_killable (m->mnt_sb); +if (ret <0 ) +return ret; ret =__mnt_want_write (m);if (ret)sb_end_write (m->mnt_sb);
@@ -405,7 +407,9 @@ int mnt_want_write_file(struct file *file) {int ret; -sb_start_write (file->f_path.mnt->mnt_sb); + ret =sb_start_write_killable (file->f_path.mnt->mnt_sb); +if (ret <0 ) +return ret; ret =__mnt_want_write_file (file);if (ret)sb_end_write (file->f_path.mnt->mnt_sb);
ipc/mqueue.c +5 -1
@@ -800,7 +800,11 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, umode_t, mode,if (fd <0 ) goto out_putname; - ro =mnt_want_write (mnt);/* we'll drop it in any case */ + ro =mnt_want_write (mnt); +if (ro == -EINTR ) { + fd = ro; + goto out_putname; + } error =0 ;mutex_lock (&root->d_inode->i_mutex); path.dentry =lookup_one_len (name->name, root,strlen (name->name));
Signature · 1 line
1.7.3.4