From: Brian Foster <bfoster@redhat.com>
To: "Maxim V. Patlasov" <MPatlasov@parallels.com>
Cc: miklos@szeredi.hu, dev@parallels.com, xemul@parallels.com,
fuse-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org,
devel@openvz.org
Subject: Re: [PATCH 5/6] fuse: truncate file if async dio failed
Date: Fri, 14 Dec 2012 15:16:49 -0500 [thread overview]
Message-ID: <50CB8931.2000305@redhat.com> (raw)
In-Reply-To: <20121214152113.27155.58793.stgit@maximpc.sw.ru>
On 12/14/2012 10:21 AM, Maxim V. Patlasov wrote:
> The patch improves error handling in fuse_direct_IO(): if we successfully
> submitted several fuse requests on behalf of synchronous direct write
> extending file and some of them failed, let's try to do our best to clean-up.
>
> Signed-off-by: Maxim Patlasov <mpatlasov@parallels.com>
> ---
> fs/fuse/file.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 53 insertions(+), 2 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 05eed23..b6e9b8d 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -2340,6 +2340,53 @@ int fuse_notify_poll_wakeup(struct fuse_conn *fc,
> return 0;
> }
>
> +static void fuse_do_truncate(struct file *file)
> +{
> + struct fuse_file *ff = file->private_data;
> + struct inode *inode = file->f_mapping->host;
> + struct fuse_conn *fc = get_fuse_conn(inode);
> + struct fuse_req *req;
> + struct fuse_setattr_in inarg;
> + struct fuse_attr_out outarg;
> + int err;
> +
> + req = fuse_get_req_nopages(fc);
> + if (IS_ERR(req)) {
> + printk(KERN_WARNING "failed to allocate req for truncate "
> + "(%ld)\n", PTR_ERR(req));
> + return;
> + }
> +
> + memset(&inarg, 0, sizeof(inarg));
> + memset(&outarg, 0, sizeof(outarg));
> +
> + inarg.valid |= FATTR_SIZE;
> + inarg.size = i_size_read(inode);
> +
> + inarg.valid |= FATTR_FH;
> + inarg.fh = ff->fh;
> +
> + req->in.h.opcode = FUSE_SETATTR;
> + req->in.h.nodeid = get_node_id(inode);
> + req->in.numargs = 1;
> + req->in.args[0].size = sizeof(inarg);
> + req->in.args[0].value = &inarg;
> + req->out.numargs = 1;
> + if (fc->minor < 9)
> + req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
> + else
> + req->out.args[0].size = sizeof(outarg);
> + req->out.args[0].value = &outarg;
> +
> + fuse_request_send(fc, req);
> + err = req->out.h.error;
> + fuse_put_request(fc, req);
> +
> + if (err)
> + printk(KERN_WARNING "failed to truncate to %lld with error "
> + "%d\n", i_size_read(inode), err);
> +}
> +
fuse_do_truncate() looks fairly close to fuse_do_setattr(). Is there any
reason we couldn't make fuse_do_setattr() non-static, change the dentry
parameter to an inode and use that?
Brian
> static ssize_t
> fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
> loff_t offset, unsigned long nr_segs)
> @@ -2400,8 +2447,12 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
> kfree(io);
> }
>
> - if (rw == WRITE && ret > 0)
> - fuse_write_update_size(inode, pos);
> + if (rw == WRITE) {
> + if (ret > 0)
> + fuse_write_update_size(inode, pos);
> + else if (ret < 0 && offset + count > i_size)
> + fuse_do_truncate(file);
> + }
>
> return ret;
> }
>
next prev parent reply other threads:[~2012-12-14 20:18 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-14 15:20 [PATCH v2 0/6] fuse: process direct IO asynchronously Maxim V. Patlasov
2012-12-14 15:20 ` [PATCH 1/6] fuse: move fuse_release_user_pages() up Maxim V. Patlasov
2012-12-14 15:20 ` [PATCH 2/6] fuse: add support of async IO Maxim V. Patlasov
2013-04-22 16:34 ` Miklos Szeredi
2013-04-23 12:21 ` Maxim V. Patlasov
2012-12-14 15:20 ` [PATCH 3/6] fuse: make fuse_direct_io() aware about AIO Maxim V. Patlasov
2012-12-14 15:21 ` [PATCH 4/6] fuse: enable asynchronous processing direct IO Maxim V. Patlasov
2012-12-14 15:21 ` [PATCH 5/6] fuse: truncate file if async dio failed Maxim V. Patlasov
2012-12-14 20:16 ` Brian Foster [this message]
2012-12-17 14:13 ` Maxim V. Patlasov
2012-12-17 19:04 ` Brian Foster
2012-12-18 8:12 ` Maxim V. Patlasov
2013-04-17 20:42 ` Miklos Szeredi
2012-12-18 10:05 ` [PATCH] fuse: truncate file if async dio failed - v2 Maxim V. Patlasov
2012-12-14 15:21 ` [PATCH 6/6] fuse: optimize short direct reads Maxim V. Patlasov
2012-12-18 14:14 ` [PATCH v2 0/6] fuse: process direct IO asynchronously Brian Foster
2013-04-11 11:22 ` [fuse-devel] " Maxim V. Patlasov
2013-04-11 16:07 ` Miklos Szeredi
2013-04-11 16:43 ` Maxim V. Patlasov
-- strict thread matches above, loose matches on Subject: below --
2012-12-10 7:41 [PATCH " Maxim V. Patlasov
2012-12-10 7:42 ` [PATCH 5/6] fuse: truncate file if async dio failed Maxim V. Patlasov
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=50CB8931.2000305@redhat.com \
--to=bfoster@redhat.com \
--cc=MPatlasov@parallels.com \
--cc=dev@parallels.com \
--cc=devel@openvz.org \
--cc=fuse-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=xemul@parallels.com \
/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.