qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

blockjob_int.h (5195B)


      1 /*
      2  * Declarations for long-running block device operations
      3  *
      4  * Copyright (c) 2011 IBM Corp.
      5  * Copyright (c) 2012 Red Hat, Inc.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23  * THE SOFTWARE.
     24  */
     25 
     26 #ifndef BLOCKJOB_INT_H
     27 #define BLOCKJOB_INT_H
     28 
     29 #include "block/blockjob.h"
     30 #include "block/block.h"
     31 
     32 /**
     33  * BlockJobDriver:
     34  *
     35  * A class type for block job driver.
     36  */
     37 struct BlockJobDriver {
     38     /** Generic JobDriver callbacks and settings */
     39     JobDriver job_driver;
     40 
     41     /*
     42      * I/O API functions. These functions are thread-safe.
     43      *
     44      * See include/block/block-io.h for more information about
     45      * the I/O API.
     46      */
     47 
     48     /*
     49      * Returns whether the job has pending requests for the child or will
     50      * submit new requests before the next pause point. This callback is polled
     51      * in the context of draining a job node after requesting that the job be
     52      * paused, until all activity on the child has stopped.
     53      */
     54     bool (*drained_poll)(BlockJob *job);
     55 
     56     /*
     57      * Global state (GS) API. These functions run under the BQL.
     58      *
     59      * See include/block/block-global-state.h for more information about
     60      * the GS API.
     61      */
     62 
     63     /*
     64      * If the callback is not NULL, it will be invoked before the job is
     65      * resumed in a new AioContext.  This is the place to move any resources
     66      * besides job->blk to the new AioContext.
     67      */
     68     void (*attached_aio_context)(BlockJob *job, AioContext *new_context);
     69 
     70     void (*set_speed)(BlockJob *job, int64_t speed);
     71 };
     72 
     73 /*
     74  * Global state (GS) API. These functions run under the BQL.
     75  *
     76  * See include/block/block-global-state.h for more information about
     77  * the GS API.
     78  */
     79 
     80 /**
     81  * block_job_create:
     82  * @job_id: The id of the newly-created job, or %NULL to have one
     83  * generated automatically.
     84  * @driver: The class object for the newly-created job.
     85  * @txn: The transaction this job belongs to, if any. %NULL otherwise.
     86  * @bs: The block
     87  * @perm, @shared_perm: Permissions to request for @bs
     88  * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
     89  * @flags: Creation flags for the Block Job. See @JobCreateFlags.
     90  * @cb: Completion function for the job.
     91  * @opaque: Opaque pointer value passed to @cb.
     92  * @errp: Error object.
     93  *
     94  * Create a new long-running block device job and return it.  The job
     95  * will call @cb asynchronously when the job completes.  Note that
     96  * @bs may have been closed at the time the @cb it is called.  If
     97  * this is the case, the job may be reported as either cancelled or
     98  * completed.
     99  *
    100  * This function is not part of the public job interface; it should be
    101  * called from a wrapper that is specific to the job type.
    102  */
    103 void *block_job_create(const char *job_id, const BlockJobDriver *driver,
    104                        JobTxn *txn, BlockDriverState *bs, uint64_t perm,
    105                        uint64_t shared_perm, int64_t speed, int flags,
    106                        BlockCompletionFunc *cb, void *opaque, Error **errp);
    107 
    108 /**
    109  * block_job_free:
    110  * Callback to be used for JobDriver.free in all block jobs. Frees block job
    111  * specific resources in @job.
    112  */
    113 void block_job_free(Job *job);
    114 
    115 /**
    116  * block_job_user_resume:
    117  * Callback to be used for JobDriver.user_resume in all block jobs. Resets the
    118  * iostatus when the user resumes @job.
    119  */
    120 void block_job_user_resume(Job *job);
    121 
    122 /*
    123  * I/O API functions. These functions are thread-safe.
    124  *
    125  * See include/block/block-io.h for more information about
    126  * the I/O API.
    127  */
    128 
    129 /**
    130  * block_job_ratelimit_get_delay:
    131  *
    132  * Calculate and return delay for the next request in ns. See the documentation
    133  * of ratelimit_calculate_delay() for details.
    134  */
    135 int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n);
    136 
    137 /**
    138  * block_job_error_action:
    139  * @job: The job to signal an error for.
    140  * @on_err: The error action setting.
    141  * @is_read: Whether the operation was a read.
    142  * @error: The error that was reported.
    143  *
    144  * Report an I/O error for a block job and possibly stop the VM.  Return the
    145  * action that was selected based on @on_err and @error.
    146  */
    147 BlockErrorAction block_job_error_action(BlockJob *job, BlockdevOnError on_err,
    148                                         int is_read, int error);
    149 
    150 #endif