drivers/md/md-bitmap.h

Source file repositories/reference/linux-study-clean/drivers/md/md-bitmap.h

File Facts

System
Linux kernel
Corpus path
drivers/md/md-bitmap.h
Extension
.h
Size
6393 bytes
Lines
199
Domain
Driver Families
Bucket
drivers/md
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct md_bitmap_stats {
	u64		events_cleared;
	int		behind_writes;
	bool		behind_wait;

	unsigned long	missing_pages;
	unsigned long	file_pages;
	unsigned long	sync_size;
	unsigned long	pages;
	struct file	*file;
};

typedef void (md_bitmap_fn)(struct mddev *mddev, sector_t offset,
			    unsigned long sectors);

struct bitmap_operations {
	struct md_submodule_head head;

	bool (*enabled)(void *data, bool flush);
	int (*create)(struct mddev *mddev);
	int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize);

	int (*load)(struct mddev *mddev);
	void (*destroy)(struct mddev *mddev);
	void (*flush)(struct mddev *mddev);
	void (*write_all)(struct mddev *mddev);
	void (*dirty_bits)(struct mddev *mddev, unsigned long s,
			   unsigned long e);
	void (*unplug)(struct mddev *mddev, bool sync);
	void (*daemon_work)(struct mddev *mddev);

	void (*start_behind_write)(struct mddev *mddev);
	void (*end_behind_write)(struct mddev *mddev);
	void (*wait_behind_writes)(struct mddev *mddev);

	md_bitmap_fn *start_write;
	md_bitmap_fn *end_write;
	md_bitmap_fn *start_discard;
	md_bitmap_fn *end_discard;

	sector_t (*skip_sync_blocks)(struct mddev *mddev, sector_t offset);
	bool (*blocks_synced)(struct mddev *mddev, sector_t offset);
	bool (*start_sync)(struct mddev *mddev, sector_t offset,
			   sector_t *blocks, bool degraded);
	void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks);
	void (*cond_end_sync)(struct mddev *mddev, sector_t sector, bool force);
	void (*close_sync)(struct mddev *mddev);

	void (*update_sb)(void *data);
	int (*get_stats)(void *data, struct md_bitmap_stats *stats);

	void (*sync_with_cluster)(struct mddev *mddev,
				  sector_t old_lo, sector_t old_hi,
				  sector_t new_lo, sector_t new_hi);
	void *(*get_from_slot)(struct mddev *mddev, int slot);
	int (*copy_from_slot)(struct mddev *mddev, int slot, sector_t *lo,
			      sector_t *hi, bool clear_bits);
	void (*set_pages)(void *data, unsigned long pages);
	void (*free)(void *data);

	const struct attribute_group **groups;
};

/* the bitmap API */
static inline bool md_bitmap_registered(struct mddev *mddev)
{
	return mddev->bitmap_ops != NULL;
}

static inline bool md_bitmap_enabled(struct mddev *mddev, bool flush)
{
	/* bitmap_ops must be registered before creating bitmap. */
	if (!md_bitmap_registered(mddev))
		return false;

	if (!mddev->bitmap)
		return false;

	return mddev->bitmap_ops->enabled(mddev->bitmap, flush);
}

static inline bool md_bitmap_start_sync(struct mddev *mddev, sector_t offset,
					sector_t *blocks, bool degraded)
{
	/* always resync if no bitmap */
	if (!md_bitmap_enabled(mddev, false)) {
		*blocks = 1024;
		return true;
	}

Annotation

Implementation Notes