summaryrefslogblamecommitdiffstats
path: root/src/kernel/xloop_main.h
blob: 360f3e5fcc25787d9834ae302b08e8028586169d (plain) (tree)
1
2
3
4
5
6
7
8
9
10







                                                                   

                      





                           
                       



                          
                           


                               


                    
                     

  
                        
 
                     




                                              
                                                                                                                                                                                                    



                                                              
                                                
                                            

                                                                                                
 
                                         
 

                                                  
                                           
 
                                             
 

                                          






                                                 

                                             
 


                                           

                                            

                      
                                               


      
                  


                                                                                  


                                         

                                              


                                           
                         


                                                                                                                                                                                          
                                                                        
                                                            
                                                                                     
                             
   
 

                                                                           
                                                            
                                           

      
/*
 * loop_main.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_XLOOP_H
#define _LINUX_XLOOP_H

#include <linux/bio.h>
#include <linux/blkdev.h>
#include <linux/blk-mq.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>
#include "uapi_xloop.h"
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
#endif

#include "xloop_file_fmt.h"

/* Possible states of device */
enum {
	Xlo_unbound,
	Xlo_bound,
	Xlo_rundown,
	Xlo_deleting,
};

struct xloop_func_table;

struct xloop_device {
	int                     xlo_number;
	atomic_t                xlo_refcnt;
	loff_t                  xlo_offset;
	loff_t                  xlo_sizelimit;
	int                     xlo_flags;
	int                     (*transfer)(struct xloop_device *xlo, int cmd, struct page *raw_page, unsigned raw_off, struct page *xloop_page, unsigned xloop_off, int size, sector_t real_block);
	char                    xlo_file_name[XLO_NAME_SIZE];
	char                    xlo_crypt_name[XLO_NAME_SIZE];
	char                    xlo_encrypt_key[XLO_KEY_SIZE];
	int                     xlo_encrypt_key_size;
	struct xloop_func_table *xlo_encryption;
	__u32                   xlo_init[2];
	kuid_t                  xlo_key_owner;	/* Who set the key */
	int                     (*ioctl)(struct xloop_device *xlo, int cmd, unsigned long arg); 

	struct xloop_file_fmt   *xlo_fmt;

	struct file             *xlo_backing_file;
	struct block_device     *xlo_device;
	void                    *key_data; 

	gfp_t                   old_gfp_mask;

	spinlock_t              xlo_lock;
	int                     xlo_state;
	spinlock_t              xlo_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    *xlo_queue;
	struct blk_mq_tag_set   tag_set;
	struct gendisk          *xlo_disk;
	struct mutex            xlo_mutex;
	bool                    idr_visible;

#ifdef CONFIG_DEBUG_FS
	struct dentry           *xlo_dbgfs_dir;
#endif
};

struct xloop_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 xloop_func_table {
	int           number;  /* filter type */ 
	int           (*transfer)(struct xloop_device *xlo, int cmd, struct page *raw_page, unsigned raw_off, struct page *xloop_page, unsigned xloop_off, int size, sector_t real_block);
	int           (*init)(struct xloop_device *xlo, const struct xloop_info64 *); 
	/* release is called from xloop_unregister_transfer or clr_fd */
	int           (*release)(struct xloop_device *xlo); 
	int           (*ioctl)(struct xloop_device *xlo, int cmd, unsigned long arg);
	struct module *owner;
}; 

extern inline struct device *xloop_device_to_dev(struct xloop_device *xlo);

int xloop_register_transfer(struct xloop_func_table *funcs);
int xloop_unregister_transfer(int number); 

#endif