mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
afs: Maintain netfs_i_context::remote_i_size
Make afs use netfslib's tracking for the server's idea of what the current inode size is independently of inode->i_size. We really want to use this value when calculating the new vnode size when initiating a StoreData RPC op rather than the size stat() presents to the user (ie. inode->i_size) as the latter is affected by as-yet uncommitted writes. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> cc: linux-cachefs@redhat.com cc: linux-afs@lists.infradead.org Link: https://lore.kernel.org/r/164623014626.3564931.8375344024648265358.stgit@warthog.procyon.org.uk/ # v1 Link: https://lore.kernel.org/r/164678220204.1200972.17408022517463940584.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/164692923592.2099075.5466132542956550401.stgit@warthog.procyon.org.uk/ # v3
This commit is contained in:
parent
4058f74210
commit
ab487a4cdf
@ -246,6 +246,7 @@ static void afs_apply_status(struct afs_operation *op,
|
|||||||
* idea of what the size should be that's not the same as
|
* idea of what the size should be that's not the same as
|
||||||
* what's on the server.
|
* what's on the server.
|
||||||
*/
|
*/
|
||||||
|
vnode->netfs_ctx.remote_i_size = status->size;
|
||||||
if (change_size) {
|
if (change_size) {
|
||||||
afs_set_i_size(vnode, status->size);
|
afs_set_i_size(vnode, status->size);
|
||||||
inode->i_ctime = t;
|
inode->i_ctime = t;
|
||||||
|
@ -353,9 +353,10 @@ static const struct afs_operation_ops afs_store_data_operation = {
|
|||||||
static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos,
|
static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos,
|
||||||
bool laundering)
|
bool laundering)
|
||||||
{
|
{
|
||||||
|
struct netfs_i_context *ictx = &vnode->netfs_ctx;
|
||||||
struct afs_operation *op;
|
struct afs_operation *op;
|
||||||
struct afs_wb_key *wbk = NULL;
|
struct afs_wb_key *wbk = NULL;
|
||||||
loff_t size = iov_iter_count(iter), i_size;
|
loff_t size = iov_iter_count(iter);
|
||||||
int ret = -ENOKEY;
|
int ret = -ENOKEY;
|
||||||
|
|
||||||
_enter("%s{%llx:%llu.%u},%llx,%llx",
|
_enter("%s{%llx:%llu.%u},%llx,%llx",
|
||||||
@ -377,15 +378,13 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
i_size = i_size_read(&vnode->vfs_inode);
|
|
||||||
|
|
||||||
afs_op_set_vnode(op, 0, vnode);
|
afs_op_set_vnode(op, 0, vnode);
|
||||||
op->file[0].dv_delta = 1;
|
op->file[0].dv_delta = 1;
|
||||||
op->file[0].modification = true;
|
op->file[0].modification = true;
|
||||||
op->store.write_iter = iter;
|
op->store.write_iter = iter;
|
||||||
op->store.pos = pos;
|
op->store.pos = pos;
|
||||||
op->store.size = size;
|
op->store.size = size;
|
||||||
op->store.i_size = max(pos + size, i_size);
|
op->store.i_size = max(pos + size, ictx->remote_i_size);
|
||||||
op->store.laundering = laundering;
|
op->store.laundering = laundering;
|
||||||
op->mtime = vnode->vfs_inode.i_mtime;
|
op->mtime = vnode->vfs_inode.i_mtime;
|
||||||
op->flags |= AFS_OPERATION_UNINTR;
|
op->flags |= AFS_OPERATION_UNINTR;
|
||||||
|
Loading…
Reference in New Issue
Block a user