From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Daniel Rosenberg <drosen@google.com>,
Paul Lawrence <paullawrence@google.com>,
Alessio Balsini <balsini@android.com>,
fuse-devel@lists.sourceforge.net, linux-fsdevel@vger.kernel.org
Subject: [PATCH v13 08/10] fuse: update inode size/mtime after passthrough write
Date: Fri, 19 May 2023 15:57:03 +0300 [thread overview]
Message-ID: <20230519125705.598234-9-amir73il@gmail.com> (raw)
In-Reply-To: <20230519125705.598234-1-amir73il@gmail.com>
Similar to update size/mtime at the end of fuse_perform_write(),
we need to bump the attr version when we update the inode size.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
fs/fuse/passthrough.c | 53 ++++++++++++++++++++++++++++++++++---------
1 file changed, 42 insertions(+), 11 deletions(-)
diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c
index 10b370bcc423..8352d6b91e0e 100644
--- a/fs/fuse/passthrough.c
+++ b/fs/fuse/passthrough.c
@@ -14,15 +14,42 @@ struct fuse_aio_req {
struct kiocb *iocb_fuse;
};
-static void fuse_aio_cleanup_handler(struct fuse_aio_req *aio_req)
+static void fuse_file_start_write(struct file *fuse_file,
+ struct file *backing_file,
+ loff_t pos, size_t count)
+{
+ struct inode *inode = file_inode(fuse_file);
+ struct fuse_inode *fi = get_fuse_inode(inode);
+
+ if (inode->i_size < pos + count)
+ set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
+
+ file_start_write(backing_file);
+}
+
+static void fuse_file_end_write(struct file *fuse_file,
+ struct file *backing_file,
+ loff_t pos, ssize_t res)
+{
+ struct inode *inode = file_inode(fuse_file);
+ struct fuse_inode *fi = get_fuse_inode(inode);
+
+ file_end_write(backing_file);
+
+ fuse_write_update_attr(inode, pos, res);
+ clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
+}
+
+static void fuse_aio_cleanup_handler(struct fuse_aio_req *aio_req, long res)
{
struct kiocb *iocb = &aio_req->iocb;
struct kiocb *iocb_fuse = aio_req->iocb_fuse;
+ struct file *filp = iocb->ki_filp;
+ struct file *fuse_filp = iocb_fuse->ki_filp;
if (iocb->ki_flags & IOCB_WRITE) {
- __sb_writers_acquired(file_inode(iocb->ki_filp)->i_sb,
- SB_FREEZE_WRITE);
- file_end_write(iocb->ki_filp);
+ __sb_writers_acquired(file_inode(filp)->i_sb, SB_FREEZE_WRITE);
+ fuse_file_end_write(fuse_filp, filp, iocb->ki_pos, res);
}
iocb_fuse->ki_pos = iocb->ki_pos;
@@ -35,7 +62,7 @@ static void fuse_aio_rw_complete(struct kiocb *iocb, long res)
container_of(iocb, struct fuse_aio_req, iocb);
struct kiocb *iocb_fuse = aio_req->iocb_fuse;
- fuse_aio_cleanup_handler(aio_req);
+ fuse_aio_cleanup_handler(aio_req, res);
iocb_fuse->ki_complete(iocb_fuse, res);
}
@@ -71,7 +98,7 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse,
aio_req->iocb.ki_complete = fuse_aio_rw_complete;
ret = call_read_iter(passthrough_filp, &aio_req->iocb, iter);
if (ret != -EIOCBQUEUED)
- fuse_aio_cleanup_handler(aio_req);
+ fuse_aio_cleanup_handler(aio_req, ret);
}
out:
revert_creds(old_cred);
@@ -87,22 +114,25 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse,
struct inode *fuse_inode = file_inode(fuse_filp);
struct file *passthrough_filp = ff->passthrough->filp;
struct inode *passthrough_inode = file_inode(passthrough_filp);
+ size_t count = iov_iter_count(iter);
const struct cred *old_cred;
ssize_t ret;
rwf_t rwf;
- if (!iov_iter_count(iter))
+ if (!count)
return 0;
inode_lock(fuse_inode);
old_cred = override_creds(ff->passthrough->cred);
if (is_sync_kiocb(iocb_fuse)) {
- file_start_write(passthrough_filp);
+ fuse_file_start_write(fuse_filp, passthrough_filp,
+ iocb_fuse->ki_pos, count);
rwf = iocb_to_rw_flags(iocb_fuse->ki_flags, FUSE_IOCB_MASK);
ret = vfs_iter_write(passthrough_filp, iter, &iocb_fuse->ki_pos,
rwf);
- file_end_write(passthrough_filp);
+ fuse_file_end_write(fuse_filp, passthrough_filp,
+ iocb_fuse->ki_pos, ret);
} else {
struct fuse_aio_req *aio_req;
@@ -112,7 +142,8 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse,
goto out;
}
- file_start_write(passthrough_filp);
+ fuse_file_start_write(fuse_filp, passthrough_filp,
+ iocb_fuse->ki_pos, count);
__sb_writers_release(passthrough_inode->i_sb, SB_FREEZE_WRITE);
aio_req->iocb_fuse = iocb_fuse;
@@ -120,7 +151,7 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse,
aio_req->iocb.ki_complete = fuse_aio_rw_complete;
ret = call_write_iter(passthrough_filp, &aio_req->iocb, iter);
if (ret != -EIOCBQUEUED)
- fuse_aio_cleanup_handler(aio_req);
+ fuse_aio_cleanup_handler(aio_req, ret);
}
out:
revert_creds(old_cred);
--
2.34.1
next prev parent reply other threads:[~2023-05-19 12:58 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-19 12:56 [PATCH v13 00/10] fuse: Add support for passthrough read/write Amir Goldstein
2023-05-19 12:56 ` [PATCH v13 01/10] fs: Generic function to convert iocb to rw flags Amir Goldstein
2023-05-19 12:56 ` [PATCH v13 02/10] fuse: Definitions and ioctl for passthrough Amir Goldstein
2023-05-19 15:12 ` Miklos Szeredi
2023-05-20 10:20 ` Amir Goldstein
2023-05-22 14:50 ` Miklos Szeredi
2023-05-24 10:00 ` Amir Goldstein
2023-05-19 12:56 ` [PATCH v13 03/10] fuse: Passthrough initialization and release Amir Goldstein
2023-05-19 12:56 ` [PATCH v13 04/10] fuse: Introduce synchronous read and write for passthrough Amir Goldstein
2023-05-19 12:57 ` [PATCH v13 05/10] fuse: Handle asynchronous read and write in passthrough Amir Goldstein
2023-05-22 15:20 ` Miklos Szeredi
2023-05-24 10:03 ` Amir Goldstein
2023-08-21 15:27 ` Amir Goldstein
2023-08-22 10:18 ` Amir Goldstein
2023-08-22 11:03 ` Miklos Szeredi
2023-08-22 13:22 ` Amir Goldstein
2023-08-22 14:06 ` Miklos Szeredi
2023-08-24 12:11 ` Amir Goldstein
2023-08-29 12:42 ` Miklos Szeredi
2023-05-19 12:57 ` [PATCH v13 06/10] fuse: Use daemon creds in passthrough mode Amir Goldstein
2023-05-19 12:57 ` [PATCH v13 07/10] fuse: Introduce passthrough for mmap Amir Goldstein
2023-05-19 12:57 ` Amir Goldstein [this message]
2023-09-25 6:41 ` [External] [PATCH v13 08/10] fuse: update inode size/mtime after passthrough write Zhang Tianci
2023-09-25 10:43 ` Amir Goldstein
2023-09-26 15:31 ` Jens Axboe
2023-09-26 15:48 ` Amir Goldstein
2023-09-26 16:19 ` Jens Axboe
2023-09-26 16:56 ` Amir Goldstein
2023-05-19 12:57 ` [PATCH v13 09/10] fuse: invalidate atime after passthrough read/mmap Amir Goldstein
2023-05-19 12:57 ` [PATCH v13 10/10] fuse: setup a passthrough fd without a permanent backing id Amir Goldstein
2023-06-06 10:22 ` Fwd: " Miklos Szeredi
2023-06-06 11:00 ` [fuse-devel] " Amir Goldstein
2023-06-06 12:46 ` Miklos Szeredi
2023-05-20 10:28 ` [PATCH v13 00/10] fuse: Add support for passthrough read/write Amir Goldstein
2023-06-06 9:13 ` Amir Goldstein
2023-06-06 9:49 ` Miklos Szeredi
2023-06-06 11:19 ` Amir Goldstein
2023-06-06 13:06 ` Miklos Szeredi
2023-08-29 18:14 ` Amir Goldstein
2023-09-20 13:56 ` Amir Goldstein
2023-09-20 18:15 ` Miklos Szeredi
2023-09-21 7:33 ` Amir Goldstein
2023-09-21 8:21 ` Miklos Szeredi
2023-09-21 9:17 ` Amir Goldstein
2023-09-21 9:30 ` Miklos Szeredi
2023-09-21 10:31 ` Amir Goldstein
2023-09-21 11:50 ` Miklos Szeredi
2023-09-22 12:45 ` Amir Goldstein
2023-10-08 17:53 ` Amir Goldstein
2023-10-10 14:31 ` Miklos Szeredi
2023-10-10 15:14 ` Amir Goldstein
2023-10-14 16:01 ` Amir Goldstein
2023-10-16 10:30 ` Amir Goldstein
2023-10-16 13:21 ` Miklos Szeredi
2023-10-16 19:16 ` Bernd Schubert
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=20230519125705.598234-9-amir73il@gmail.com \
--to=amir73il@gmail.com \
--cc=balsini@android.com \
--cc=drosen@google.com \
--cc=fuse-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=paullawrence@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).