linux/fs/fscache/operation.c
<<
>>
Prefs
   1/* FS-Cache worker operation management routines
   2 *
   3 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the License, or (at your option) any later version.
  10 *
  11 * See Documentation/filesystems/caching/operations.txt
  12 */
  13
  14#define FSCACHE_DEBUG_LEVEL OPERATION
  15#include <linux/module.h>
  16#include <linux/seq_file.h>
  17#include <linux/slab.h>
  18#include "internal.h"
  19
  20atomic_t fscache_op_debug_id;
  21EXPORT_SYMBOL(fscache_op_debug_id);
  22
  23static void fscache_operation_dummy_cancel(struct fscache_operation *op)
  24{
  25}
  26
  27/**
  28 * fscache_operation_init - Do basic initialisation of an operation
  29 * @op: The operation to initialise
  30 * @release: The release function to assign
  31 *
  32 * Do basic initialisation of an operation.  The caller must still set flags,
  33 * object and processor if needed.
  34 */
  35void fscache_operation_init(struct fscache_cookie *cookie,
  36                            struct fscache_operation *op,
  37                            fscache_operation_processor_t processor,
  38                            fscache_operation_cancel_t cancel,
  39                            fscache_operation_release_t release)
  40{
  41        INIT_WORK(&op->work, fscache_op_work_func);
  42        atomic_set(&op->usage, 1);
  43        op->state = FSCACHE_OP_ST_INITIALISED;
  44        op->debug_id = atomic_inc_return(&fscache_op_debug_id);
  45        op->processor = processor;
  46        op->cancel = cancel ?: fscache_operation_dummy_cancel;
  47        op->release = release;
  48        INIT_LIST_HEAD(&op->pend_link);
  49        fscache_stat(&fscache_n_op_initialised);
  50        trace_fscache_op(cookie, op, fscache_op_init);
  51}
  52EXPORT_SYMBOL(fscache_operation_init);
  53
  54/**
  55 * fscache_enqueue_operation - Enqueue an operation for processing
  56 * @op: The operation to enqueue
  57 *
  58 * Enqueue an operation for processing by the FS-Cache thread pool.
  59 *
  60 * This will get its own ref on the object.
  61 */
  62void fscache_enqueue_operation(struct fscache_operation *op)
  63{
  64        struct fscache_cookie *cookie = op->object->cookie;
  65        
  66        _enter("{OBJ%x OP%x,%u}",
  67               op->object->debug_id, op->debug_id, atomic_read(&op->usage));
  68
  69        ASSERT(list_empty(&op->pend_link));
  70        ASSERT(op->processor != NULL);
  71        ASSERT(fscache_object_is_available(op->object));
  72        ASSERTCMP(atomic_read(&op->usage), >, 0);
  73        ASSERTCMP(op->state, ==, FSCACHE_OP_ST_IN_PROGRESS);
  74
  75        fscache_stat(&fscache_n_op_enqueue);
  76        switch (op->flags & FSCACHE_OP_TYPE) {
  77        case FSCACHE_OP_ASYNC:
  78                trace_fscache_op(cookie, op, fscache_op_enqueue_async);
  79                _debug("queue async");
  80                atomic_inc(&op->usage);
  81                if (!queue_work(fscache_op_wq, &op->work))
  82                        fscache_put_operation(op);
  83                break;
  84        case FSCACHE_OP_MYTHREAD:
  85                trace_fscache_op(cookie, op, fscache_op_enqueue_mythread);
  86                _debug("queue for caller's attention");
  87                break;
  88        default:
  89                pr_err("Unexpected op type %lx", op->flags);
  90                BUG();
  91                break;
  92        }
  93}
  94EXPORT_SYMBOL(fscache_enqueue_operation);
  95
  96/*
  97 * start an op running
  98 */
  99static void fscache_run_op(struct fscache_object *object,
 100                           struct fscache_operation *op)
 101{
 102        ASSERTCMP(op->state, ==, FSCACHE_OP_ST_PENDING);
 103
 104        op->state = FSCACHE_OP_ST_IN_PROGRESS;
 105        object->n_in_progress++;
 106        if (test_and_clear_bit(FSCACHE_OP_WAITING, &op->flags))
 107                wake_up_bit(&op->flags, FSCACHE_OP_WAITING);
 108        if (op->processor)
 109                fscache_enqueue_operation(op);
 110        else
 111                trace_fscache_op(object->cookie, op, fscache_op_run);
 112        fscache_stat(&fscache_n_op_run);
 113}
 114
 115/*
 116 * report an unexpected submission
 117 */
 118static void fscache_report_unexpected_submission(struct fscache_object *object,
 119                                                 struct fscache_operation *op,
 120                                                 const struct fscache_state *ostate)
 121{
 122        static bool once_only;
 123        struct fscache_operation *p;
 124        unsigned n;
 125
 126        if (once_only)
 127                return;
 128        once_only = true;
 129
 130        kdebug("unexpected submission OP%x [OBJ%x %s]",
 131               op->debug_id, object->debug_id, object->state->name);
 132        kdebug("objstate=%s [%s]", object->state->name, ostate->name);
 133        kdebug("objflags=%lx", object->flags);
 134        kdebug("objevent=%lx [%lx]", object->events, object->event_mask);
 135        kdebug("ops=%u inp=%u exc=%u",
 136               object->n_ops, object->n_in_progress, object->n_exclusive);
 137
 138        if (!list_empty(&object->pending_ops)) {
 139                n = 0;
 140                list_for_each_entry(p, &object->pending_ops, pend_link) {
 141                        ASSERTCMP(p->object, ==, object);
 142                        kdebug("%p %p", op->processor, op->release);
 143                        n++;
 144                }
 145
 146                kdebug("n=%u", n);
 147        }
 148
 149        dump_stack();
 150}
 151
 152/*
 153 * submit an exclusive operation for an object
 154 * - other ops are excluded from running simultaneously with this one
 155 * - this gets any extra refs it needs on an op
 156 */
 157int fscache_submit_exclusive_op(struct fscache_object *object,
 158                                struct fscache_operation *op)
 159{
 160        const struct fscache_state *ostate;
 161        unsigned long flags;
 162        int ret;
 163
 164        _enter("{OBJ%x OP%x},", object->debug_id, op->debug_id);
 165
 166        trace_fscache_op(object->cookie, op, fscache_op_submit_ex);
 167
 168        ASSERTCMP(op->state, ==, FSCACHE_OP_ST_INITIALISED);
 169        ASSERTCMP(atomic_read(&op->usage), >, 0);
 170
 171        spin_lock(&object->lock);
 172        ASSERTCMP(object->n_ops, >=, object->n_in_progress);
 173        ASSERTCMP(object->n_ops, >=, object->n_exclusive);
 174        ASSERT(list_empty(&op->pend_link));
 175
 176        ostate = object->state;
 177        smp_rmb();
 178
 179        op->state = FSCACHE_OP_ST_PENDING;
 180        flags = READ_ONCE(object->flags);
 181        if (unlikely(!(flags & BIT(FSCACHE_OBJECT_IS_LIVE)))) {
 182                fscache_stat(&fscache_n_op_rejected);
 183                op->cancel(op);
 184                op->state = FSCACHE_OP_ST_CANCELLED;
 185                ret = -ENOBUFS;
 186        } else if (unlikely(fscache_cache_is_broken(object))) {
 187                op->cancel(op);
 188                op->state = FSCACHE_OP_ST_CANCELLED;
 189                ret = -EIO;
 190        } else if (flags & BIT(FSCACHE_OBJECT_IS_AVAILABLE)) {
 191                op->object = object;
 192                object->n_ops++;
 193                object->n_exclusive++;  /* reads and writes must wait */
 194
 195                if (object->n_in_progress > 0) {
 196                        atomic_inc(&op->usage);
 197                        list_add_tail(&op->pend_link, &object->pending_ops);
 198                        fscache_stat(&fscache_n_op_pend);
 199                } else if (!list_empty(&object->pending_ops)) {
 200                        atomic_inc(&op->usage);
 201                        list_add_tail(&op->pend_link, &object->pending_ops);
 202                        fscache_stat(&fscache_n_op_pend);
 203                        fscache_start_operations(object);
 204                } else {
 205                        ASSERTCMP(object->n_in_progress, ==, 0);
 206                        fscache_run_op(object, op);
 207                }
 208
 209                /* need to issue a new write op after this */
 210                clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags);
 211                ret = 0;
 212        } else if (flags & BIT(FSCACHE_OBJECT_IS_LOOKED_UP)) {
 213                op->object = object;
 214                object->n_ops++;
 215                object->n_exclusive++;  /* reads and writes must wait */
 216                atomic_inc(&op->usage);
 217                list_add_tail(&op->pend_link, &object->pending_ops);
 218                fscache_stat(&fscache_n_op_pend);
 219                ret = 0;
 220        } else if (flags & BIT(FSCACHE_OBJECT_KILLED_BY_CACHE)) {
 221                op->cancel(op);
 222                op->state = FSCACHE_OP_ST_CANCELLED;
 223                ret = -ENOBUFS;
 224        } else {
 225                fscache_report_unexpected_submission(object, op, ostate);
 226                op->cancel(op);
 227                op->state = FSCACHE_OP_ST_CANCELLED;
 228                ret = -ENOBUFS;
 229        }
 230
 231        spin_unlock(&object->lock);
 232        return ret;
 233}
 234
 235/*
 236 * submit an operation for an object
 237 * - objects may be submitted only in the following states:
 238 *   - during object creation (write ops may be submitted)
 239 *   - whilst the object is active
 240 *   - after an I/O error incurred in one of the two above states (op rejected)
 241 * - this gets any extra refs it needs on an op
 242 */
 243int fscache_submit_op(struct fscache_object *object,
 244                      struct fscache_operation *op)
 245{
 246        const struct fscache_state *ostate;
 247        unsigned long flags;
 248        int ret;
 249
 250        _enter("{OBJ%x OP%x},{%u}",
 251               object->debug_id, op->debug_id, atomic_read(&op->usage));
 252
 253        trace_fscache_op(object->cookie, op, fscache_op_submit);
 254
 255        ASSERTCMP(op->state, ==, FSCACHE_OP_ST_INITIALISED);
 256        ASSERTCMP(atomic_read(&op->usage), >, 0);
 257
 258        spin_lock(&object->lock);
 259        ASSERTCMP(object->n_ops, >=, object->n_in_progress);
 260        ASSERTCMP(object->n_ops, >=, object->n_exclusive);
 261        ASSERT(list_empty(&op->pend_link));
 262
 263        ostate = object->state;
 264        smp_rmb();
 265
 266        op->state = FSCACHE_OP_ST_PENDING;
 267        flags = READ_ONCE(object->flags);
 268        if (unlikely(!(flags & BIT(FSCACHE_OBJECT_IS_LIVE)))) {
 269                fscache_stat(&fscache_n_op_rejected);
 270                op->cancel(op);
 271                op->state = FSCACHE_OP_ST_CANCELLED;
 272                ret = -ENOBUFS;
 273        } else if (unlikely(fscache_cache_is_broken(object))) {
 274                op->cancel(op);
 275                op->state = FSCACHE_OP_ST_CANCELLED;
 276                ret = -EIO;
 277        } else if (flags & BIT(FSCACHE_OBJECT_IS_AVAILABLE)) {
 278                op->object = object;
 279                object->n_ops++;
 280
 281                if (object->n_exclusive > 0) {
 282                        atomic_inc(&op->usage);
 283                        list_add_tail(&op->pend_link, &object->pending_ops);
 284                        fscache_stat(&fscache_n_op_pend);
 285                } else if (!list_empty(&object->pending_ops)) {
 286                        atomic_inc(&op->usage);
 287                        list_add_tail(&op->pend_link, &object->pending_ops);
 288                        fscache_stat(&fscache_n_op_pend);
 289                        fscache_start_operations(object);
 290                } else {
 291                        ASSERTCMP(object->n_exclusive, ==, 0);
 292                        fscache_run_op(object, op);
 293                }
 294                ret = 0;
 295        } else if (flags & BIT(FSCACHE_OBJECT_IS_LOOKED_UP)) {
 296                op->object = object;
 297                object->n_ops++;
 298                atomic_inc(&op->usage);
 299                list_add_tail(&op->pend_link, &object->pending_ops);
 300                fscache_stat(&fscache_n_op_pend);
 301                ret = 0;
 302        } else if (flags & BIT(FSCACHE_OBJECT_KILLED_BY_CACHE)) {
 303                op->cancel(op);
 304                op->state = FSCACHE_OP_ST_CANCELLED;
 305                ret = -ENOBUFS;
 306        } else {
 307                fscache_report_unexpected_submission(object, op, ostate);
 308                ASSERT(!fscache_object_is_active(object));
 309                op->cancel(op);
 310                op->state = FSCACHE_OP_ST_CANCELLED;
 311                ret = -ENOBUFS;
 312        }
 313
 314        spin_unlock(&object->lock);
 315        return ret;
 316}
 317
 318/*
 319 * queue an object for withdrawal on error, aborting all following asynchronous
 320 * operations
 321 */
 322void fscache_abort_object(struct fscache_object *object)
 323{
 324        _enter("{OBJ%x}", object->debug_id);
 325
 326        fscache_raise_event(object, FSCACHE_OBJECT_EV_ERROR);
 327}
 328
 329/*
 330 * Jump start the operation processing on an object.  The caller must hold
 331 * object->lock.
 332 */
 333void fscache_start_operations(struct fscache_object *object)
 334{
 335        struct fscache_operation *op;
 336        bool stop = false;
 337
 338        while (!list_empty(&object->pending_ops) && !stop) {
 339                op = list_entry(object->pending_ops.next,
 340                                struct fscache_operation, pend_link);
 341
 342                if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags)) {
 343                        if (object->n_in_progress > 0)
 344                                break;
 345                        stop = true;
 346                }
 347                list_del_init(&op->pend_link);
 348                fscache_run_op(object, op);
 349
 350                /* the pending queue was holding a ref on the object */
 351                fscache_put_operation(op);
 352        }
 353
 354        ASSERTCMP(object->n_in_progress, <=, object->n_ops);
 355
 356        _debug("woke %d ops on OBJ%x",
 357               object->n_in_progress, object->debug_id);
 358}
 359
 360/*
 361 * cancel an operation that's pending on an object
 362 */
 363int fscache_cancel_op(struct fscache_operation *op,
 364                      bool cancel_in_progress_op)
 365{
 366        struct fscache_object *object = op->object;
 367        bool put = false;
 368        int ret;
 369
 370        _enter("OBJ%x OP%x}", op->object->debug_id, op->debug_id);
 371
 372        trace_fscache_op(object->cookie, op, fscache_op_cancel);
 373
 374        ASSERTCMP(op->state, >=, FSCACHE_OP_ST_PENDING);
 375        ASSERTCMP(op->state, !=, FSCACHE_OP_ST_CANCELLED);
 376        ASSERTCMP(atomic_read(&op->usage), >, 0);
 377
 378        spin_lock(&object->lock);
 379
 380        ret = -EBUSY;
 381        if (op->state == FSCACHE_OP_ST_PENDING) {
 382                ASSERT(!list_empty(&op->pend_link));
 383                list_del_init(&op->pend_link);
 384                put = true;
 385
 386                fscache_stat(&fscache_n_op_cancelled);
 387                op->cancel(op);
 388                op->state = FSCACHE_OP_ST_CANCELLED;
 389                if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
 390                        object->n_exclusive--;
 391                if (test_and_clear_bit(FSCACHE_OP_WAITING, &op->flags))
 392                        wake_up_bit(&op->flags, FSCACHE_OP_WAITING);
 393                ret = 0;
 394        } else if (op->state == FSCACHE_OP_ST_IN_PROGRESS && cancel_in_progress_op) {
 395                ASSERTCMP(object->n_in_progress, >, 0);
 396                if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
 397                        object->n_exclusive--;
 398                object->n_in_progress--;
 399                if (object->n_in_progress == 0)
 400                        fscache_start_operations(object);
 401
 402                fscache_stat(&fscache_n_op_cancelled);
 403                op->cancel(op);
 404                op->state = FSCACHE_OP_ST_CANCELLED;
 405                if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
 406                        object->n_exclusive--;
 407                if (test_and_clear_bit(FSCACHE_OP_WAITING, &op->flags))
 408                        wake_up_bit(&op->flags, FSCACHE_OP_WAITING);
 409                ret = 0;
 410        }
 411
 412        if (put)
 413                fscache_put_operation(op);
 414        spin_unlock(&object->lock);
 415        _leave(" = %d", ret);
 416        return ret;
 417}
 418
 419/*
 420 * Cancel all pending operations on an object
 421 */
 422void fscache_cancel_all_ops(struct fscache_object *object)
 423{
 424        struct fscache_operation *op;
 425
 426        _enter("OBJ%x", object->debug_id);
 427
 428        spin_lock(&object->lock);
 429
 430        while (!list_empty(&object->pending_ops)) {
 431                op = list_entry(object->pending_ops.next,
 432                                struct fscache_operation, pend_link);
 433                fscache_stat(&fscache_n_op_cancelled);
 434                list_del_init(&op->pend_link);
 435
 436                trace_fscache_op(object->cookie, op, fscache_op_cancel_all);
 437
 438                ASSERTCMP(op->state, ==, FSCACHE_OP_ST_PENDING);
 439                op->cancel(op);
 440                op->state = FSCACHE_OP_ST_CANCELLED;
 441
 442                if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
 443                        object->n_exclusive--;
 444                if (test_and_clear_bit(FSCACHE_OP_WAITING, &op->flags))
 445                        wake_up_bit(&op->flags, FSCACHE_OP_WAITING);
 446                fscache_put_operation(op);
 447                cond_resched_lock(&object->lock);
 448        }
 449
 450        spin_unlock(&object->lock);
 451        _leave("");
 452}
 453
 454/*
 455 * Record the completion or cancellation of an in-progress operation.
 456 */
 457void fscache_op_complete(struct fscache_operation *op, bool cancelled)
 458{
 459        struct fscache_object *object = op->object;
 460
 461        _enter("OBJ%x", object->debug_id);
 462
 463        ASSERTCMP(op->state, ==, FSCACHE_OP_ST_IN_PROGRESS);
 464        ASSERTCMP(object->n_in_progress, >, 0);
 465        ASSERTIFCMP(test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags),
 466                    object->n_exclusive, >, 0);
 467        ASSERTIFCMP(test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags),
 468                    object->n_in_progress, ==, 1);
 469
 470        spin_lock(&object->lock);
 471
 472        if (!cancelled) {
 473                trace_fscache_op(object->cookie, op, fscache_op_completed);
 474                op->state = FSCACHE_OP_ST_COMPLETE;
 475        } else {
 476                op->cancel(op);
 477                trace_fscache_op(object->cookie, op, fscache_op_cancelled);
 478                op->state = FSCACHE_OP_ST_CANCELLED;
 479        }
 480
 481        if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
 482                object->n_exclusive--;
 483        object->n_in_progress--;
 484        if (object->n_in_progress == 0)
 485                fscache_start_operations(object);
 486
 487        spin_unlock(&object->lock);
 488        _leave("");
 489}
 490EXPORT_SYMBOL(fscache_op_complete);
 491
 492/*
 493 * release an operation
 494 * - queues pending ops if this is the last in-progress op
 495 */
 496void fscache_put_operation(struct fscache_operation *op)
 497{
 498        struct fscache_object *object;
 499        struct fscache_cache *cache;
 500
 501        _enter("{OBJ%x OP%x,%d}",
 502               op->object->debug_id, op->debug_id, atomic_read(&op->usage));
 503
 504        ASSERTCMP(atomic_read(&op->usage), >, 0);
 505
 506        if (!atomic_dec_and_test(&op->usage))
 507                return;
 508
 509        trace_fscache_op(op->object ? op->object->cookie : NULL, op, fscache_op_put);
 510
 511        _debug("PUT OP");
 512        ASSERTIFCMP(op->state != FSCACHE_OP_ST_INITIALISED &&
 513                    op->state != FSCACHE_OP_ST_COMPLETE,
 514                    op->state, ==, FSCACHE_OP_ST_CANCELLED);
 515
 516        fscache_stat(&fscache_n_op_release);
 517
 518        if (op->release) {
 519                op->release(op);
 520                op->release = NULL;
 521        }
 522        op->state = FSCACHE_OP_ST_DEAD;
 523
 524        object = op->object;
 525        if (likely(object)) {
 526                if (test_bit(FSCACHE_OP_DEC_READ_CNT, &op->flags))
 527                        atomic_dec(&object->n_reads);
 528                if (test_bit(FSCACHE_OP_UNUSE_COOKIE, &op->flags))
 529                        fscache_unuse_cookie(object);
 530
 531                /* now... we may get called with the object spinlock held, so we
 532                 * complete the cleanup here only if we can immediately acquire the
 533                 * lock, and defer it otherwise */
 534                if (!spin_trylock(&object->lock)) {
 535                        _debug("defer put");
 536                        fscache_stat(&fscache_n_op_deferred_release);
 537
 538                        cache = object->cache;
 539                        spin_lock(&cache->op_gc_list_lock);
 540                        list_add_tail(&op->pend_link, &cache->op_gc_list);
 541                        spin_unlock(&cache->op_gc_list_lock);
 542                        schedule_work(&cache->op_gc);
 543                        _leave(" [defer]");
 544                        return;
 545                }
 546
 547                ASSERTCMP(object->n_ops, >, 0);
 548                object->n_ops--;
 549                if (object->n_ops == 0)
 550                        fscache_raise_event(object, FSCACHE_OBJECT_EV_CLEARED);
 551
 552                spin_unlock(&object->lock);
 553        }
 554
 555        kfree(op);
 556        _leave(" [done]");
 557}
 558EXPORT_SYMBOL(fscache_put_operation);
 559
 560/*
 561 * garbage collect operations that have had their release deferred
 562 */
 563void fscache_operation_gc(struct work_struct *work)
 564{
 565        struct fscache_operation *op;
 566        struct fscache_object *object;
 567        struct fscache_cache *cache =
 568                container_of(work, struct fscache_cache, op_gc);
 569        int count = 0;
 570
 571        _enter("");
 572
 573        do {
 574                spin_lock(&cache->op_gc_list_lock);
 575                if (list_empty(&cache->op_gc_list)) {
 576                        spin_unlock(&cache->op_gc_list_lock);
 577                        break;
 578                }
 579
 580                op = list_entry(cache->op_gc_list.next,
 581                                struct fscache_operation, pend_link);
 582                list_del(&op->pend_link);
 583                spin_unlock(&cache->op_gc_list_lock);
 584
 585                object = op->object;
 586                trace_fscache_op(object->cookie, op, fscache_op_gc);
 587
 588                spin_lock(&object->lock);
 589
 590                _debug("GC DEFERRED REL OBJ%x OP%x",
 591                       object->debug_id, op->debug_id);
 592                fscache_stat(&fscache_n_op_gc);
 593
 594                ASSERTCMP(atomic_read(&op->usage), ==, 0);
 595                ASSERTCMP(op->state, ==, FSCACHE_OP_ST_DEAD);
 596
 597                ASSERTCMP(object->n_ops, >, 0);
 598                object->n_ops--;
 599                if (object->n_ops == 0)
 600                        fscache_raise_event(object, FSCACHE_OBJECT_EV_CLEARED);
 601
 602                spin_unlock(&object->lock);
 603                kfree(op);
 604
 605        } while (count++ < 20);
 606
 607        if (!list_empty(&cache->op_gc_list))
 608                schedule_work(&cache->op_gc);
 609
 610        _leave("");
 611}
 612
 613/*
 614 * execute an operation using fs_op_wq to provide processing context -
 615 * the caller holds a ref to this object, so we don't need to hold one
 616 */
 617void fscache_op_work_func(struct work_struct *work)
 618{
 619        struct fscache_operation *op =
 620                container_of(work, struct fscache_operation, work);
 621        unsigned long start;
 622
 623        _enter("{OBJ%x OP%x,%d}",
 624               op->object->debug_id, op->debug_id, atomic_read(&op->usage));
 625
 626        trace_fscache_op(op->object->cookie, op, fscache_op_work);
 627
 628        ASSERT(op->processor != NULL);
 629        start = jiffies;
 630        op->processor(op);
 631        fscache_hist(fscache_ops_histogram, start);
 632        fscache_put_operation(op);
 633
 634        _leave("");
 635}
 636