101 lines · 2.6 KB · C
RawDownload
/* * loop.h * * Written by Theodore Ts'o, 3/29/93. * * Copyright 1993 by Theodore Ts'o.  Redistribution of this file is * permitted under the GNU General Public License. */#ifndef _LINUX_LOOP_H#define _LINUX_LOOP_H #include <linux/bio.h>#include <linux/blkdev.h>#include <linux/blk-mq.h>#include <linux/spinlock.h>#include <linux/mutex.h>#include <uapi/linux/loop.h> /* Possible states of device */enum {	Lo_unbound,	Lo_bound,	Lo_rundown,	Lo_deleting,}; struct loop_func_table; struct loop_device {	int		lo_number;	atomic_t	lo_refcnt;	loff_t		lo_offset;	loff_t		lo_sizelimit;	int		lo_flags;	int		(*transfer)(struct loop_device *, int cmd,				    struct page *raw_page, unsigned raw_off,				    struct page *loop_page, unsigned loop_off,				    int size, sector_t real_block);	char		lo_file_name[LO_NAME_SIZE];	char		lo_crypt_name[LO_NAME_SIZE];	char		lo_encrypt_key[LO_KEY_SIZE];	int		lo_encrypt_key_size;	struct loop_func_table *lo_encryption;	__u32           lo_init[2];	kuid_t		lo_key_owner;	/* Who set the key */	int		(*ioctl)(struct loop_device *, int cmd, 				 unsigned long arg);  	struct file *	lo_backing_file;	struct block_device *lo_device;	void		*key_data;  	gfp_t		old_gfp_mask; 	spinlock_t		lo_lock;	int			lo_state;	spinlock_t              lo_work_lock;	struct workqueue_struct *workqueue;	struct work_struct      rootcg_work;	struct list_head        rootcg_cmd_list;	struct list_head        idle_worker_list;	struct rb_root          worker_tree;	struct timer_list       timer;	bool			use_dio;	bool			sysfs_inited; 	struct request_queue	*lo_queue;	struct blk_mq_tag_set	tag_set;	struct gendisk		*lo_disk;	struct mutex		lo_mutex;}; struct loop_cmd {	struct list_head list_entry;	bool use_aio; /* use AIO interface to handle I/O */	atomic_t ref; /* only for aio */	long ret;	struct kiocb iocb;	struct bio_vec *bvec;	struct cgroup_subsys_state *blkcg_css;	struct cgroup_subsys_state *memcg_css;}; /* Support for loadable transfer modules */struct loop_func_table {	int number;	/* filter type */ 	int (*transfer)(struct loop_device *lo, int cmd,			struct page *raw_page, unsigned raw_off,			struct page *loop_page, unsigned loop_off,			int size, sector_t real_block);	int (*init)(struct loop_device *, const struct loop_info64 *); 	/* release is called from loop_unregister_transfer or clr_fd */	int (*release)(struct loop_device *); 	int (*ioctl)(struct loop_device *, int cmd, unsigned long arg);	struct module *owner;};  int loop_register_transfer(struct loop_func_table *funcs);int loop_unregister_transfer(int number);  #endif