18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * loop.h
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Written by Theodore Ts'o, 3/29/93.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright 1993 by Theodore Ts'o.  Redistribution of this file is
78c2ecf20Sopenharmony_ci * permitted under the GNU General Public License.
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#ifndef _LINUX_LOOP_H
108c2ecf20Sopenharmony_ci#define _LINUX_LOOP_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/bio.h>
138c2ecf20Sopenharmony_ci#include <linux/blkdev.h>
148c2ecf20Sopenharmony_ci#include <linux/blk-mq.h>
158c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
168c2ecf20Sopenharmony_ci#include <linux/mutex.h>
178c2ecf20Sopenharmony_ci#include <linux/kthread.h>
188c2ecf20Sopenharmony_ci#include <uapi/linux/loop.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/* Possible states of device */
218c2ecf20Sopenharmony_cienum {
228c2ecf20Sopenharmony_ci	Lo_unbound,
238c2ecf20Sopenharmony_ci	Lo_bound,
248c2ecf20Sopenharmony_ci	Lo_rundown,
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct loop_func_table;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct loop_device {
308c2ecf20Sopenharmony_ci	int		lo_number;
318c2ecf20Sopenharmony_ci	atomic_t	lo_refcnt;
328c2ecf20Sopenharmony_ci	loff_t		lo_offset;
338c2ecf20Sopenharmony_ci	loff_t		lo_sizelimit;
348c2ecf20Sopenharmony_ci	int		lo_flags;
358c2ecf20Sopenharmony_ci	int		(*transfer)(struct loop_device *, int cmd,
368c2ecf20Sopenharmony_ci				    struct page *raw_page, unsigned raw_off,
378c2ecf20Sopenharmony_ci				    struct page *loop_page, unsigned loop_off,
388c2ecf20Sopenharmony_ci				    int size, sector_t real_block);
398c2ecf20Sopenharmony_ci	char		lo_file_name[LO_NAME_SIZE];
408c2ecf20Sopenharmony_ci	char		lo_crypt_name[LO_NAME_SIZE];
418c2ecf20Sopenharmony_ci	char		lo_encrypt_key[LO_KEY_SIZE];
428c2ecf20Sopenharmony_ci	int		lo_encrypt_key_size;
438c2ecf20Sopenharmony_ci	struct loop_func_table *lo_encryption;
448c2ecf20Sopenharmony_ci	__u32           lo_init[2];
458c2ecf20Sopenharmony_ci	kuid_t		lo_key_owner;	/* Who set the key */
468c2ecf20Sopenharmony_ci	int		(*ioctl)(struct loop_device *, int cmd,
478c2ecf20Sopenharmony_ci				 unsigned long arg);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	struct file *	lo_backing_file;
508c2ecf20Sopenharmony_ci	struct block_device *lo_device;
518c2ecf20Sopenharmony_ci	void		*key_data;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	gfp_t		old_gfp_mask;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	spinlock_t		lo_lock;
568c2ecf20Sopenharmony_ci	int			lo_state;
578c2ecf20Sopenharmony_ci	struct kthread_worker	worker;
588c2ecf20Sopenharmony_ci	struct task_struct	*worker_task;
598c2ecf20Sopenharmony_ci	bool			use_dio;
608c2ecf20Sopenharmony_ci	bool			sysfs_inited;
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	struct request_queue	*lo_queue;
638c2ecf20Sopenharmony_ci	struct blk_mq_tag_set	tag_set;
648c2ecf20Sopenharmony_ci	struct gendisk		*lo_disk;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistruct loop_cmd {
688c2ecf20Sopenharmony_ci	struct kthread_work work;
698c2ecf20Sopenharmony_ci	bool use_aio; /* use AIO interface to handle I/O */
708c2ecf20Sopenharmony_ci	atomic_t ref; /* only for aio */
718c2ecf20Sopenharmony_ci	long ret;
728c2ecf20Sopenharmony_ci	struct kiocb iocb;
738c2ecf20Sopenharmony_ci	struct bio_vec *bvec;
748c2ecf20Sopenharmony_ci	struct cgroup_subsys_state *css;
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci/* Support for loadable transfer modules */
788c2ecf20Sopenharmony_cistruct loop_func_table {
798c2ecf20Sopenharmony_ci	int number;	/* filter type */
808c2ecf20Sopenharmony_ci	int (*transfer)(struct loop_device *lo, int cmd,
818c2ecf20Sopenharmony_ci			struct page *raw_page, unsigned raw_off,
828c2ecf20Sopenharmony_ci			struct page *loop_page, unsigned loop_off,
838c2ecf20Sopenharmony_ci			int size, sector_t real_block);
848c2ecf20Sopenharmony_ci	int (*init)(struct loop_device *, const struct loop_info64 *);
858c2ecf20Sopenharmony_ci	/* release is called from loop_unregister_transfer or clr_fd */
868c2ecf20Sopenharmony_ci	int (*release)(struct loop_device *);
878c2ecf20Sopenharmony_ci	int (*ioctl)(struct loop_device *, int cmd, unsigned long arg);
888c2ecf20Sopenharmony_ci	struct module *owner;
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciint loop_register_transfer(struct loop_func_table *funcs);
928c2ecf20Sopenharmony_ciint loop_unregister_transfer(int number);
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci#endif
95