%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/src/blksnap-6.3.0.73/
Upload File :
Create Path :
Current File : //usr/src/blksnap-6.3.0.73/diff_io.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __BLK_SNAP_DIFF_IO_H
#define __BLK_SNAP_DIFF_IO_H

#include <linux/workqueue.h>
#include <linux/completion.h>
#ifdef STANDALONE_BDEVFILTER
#include "log_histogram.h"
#endif
struct diff_buffer;

/**
 * struct diff_region - Describes the location of the chunks data on
 *	difference storage.
 * @bdev:
 *	The target block device.
 * @sector:
 *	The sector offset of the region's first sector.
 * @count:
 *	The count of sectors in the region.
 */
struct diff_region {
	struct block_device *bdev;
	sector_t sector;
	sector_t count;
};

/**
 * struct diff_io_sync - Structure for notification about completion of
 *	synchronous I/O.
 * @completion:
 *	Indicates that the request has been processed.
 *
 * Allows to wait for completion of the I/O operation in the
 * current thread.
 */
struct diff_io_sync {
	struct completion completion;
};

/**
 * struct diff_io_async - Structure for notification about completion of
 *	asynchronous I/O.
 * @work:
 *	The &struct work_struct allows to schedule execution of an I/O operation
 *	in a separate process.
 * @notify_cb:
 *	A pointer to the callback function that will be executed when
 *	the I/O execution is completed.
 * @ctx:
 *	The context for the callback function &notify_cb.
 *
 * Allows to schedule execution of an I/O operation.
 */
struct diff_io_async {
	struct work_struct work;
	void (*notify_cb)(void *ctx);
	void *ctx;
};

/**
 * struct diff_io - Structure for I/O maintenance.
 * @error:
 *	Zero if the I/O operation is successful, or an error code if it fails.
 * @bio_count:
 *	The count of bio in the I/O request.
 * @is_write:
 *	Indicates that a write operation is being performed.
 * @is_sync_io:
 *	Indicates that the operation is being performed synchronously.
 * @notify:
 *	This union may contain the diff_io_sync or diff_io_async structure
 *	for synchronous or asynchronous request.
 *
 * The request to perform an I/O operation is executed for a region of sectors.
 * Such a region may contain several bios. It is necessary to notify about the
 * completion of processing of all bios. The diff_io structure allows to do it.
 */
struct diff_io {
	int error;
	atomic_t bio_count;
	bool is_write;
	bool is_sync_io;
	union {
		struct diff_io_sync sync;
		struct diff_io_async async;
	} notify;
};

int diff_io_init(void);
void diff_io_done(void);

static inline void diff_io_free(struct diff_io *diff_io)
{
	kfree(diff_io);
	if (diff_io)
		memory_object_dec(memory_object_diff_io);
}

struct diff_io *diff_io_new_sync(bool is_write);
static inline struct diff_io *diff_io_new_sync_read(void)
{
	return diff_io_new_sync(false);
};
static inline struct diff_io *diff_io_new_sync_write(void)
{
	return diff_io_new_sync(true);
};

struct diff_io *diff_io_new_async(bool is_write, bool is_nowait,
				  void (*notify_cb)(void *ctx), void *ctx);
static inline struct diff_io *
diff_io_new_async_read(void (*notify_cb)(void *ctx), void *ctx, bool is_nowait)
{
	return diff_io_new_async(false, is_nowait, notify_cb, ctx);
};
static inline struct diff_io *
diff_io_new_async_write(void (*notify_cb)(void *ctx), void *ctx, bool is_nowait)
{
	return diff_io_new_async(true, is_nowait, notify_cb, ctx);
};

int diff_io_do(struct diff_io *diff_io, struct diff_region *diff_region,
#ifdef STANDALONE_BDEVFILTER
	       struct log_histogram *redirect_hg,
#endif
	       struct diff_buffer *diff_buffer, const bool is_nowait);

#ifdef STANDALONE_BDEVFILTER
void diff_io_endio(struct bio *bio);
#endif
#endif /* __BLK_SNAP_DIFF_IO_H */

Zerion Mini Shell 1.0