* lookups contained therein are stored in the reply without aborting
         * the whole operation.
         */
-       op->error = -ENOTSUPP;
+       afs_op_set_error(op, -ENOTSUPP);
        if (!cookie->one_only) {
                op->ops = &afs_inline_bulk_status_operation;
                afs_begin_vnode_operation(op);
                afs_wait_for_operation(op);
        }
 
-       if (op->error == -ENOTSUPP) {
+       if (afs_op_error(op) == -ENOTSUPP) {
                /* We could try FS.BulkStatus next, but this aborts the entire
                 * op if any of the lookups fails - so, for the moment, revert
                 * to FS.FetchStatus for op->file[1].
                afs_begin_vnode_operation(op);
                afs_wait_for_operation(op);
        }
-       inode = ERR_PTR(op->error);
+       inode = ERR_PTR(afs_op_error(op));
 
 out_op:
-       if (op->error == 0) {
+       if (!afs_op_error(op)) {
                inode = &op->file[1].vnode->netfs.inode;
                op->file[1].vnode = NULL;
        }
 
        _enter("");
 
-       ASSERTCMP(op->error, ==, 0);
+       ASSERTCMP(afs_op_error(op), ==, 0);
 
        inode = afs_iget(op, vp);
        if (IS_ERR(inode)) {
 
        vnode = AFS_FS_I(inode);
        set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
-       if (!op->error)
+       if (!afs_op_error(op))
                afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb);
        d_instantiate(op->dentry, inode);
 }
 {
        _enter("op=%08x", op->debug_id);
 
-       if (op->error)
+       if (afs_op_error(op))
                d_drop(op->dentry);
 }
 
        struct dentry *dentry = op->dentry;
        int ret;
 
-       if (op->error != 0 ||
+       if (afs_op_error(op) ||
            (op->file[1].scb.have_status && op->file[1].scb.have_error))
                return;
        if (d_really_is_positive(dentry))
 
                ret = afs_validate(vnode, op->key);
                if (ret != -ESTALE)
-                       op->error = ret;
+                       afs_op_set_error(op, ret);
        }
 
-       _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, op->error);
+       _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, afs_op_error(op));
 }
 
 static void afs_unlink_success(struct afs_operation *op)
 static void afs_unlink_put(struct afs_operation *op)
 {
        _enter("op=%08x", op->debug_id);
-       if (op->unlink.need_rehash && op->error < 0 && op->error != -ENOENT)
+       if (op->unlink.need_rehash && afs_op_error(op) < 0 && afs_op_error(op) != -ENOENT)
                d_rehash(op->dentry);
 }
 
        /* Try to make sure we have a callback promise on the victim. */
        ret = afs_validate(vnode, op->key);
        if (ret < 0) {
-               op->error = ret;
+               afs_op_set_error(op, ret);
                goto error;
        }
 
                spin_unlock(&dentry->d_lock);
                /* Start asynchronous writeout of the inode */
                write_inode_now(d_inode(dentry), 0);
-               op->error = afs_sillyrename(dvnode, vnode, dentry, op->key);
+               afs_op_set_error(op, afs_sillyrename(dvnode, vnode, dentry, op->key));
                goto error;
        }
        if (!d_unhashed(dentry)) {
        /* If there was a conflict with a third party, check the status of the
         * unlinked vnode.
         */
-       if (op->error == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) {
+       if (afs_op_error(op) == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) {
                op->file[1].update_ctime = false;
                op->fetch_status.which = 1;
                op->ops = &afs_fetch_status_operation;
 static void afs_link_put(struct afs_operation *op)
 {
        _enter("op=%08x", op->debug_id);
-       if (op->error)
+       if (afs_op_error(op))
                d_drop(op->dentry);
 }
 
        if (op->rename.rehash)
                d_rehash(op->rename.rehash);
        dput(op->rename.tmp);
-       if (op->error)
+       if (afs_op_error(op))
                d_rehash(op->dentry);
 }
 
                return PTR_ERR(op);
 
        ret = afs_validate(vnode, op->key);
-       op->error = ret;
+       afs_op_set_error(op, ret);
        if (ret < 0)
                goto error;
 
                        op->rename.tmp = d_alloc(new_dentry->d_parent,
                                                 &new_dentry->d_name);
                        if (!op->rename.tmp) {
-                               op->error = -ENOMEM;
+                               afs_op_nomem(op);
                                goto error;
                        }
 
                                              AFS_FS_I(d_inode(new_dentry)),
                                              new_dentry, op->key);
                        if (ret) {
-                               op->error = ret;
+                               afs_op_set_error(op, ret);
                                goto error;
                        }
 
 
 {
        struct afs_read *req = op->fetch.req;
        struct netfs_io_subrequest *subreq = req->subreq;
-       int error = op->error;
+       int error = afs_op_error(op);
 
        if (error == -ECONNABORTED)
                error = afs_abort_to_error(op->ac.abort_code);
 
 static void afs_fetch_data_put(struct afs_operation *op)
 {
-       op->fetch.req->error = op->error;
+       op->fetch.req->error = afs_op_error(op);
        afs_put_read(op->fetch.req);
 }
 
 
        op->net         = volume->cell->net;
        op->cb_v_break  = volume->cb_v_break;
        op->debug_id    = atomic_inc_return(&afs_operation_debug_counter);
-       op->error       = -EDESTADDRREQ;
        op->nr_iterations = -1;
+       afs_op_set_error(op, -EDESTADDRREQ);
 
        _leave(" = [op=%08x]", op->debug_id);
        return op;
                swap(vnode, vnode2);
 
        if (mutex_lock_interruptible(&vnode->io_lock) < 0) {
-               op->error = -ERESTARTSYS;
+               afs_op_set_error(op, -ERESTARTSYS);
                op->flags |= AFS_OPERATION_STOP;
                _leave(" = f [I 0]");
                return false;
 
        if (vnode2) {
                if (mutex_lock_interruptible_nested(&vnode2->io_lock, 1) < 0) {
-                       op->error = -ERESTARTSYS;
+                       afs_op_set_error(op, -ERESTARTSYS);
                        op->flags |= AFS_OPERATION_STOP;
                        mutex_unlock(&vnode->io_lock);
                        op->flags &= ~AFS_OPERATION_LOCK_0;
 {
        _enter("");
 
-       if (op->error == -EDESTADDRREQ ||
-           op->error == -EADDRNOTAVAIL ||
-           op->error == -ENETUNREACH ||
-           op->error == -EHOSTUNREACH)
+       switch (afs_op_error(op)) {
+       case -EDESTADDRREQ:
+       case -EADDRNOTAVAIL:
+       case -ENETUNREACH:
+       case -EHOSTUNREACH:
                afs_dump_edestaddrreq(op);
+               break;
+       }
 
        afs_drop_io_locks(op);
 
 
        afs_end_vnode_operation(op);
 
-       if (op->error == 0 && op->ops->edit_dir) {
+       if (!afs_op_error(op) && op->ops->edit_dir) {
                _debug("edit_dir");
                op->ops->edit_dir(op);
        }
  */
 int afs_put_operation(struct afs_operation *op)
 {
-       int i, ret = op->error;
+       int i, ret = afs_op_error(op);
 
        _enter("op=%08x,%d", op->debug_id, ret);
 
 
        int i;
 
        if (test_bit(AFS_SERVER_FL_NO_IBULK, &op->server->flags)) {
-               op->error = -ENOTSUPP;
+               afs_op_set_error(op, -ENOTSUPP);
                return;
        }
 
 
 
        if (vnode->netfs.inode.i_state & I_NEW) {
                ret = afs_inode_init_from_status(op, vp, vnode);
-               op->error = ret;
+               afs_op_set_error(op, ret);
                if (ret == 0)
                        afs_cache_permit(vnode, op->key, vp->cb_break_before, &vp->scb);
        } else {
 
 extern void afs_wait_for_operation(struct afs_operation *);
 extern int afs_do_sync_operation(struct afs_operation *);
 
-static inline void afs_op_nomem(struct afs_operation *op)
-{
-       op->error = -ENOMEM;
-}
-
 static inline void afs_op_set_vnode(struct afs_operation *op, unsigned int n,
                                    struct afs_vnode *vnode)
 {
 extern int afs_abort_to_error(u32);
 extern void afs_prioritise_error(struct afs_error *, int, u32);
 
+static inline void afs_op_nomem(struct afs_operation *op)
+{
+       op->error = -ENOMEM;
+}
+
+static inline int afs_op_error(const struct afs_operation *op)
+{
+       return op->error;
+}
+
+static inline int afs_op_set_error(struct afs_operation *op, int error)
+{
+       return op->error = error;
+}
+
 /*
  * mntpt.c
  */
 
                 * and have to return an error.
                 */
                if (op->flags & AFS_OPERATION_CUR_ONLY) {
-                       op->error = -ESTALE;
+                       afs_op_set_error(op, -ESTALE);
                        return false;
                }
 
        if (!(op->flags & AFS_OPERATION_UNINTR)) {
                msleep_interruptible(1000);
                if (signal_pending(current)) {
-                       op->error = -ERESTARTSYS;
+                       afs_op_set_error(op, -ERESTARTSYS);
                        return false;
                }
        } else {
        case 0:
        default:
                /* Success or local failure.  Stop. */
-               op->error = error;
+               afs_op_set_error(op, error);
                op->flags |= AFS_OPERATION_STOP;
                _leave(" = f [okay/local %d]", error);
                return false;
 
                        set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
                        error = afs_check_volume_status(op->volume, op);
-                       if (error < 0)
-                               goto failed_set_error;
+                       if (error < 0) {
+                               afs_op_set_error(op, error);
+                               goto failed;
+                       }
 
                        if (test_bit(AFS_VOLUME_DELETED, &op->volume->flags)) {
-                               op->error = -ENOMEDIUM;
+                               afs_op_set_error(op, -ENOMEDIUM);
                                goto failed;
                        }
 
                                clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
                        }
                        if (op->flags & AFS_OPERATION_NO_VSLEEP) {
-                               op->error = -EADV;
+                               afs_op_set_error(op, -EADV);
                                goto failed;
                        }
                        if (op->flags & AFS_OPERATION_CUR_ONLY) {
-                               op->error = -ESTALE;
+                               afs_op_set_error(op, -ESTALE);
                                goto failed;
                        }
                        goto busy;
                         * lock we need to maintain.
                         */
                        if (op->flags & AFS_OPERATION_NO_VSLEEP) {
-                               op->error = -EBUSY;
+                               afs_op_set_error(op, -EBUSY);
                                goto failed;
                        }
                        if (!test_and_set_bit(AFS_VOLUME_BUSY, &op->volume->flags)) {
                         * honour, just in case someone sets up a loop.
                         */
                        if (op->flags & AFS_OPERATION_VMOVED) {
-                               op->error = -EREMOTEIO;
+                               afs_op_set_error(op, -EREMOTEIO);
                                goto failed;
                        }
                        op->flags |= AFS_OPERATION_VMOVED;
                        set_bit(AFS_VOLUME_WAIT, &op->volume->flags);
                        set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
                        error = afs_check_volume_status(op->volume, op);
-                       if (error < 0)
-                               goto failed_set_error;
+                       if (error < 0) {
+                               afs_op_set_error(op, error);
+                               goto failed;
+                       }
 
                        /* If the server list didn't change, then the VLDB is
                         * out of sync with the fileservers.  This is hopefully
                         * Translate locally and return ENOSPC.
                         * No replicas to failover to.
                         */
-                       op->error = -ENOSPC;
+                       afs_op_set_error(op, -ENOSPC);
                        goto failed_but_online;
 
                case VOVERQUOTA:
                         * Translate locally and return EDQUOT.
                         * No replicas to failover to.
                         */
-                       op->error = -EDQUOT;
+                       afs_op_set_error(op, -EDQUOT);
                        goto failed_but_online;
 
                default:
 
        case -ETIMEDOUT:
        case -ETIME:
-               if (op->error != -EDESTADDRREQ)
+               if (afs_op_error(op) != -EDESTADDRREQ)
                        goto iterate_address;
                fallthrough;
        case -ERFKILL:
                fallthrough;
        case -ECONNRESET:
                _debug("call reset");
-               op->error = error;
+               afs_op_set_error(op, error);
                goto failed;
        }
 
         * volume may have moved or even have been deleted.
         */
        error = afs_check_volume_status(op->volume, op);
-       if (error < 0)
-               goto failed_set_error;
+       if (error < 0) {
+               afs_op_set_error(op, error);
+               goto failed;
+       }
 
        if (!afs_start_fs_iteration(op, vnode))
                goto failed;
        _debug("pick [%lx]", op->untried);
 
        error = afs_wait_for_fs_probes(op->server_list, op->untried);
-       if (error < 0)
-               goto failed_set_error;
+       if (error < 0) {
+               afs_op_set_error(op, error);
+               goto failed;
+       }
 
        /* Pick the untried server with the lowest RTT.  If we have outstanding
         * callbacks, we stick with the server we're already using if we can.
                        op->flags &= ~AFS_OPERATION_RETRY_SERVER;
                        goto retry_server;
                case -ERESTARTSYS:
-                       goto failed_set_error;
+                       afs_op_set_error(op, error);
+                       goto failed;
                case -ETIME:
                case -EDESTADDRREQ:
                        goto next_server;
        }
 
        error = e.error;
-
-failed_set_error:
        op->error = error;
 failed:
        op->flags |= AFS_OPERATION_STOP;
        afs_end_cursor(&op->ac);
-       _leave(" = f [failed %d]", op->error);
+       _leave(" = f [failed %d]", afs_op_error(op));
        return false;
 }
 
 
                        _leave(" = t [intr]");
                        return true;
                }
-               op->error = PTR_ERR(alist);
-               _leave(" = f [%d]", op->error);
+               afs_op_set_error(op, PTR_ERR(alist));
+               _leave(" = f [%d]", afs_op_error(op));
                return false;
        }
 
                          (op->flags & AFS_OPERATION_UNINTR) ?
                          TASK_UNINTERRUPTIBLE : TASK_INTERRUPTIBLE);
        if (ret == -ERESTARTSYS) {
-               op->error = ret;
+               afs_op_set_error(op, ret);
                _leave(" = f [intr]");
                return false;
        }
 
 
        op->ctime = op->file[0].scb.status.mtime_client;
        afs_vnode_commit_status(op, &op->file[0]);
-       if (op->error == 0) {
+       if (!afs_op_error(op)) {
                if (!op->store.laundering)
                        afs_pages_written_back(vnode, op->store.pos, op->store.size);
                afs_stat_v(vnode, n_stores);
 
        afs_wait_for_operation(op);
 
-       switch (op->error) {
+       switch (afs_op_error(op)) {
        case -EACCES:
        case -EPERM:
        case -ENOKEY:
        }
 
        afs_put_wb_key(wbk);
-       _leave(" = %d", op->error);
+       _leave(" = %d", afs_op_error(op));
        return afs_put_operation(op);
 }