Lines Matching refs:op

20 	struct afs_operation *op;
24 op = kzalloc(sizeof(*op), GFP_KERNEL);
25 if (!op)
31 kfree(op);
38 op->key = key;
39 op->volume = afs_get_volume(volume, afs_volume_trace_get_new_op);
40 op->net = volume->cell->net;
41 op->cb_v_break = volume->cb_v_break;
42 op->debug_id = atomic_inc_return(&afs_operation_debug_counter);
43 op->error = -EDESTADDRREQ;
44 op->ac.error = SHRT_MAX;
46 _leave(" = [op=%08x]", op->debug_id);
47 return op;
53 static bool afs_get_io_locks(struct afs_operation *op)
55 struct afs_vnode *vnode = op->file[0].vnode;
56 struct afs_vnode *vnode2 = op->file[1].vnode;
60 if (op->flags & AFS_OPERATION_UNINTR) {
62 op->flags |= AFS_OPERATION_LOCK_0;
67 if (!vnode2 || !op->file[1].need_io_lock || vnode == vnode2)
74 op->error = -ERESTARTSYS;
75 op->flags |= AFS_OPERATION_STOP;
79 op->flags |= AFS_OPERATION_LOCK_0;
83 op->error = -ERESTARTSYS;
84 op->flags |= AFS_OPERATION_STOP;
86 op->flags &= ~AFS_OPERATION_LOCK_0;
90 op->flags |= AFS_OPERATION_LOCK_1;
97 static void afs_drop_io_locks(struct afs_operation *op)
99 struct afs_vnode *vnode = op->file[0].vnode;
100 struct afs_vnode *vnode2 = op->file[1].vnode;
104 if (op->flags & AFS_OPERATION_LOCK_1)
106 if (op->flags & AFS_OPERATION_LOCK_0)
110 static void afs_prepare_vnode(struct afs_operation *op, struct afs_vnode_param *vp,
120 op->flags |= AFS_OPERATION_CUR_ONLY;
136 bool afs_begin_vnode_operation(struct afs_operation *op)
138 struct afs_vnode *vnode = op->file[0].vnode;
144 if (op->file[0].need_io_lock)
145 if (!afs_get_io_locks(op))
148 afs_prepare_vnode(op, &op->file[0], 0);
149 afs_prepare_vnode(op, &op->file[1], 1);
150 op->cb_v_break = op->volume->cb_v_break;
158 static void afs_end_vnode_operation(struct afs_operation *op)
162 if (op->error == -EDESTADDRREQ ||
163 op->error == -EADDRNOTAVAIL ||
164 op->error == -ENETUNREACH ||
165 op->error == -EHOSTUNREACH)
166 afs_dump_edestaddrreq(op);
168 afs_drop_io_locks(op);
170 if (op->error == -ECONNABORTED)
171 op->error = afs_abort_to_error(op->ac.abort_code);
177 void afs_wait_for_operation(struct afs_operation *op)
181 while (afs_select_fileserver(op)) {
182 op->cb_s_break = op->server->cb_s_break;
183 if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags) &&
184 op->ops->issue_yfs_rpc)
185 op->ops->issue_yfs_rpc(op);
186 else if (op->ops->issue_afs_rpc)
187 op->ops->issue_afs_rpc(op);
189 op->ac.error = -ENOTSUPP;
191 if (op->call)
192 op->error = afs_wait_for_call_to_complete(op->call, &op->ac);
195 switch (op->error) {
198 op->ops->success(op);
201 if (op->ops->aborted)
202 op->ops->aborted(op);
208 afs_end_vnode_operation(op);
210 if (op->error == 0 && op->ops->edit_dir) {
212 op->ops->edit_dir(op);
220 int afs_put_operation(struct afs_operation *op)
222 int i, ret = op->error;
224 _enter("op=%08x,%d", op->debug_id, ret);
226 if (op->ops && op->ops->put)
227 op->ops->put(op);
228 if (op->file[0].modification)
229 clear_bit(AFS_VNODE_MODIFYING, &op->file[0].vnode->flags);
230 if (op->file[1].modification && op->file[1].vnode != op->file[0].vnode)
231 clear_bit(AFS_VNODE_MODIFYING, &op->file[1].vnode->flags);
232 if (op->file[0].put_vnode)
233 iput(&op->file[0].vnode->vfs_inode);
234 if (op->file[1].put_vnode)
235 iput(&op->file[1].vnode->vfs_inode);
237 if (op->more_files) {
238 for (i = 0; i < op->nr_files - 2; i++)
239 if (op->more_files[i].put_vnode)
240 iput(&op->more_files[i].vnode->vfs_inode);
241 kfree(op->more_files);
244 afs_end_cursor(&op->ac);
245 afs_put_serverlist(op->net, op->server_list);
246 afs_put_volume(op->net, op->volume, afs_volume_trace_put_put_op);
247 key_put(op->key);
248 kfree(op);
252 int afs_do_sync_operation(struct afs_operation *op)
254 afs_begin_vnode_operation(op);
255 afs_wait_for_operation(op);
256 return afs_put_operation(op);