/* * dm-snapshot.c * * Copyright (C) 2001-2002 Sistina Software (UK) Limited. * * This file is released under the GPL. */#include <linux/blkdev.h>#include <linux/ctype.h>#include <linux/device-mapper.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/kdev_t.h>#include <linux/list.h>#include <linux/mempool.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/vmalloc.h>#include <linux/log2.h>#include <linux/dm-kcopyd.h>#include"dm-snap.h"#include"dm-bio-list.h"#define DM_MSG_PREFIX"snapshots"/* * The percentage increment we will wake up users at */#define WAKE_UP_PERCENT 5/* * kcopyd priority of snapshot operations */#define SNAPSHOT_COPY_PRIORITY 2/* * Reserve 1MB for each snapshot initially (with minimum of 1 page). */#define SNAPSHOT_PAGES (((1UL << 20) >> PAGE_SHIFT) ? : 1)/* * The size of the mempool used to track chunks in use. */#define MIN_IOS 256static struct workqueue_struct *ksnapd;static voidflush_queued_bios(struct work_struct *work);struct dm_snap_pending_exception {struct dm_snap_exception e;/* * Origin buffers waiting for this to complete are held * in a bio list */struct bio_list origin_bios;struct bio_list snapshot_bios;/* * Short-term queue of pending exceptions prior to submission. */struct list_head list;/* * The primary pending_exception is the one that holds * the r