^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Fileserver-directed operation handling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2020 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) static atomic_t afs_operation_debug_counter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Create an operation against a volume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct afs_operation *afs_alloc_operation(struct key *key, struct afs_volume *volume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct afs_operation *op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) op = kzalloc(sizeof(*op), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) if (!op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) if (!key) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) key = afs_request_key(volume->cell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) if (IS_ERR(key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) kfree(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return ERR_CAST(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) key_get(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) op->key = key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) op->volume = afs_get_volume(volume, afs_volume_trace_get_new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) op->net = volume->cell->net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) op->cb_v_break = volume->cb_v_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) op->debug_id = atomic_inc_return(&afs_operation_debug_counter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) op->error = -EDESTADDRREQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) op->ac.error = SHRT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) _leave(" = [op=%08x]", op->debug_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * Lock the vnode(s) being operated upon.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static bool afs_get_io_locks(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct afs_vnode *vnode = op->file[0].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct afs_vnode *vnode2 = op->file[1].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (op->flags & AFS_OPERATION_UNINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) mutex_lock(&vnode->io_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) op->flags |= AFS_OPERATION_LOCK_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) _leave(" = t [1]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (!vnode2 || !op->file[1].need_io_lock || vnode == vnode2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) vnode2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (vnode2 > vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) swap(vnode, vnode2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (mutex_lock_interruptible(&vnode->io_lock) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) op->error = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) op->flags |= AFS_OPERATION_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) _leave(" = f [I 0]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) op->flags |= AFS_OPERATION_LOCK_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (vnode2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (mutex_lock_interruptible_nested(&vnode2->io_lock, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) op->error = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) op->flags |= AFS_OPERATION_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) mutex_unlock(&vnode->io_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) op->flags &= ~AFS_OPERATION_LOCK_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) _leave(" = f [I 1]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) op->flags |= AFS_OPERATION_LOCK_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) _leave(" = t [2]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static void afs_drop_io_locks(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct afs_vnode *vnode = op->file[0].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct afs_vnode *vnode2 = op->file[1].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (op->flags & AFS_OPERATION_LOCK_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) mutex_unlock(&vnode2->io_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (op->flags & AFS_OPERATION_LOCK_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) mutex_unlock(&vnode->io_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) static void afs_prepare_vnode(struct afs_operation *op, struct afs_vnode_param *vp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct afs_vnode *vnode = vp->vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (vnode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) vp->fid = vnode->fid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) vp->dv_before = vnode->status.data_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) if (vnode->lock_state != AFS_VNODE_LOCK_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) op->flags |= AFS_OPERATION_CUR_ONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (vp->modification)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) set_bit(AFS_VNODE_MODIFYING, &vnode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (vp->fid.vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) _debug("PREP[%u] {%llx:%llu.%u}",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) index, vp->fid.vid, vp->fid.vnode, vp->fid.unique);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * Begin an operation on the fileserver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * Fileserver operations are serialised on the server by vnode, so we serialise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * them here also using the io_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) bool afs_begin_vnode_operation(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct afs_vnode *vnode = op->file[0].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ASSERT(vnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (op->file[0].need_io_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) if (!afs_get_io_locks(op))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) afs_prepare_vnode(op, &op->file[0], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) afs_prepare_vnode(op, &op->file[1], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) op->cb_v_break = op->volume->cb_v_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) _leave(" = true");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * Tidy up a filesystem cursor and unlock the vnode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static void afs_end_vnode_operation(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (op->error == -EDESTADDRREQ ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) op->error == -EADDRNOTAVAIL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) op->error == -ENETUNREACH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) op->error == -EHOSTUNREACH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) afs_dump_edestaddrreq(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) afs_drop_io_locks(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (op->error == -ECONNABORTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) op->error = afs_abort_to_error(op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * Wait for an in-progress operation to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) void afs_wait_for_operation(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) _enter("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) while (afs_select_fileserver(op)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) op->cb_s_break = op->server->cb_s_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) op->ops->issue_yfs_rpc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) op->ops->issue_yfs_rpc(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) else if (op->ops->issue_afs_rpc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) op->ops->issue_afs_rpc(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) op->ac.error = -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (op->call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) op->error = afs_wait_for_call_to_complete(op->call, &op->ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) switch (op->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) _debug("success");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) op->ops->success(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) case -ECONNABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (op->ops->aborted)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) op->ops->aborted(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) afs_end_vnode_operation(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) if (op->error == 0 && op->ops->edit_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) _debug("edit_dir");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) op->ops->edit_dir(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) _leave("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) * Dispose of an operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) int afs_put_operation(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) int i, ret = op->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) _enter("op=%08x,%d", op->debug_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (op->ops && op->ops->put)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) op->ops->put(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (op->file[0].modification)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) clear_bit(AFS_VNODE_MODIFYING, &op->file[0].vnode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (op->file[1].modification && op->file[1].vnode != op->file[0].vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) clear_bit(AFS_VNODE_MODIFYING, &op->file[1].vnode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (op->file[0].put_vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) iput(&op->file[0].vnode->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) if (op->file[1].put_vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) iput(&op->file[1].vnode->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (op->more_files) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) for (i = 0; i < op->nr_files - 2; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (op->more_files[i].put_vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) iput(&op->more_files[i].vnode->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) kfree(op->more_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) afs_end_cursor(&op->ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) afs_put_serverlist(op->net, op->server_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) afs_put_volume(op->net, op->volume, afs_volume_trace_put_put_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) key_put(op->key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) kfree(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) int afs_do_sync_operation(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) afs_begin_vnode_operation(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) afs_wait_for_operation(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return afs_put_operation(op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }