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