Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dbda8325 authored by H.J. Thomassen's avatar H.J. Thomassen Committed by Greg Kroah-Hartman
Browse files

Staging: add cowloop driver

Cowloop is a "copy-on-write" pseudo block driver. It can
be stacked on top of a "real" block driver, and catches
all write operations on their way from the file systems
layer above to the real driver below, effectively shielding
the lower driver from those write accesses. The requests are
then diverted to an ordinary file, located somewhere else
(configurable). Later read requests are checked to see whether
they can be serviced by the "real" block driver below, or
must be pulled in from the diverted location. More information
is on the project's website http://www.ATComputing.nl/cowloop/



From: "H.J. Thomassen" <hjt@ATComputing.nl>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fa052e91
Loading
Loading
Loading
Loading
+2897 −0

File added.

Preview size limit exceeded, changes collapsed.

+66 −0
Original line number Diff line number Diff line
/*
** DO NOT MODIFY THESE VALUES (would make old cowfiles unusable)
*/
#define	MAPUNIT		1024		/* blocksize for bit in bitmap       */
#define	MUSHIFT		10		/* bitshift  for bit in bitmap       */
#define	MUMASK		0x3ff		/* bitmask   for bit in bitmap       */

#define	COWMAGIC	0x574f437f	/* byte-swapped '7f C O W'           */
#define	COWDIRTY	0x01
#define	COWPACKED	0x02
#define	COWVERSION	1

struct cowhead
{
	int		magic;		/* identifies a cowfile              */
	short		version;	/* version of cowhead                */
	short		flags;    	/* flags indicating status           */
	unsigned long	mapunit;	/* blocksize per bit in bitmap       */
	unsigned long	mapsize;	/* total size of bitmap (bytes)      */
	unsigned long	doffset;	/* start-offset datablocks in cow    */
	unsigned long	rdoblocks;	/* size of related read-only file    */
	unsigned long	rdofingerprint;	/* fingerprint of read-only file     */
	unsigned long	cowused;	/* number of datablocks used in cow  */
};

#define COWDEVDIR	"/dev/cow/"
#define COWDEVICE	COWDEVDIR "%ld"
#define COWCONTROL	COWDEVDIR "ctl"

#define MAXCOWS		1024
#define COWCTL		(MAXCOWS-1)	/* minor number of /dev/cow/ctl     */

#define COWPROCDIR	"/proc/cow/"
#define COWPROCFILE	COWPROCDIR "%d"

/*
** ioctl related stuff
*/
#define ANYDEV		((unsigned long)-1)

struct cowpair
{
	unsigned char	*rdofile;	/* pathname of the rdofile           */
	unsigned char	*cowfile;	/* pathname of the cowfile           */
	unsigned short	rdoflen;	/* length of rdofile pathname        */
	unsigned short	cowflen;	/* length of cowfile pathname        */
	unsigned long	device;		/* requested/returned device number  */
};

struct cowwatch
{
	int      	flags;		/* request flags                     */
	unsigned long	device;		/* requested device number           */
	unsigned long	threshold;	/* continue if free Kb < threshold   */
	unsigned long	totalkb;	/* ret: total filesystem size (Kb)   */
	unsigned long	availkb;	/* ret: free  filesystem size (Kb)   */
};

#define	WATCHWAIT	0x01		/* block until threshold reached     */

#define	COWSYNC		_IO  ('C', 1)
#define	COWMKPAIR	_IOW ('C', 2, struct cowpair)
#define	COWRMPAIR	_IOW ('C', 3, unsigned long)
#define	COWWATCH	_IOW ('C', 4, struct cowwatch)
#define	COWCLOSE	_IOW ('C', 5, unsigned long)
#define	COWRDOPEN	_IOW ('C', 6, unsigned long)