9p: Fix v9fs_issue_write() to update i_size and remote_i_size
Subsystems (3)
Dominique Martinet
maintainerPATCH 1/1 9p: Fix v9fs_issue_write() to update i_size and remote_i_size
From: David Howells <[email protected]>
Fix v9fs_issue_write() to update i_size and remote_i_size to the new size of the server file if we made it larger, using the start fpos and the count returned by p9_client_write() to calculate the new minimum file size.
This assumes that if the 9P server makes a short write (say it hits ENOSPC), a reduced count is returned.
Message-ID: <[email protected]>
---
I'm resending this as a patch to get sashiko to run on it, please disregard this email and reply to the original thread (Closes link above) if you have concerns about it.
(well, I guess either David or me will see it either way, but it's easier to follow if it's all in the same thread)
fs/9p/vfs_addr.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
fs/9p/vfs_addr.c +27 -1
@@ -54,11 +54,37 @@ static void v9fs_begin_writeback(struct netfs_io_request *wreq)static void v9fs_issue_write (struct netfs_io_subrequest *subreq) {struct p9_fid *fid = subreq->rreq->netfs_priv; +struct inode *inode = subreq->rreq->inode; +struct netfs_inode *ictx =netfs_inode (inode);int err, len; len =p9_client_write (fid, subreq->start, &subreq->io_iter, &err); -if (len >0 ) +if (len >0 ) { +uoff_t end = subreq->start + len, i_size, remote, zp; +bool set = false; + +spin_lock (&inode->i_lock); + +/* We can read the sizes directly as we hold i_lock. */ + i_size = inode->i_size; + remote = ictx->_remote_i_size; + zp = ictx->_zero_point; + +if (end > i_size) { + i_size = end; + set = true; + } +if (end > remote) { + remote = end; + set = true; + } + +if (set) +netfs_write_sizes (inode, i_size, remote, zp); +spin_unlock (&inode->i_lock); +__set_bit (NETFS_SREQ_MADE_PROGRESS , &subreq->flags); + }netfs_write_subrequest_terminated (subreq, len ?: err); }
Signature · 1 line
2.55.0