(root)/
util-linux-2.39/
include/
loopdev.h
       1  /*
       2   * No copyright is claimed.  This code is in the public domain; do with
       3   * it what you wish.
       4   */
       5  #ifndef UTIL_LINUX_LOOPDEV_H
       6  #define UTIL_LINUX_LOOPDEV_H
       7  
       8  #include "sysfs.h"
       9  
      10  /*
      11   * loop_info.lo_encrypt_type
      12   */
      13  #define LO_CRYPT_NONE	0
      14  #define LO_CRYPT_XOR	1
      15  #define LO_CRYPT_DES	2
      16  #define LO_CRYPT_CRYPTOAPI 18
      17  
      18  #define LOOP_SET_FD		0x4C00
      19  #define LOOP_CLR_FD		0x4C01
      20  /*
      21   * Obsolete (kernel < 2.6)
      22   *
      23   * #define LOOP_SET_STATUS	0x4C02
      24   * #define LOOP_GET_STATUS	0x4C03
      25   */
      26  #define LOOP_SET_STATUS64	0x4C04
      27  #define LOOP_GET_STATUS64	0x4C05
      28  /* #define LOOP_CHANGE_FD	0x4C06 */
      29  #define LOOP_SET_CAPACITY	0x4C07
      30  #define LOOP_SET_DIRECT_IO	0x4C08
      31  #define LOOP_SET_BLOCK_SIZE	0x4C09
      32  
      33  /* /dev/loop-control interface */
      34  #ifndef LOOP_CTL_ADD
      35  # define LOOP_CTL_ADD		0x4C80
      36  # define LOOP_CTL_REMOVE	0x4C81
      37  # define LOOP_CTL_GET_FREE	0x4C82
      38  #endif
      39  
      40  /*
      41   * loop_info.lo_flags
      42   */
      43  enum {
      44  	LO_FLAGS_READ_ONLY  = 1,
      45  	LO_FLAGS_USE_AOPS   = 2,
      46  	LO_FLAGS_AUTOCLEAR  = 4,	/* kernel >= 2.6.25 */
      47  	LO_FLAGS_PARTSCAN   = 8,	/* kernel >= 3.2 */
      48  	LO_FLAGS_DIRECT_IO  = 16,	/* kernel >= 4.2 */
      49  };
      50  
      51  #define LO_NAME_SIZE	64
      52  #define LO_KEY_SIZE	32
      53  
      54  /*
      55   * Linux LOOP_{SET,GET}_STATUS64 ioctl struct
      56   */
      57  struct loop_info64 {
      58  	uint64_t	lo_device;
      59  	uint64_t	lo_inode;
      60  	uint64_t	lo_rdevice;
      61  	uint64_t	lo_offset;
      62  	uint64_t	lo_sizelimit; /* bytes, 0 == max available */
      63  	uint32_t	lo_number;
      64  	uint32_t	lo_encrypt_type;
      65  	uint32_t	lo_encrypt_key_size;
      66  	uint32_t	lo_flags;
      67  	uint8_t		lo_file_name[LO_NAME_SIZE];
      68  	uint8_t		lo_crypt_name[LO_NAME_SIZE];
      69  	uint8_t		lo_encrypt_key[LO_KEY_SIZE];
      70  	uint64_t	lo_init[2];
      71  };
      72  
      73  #ifndef LOOP_CONFIGURE
      74  /*
      75   * Since Linux v5.8-rc1 (commit 3448914e8cc550ba792d4ccc74471d1ca4293aae)
      76   */
      77  # define LOOP_CONFIGURE		0x4C0A
      78  struct loop_config {
      79    uint32_t fd;
      80    uint32_t block_size;
      81    struct loop_info64 info;
      82    uint64_t __reserved[8];
      83  };
      84  #endif
      85  
      86  #define LOOPDEV_MAJOR		7	/* loop major number */
      87  #define LOOPDEV_DEFAULT_NNODES	8	/* default number of loop devices */
      88  
      89  struct loopdev_iter {
      90  	FILE		*proc;		/* /proc/partitions */
      91  	DIR		*sysblock;	/* /sys/block */
      92  	int		ncur;		/* current position */
      93  	int		*minors;	/* ary of minor numbers (when scan whole /dev) */
      94  	int		nminors;	/* number of items in *minors */
      95  	int		ct_perm;	/* count permission problems */
      96  	int		ct_succ;	/* count number of detected devices */
      97  
      98  	unsigned int	done:1;		/* scanning done */
      99  	unsigned int	default_check:1;/* check first LOOPDEV_NLOOPS */
     100  	int		flags;		/* LOOPITER_FL_* flags */
     101  };
     102  
     103  enum {
     104  	LOOPITER_FL_FREE	= (1 << 0),
     105  	LOOPITER_FL_USED	= (1 << 1)
     106  };
     107  
     108  /*
     109   * handler for work with loop devices
     110   */
     111  struct loopdev_cxt {
     112  	char		device[128];	/* device path (e.g. /dev/loop<N>) */
     113  	char		*filename;	/* backing file for loopcxt_set_... */
     114  	int		fd;		/* open(/dev/looo<N>) */
     115  	int		mode;		/* fd mode O_{RDONLY,RDWR} */
     116  	uint64_t	blocksize;	/* used by loopcxt_setup_device() */
     117  
     118  	int		flags;		/* LOOPDEV_FL_* flags */
     119  	unsigned int	has_info:1;	/* .info contains data */
     120  	unsigned int	extra_check:1;	/* unusual stuff for iterator */
     121  	unsigned int	info_failed:1;	/* LOOP_GET_STATUS ioctl failed */
     122  	unsigned int    control_ok:1;	/* /dev/loop-control success */
     123  
     124  	struct path_cxt		*sysfs; /* pointer to /sys/dev/block/<maj:min>/ */
     125  	struct loop_config 	config;	/* for GET/SET ioctl */
     126  	struct loopdev_iter	iter;	/* scans /sys or /dev for used/free devices */
     127  };
     128  
     129  #define UL_LOOPDEVCXT_EMPTY { .fd = -1  }
     130  
     131  /*
     132   * loopdev_cxt.flags
     133   */
     134  enum {
     135  	LOOPDEV_FL_RDONLY	= (1 << 0),	/* open(/dev/loop) mode; default */
     136  	LOOPDEV_FL_RDWR		= (1 << 1),	/* necessary for loop setup only */
     137  	LOOPDEV_FL_OFFSET	= (1 << 4),
     138  	LOOPDEV_FL_NOSYSFS	= (1 << 5),
     139  	LOOPDEV_FL_NOIOCTL	= (1 << 6),
     140  	LOOPDEV_FL_DEVSUBDIR	= (1 << 7),
     141  	LOOPDEV_FL_CONTROL	= (1 << 8),	/* system with /dev/loop-control */
     142  	LOOPDEV_FL_SIZELIMIT	= (1 << 9)
     143  };
     144  
     145  /*
     146   * High-level
     147   */
     148  extern int loopmod_supports_partscan(void);
     149  
     150  extern int is_loopdev(const char *device);
     151  extern int loopdev_is_autoclear(const char *device);
     152  
     153  extern char *loopdev_get_backing_file(const char *device);
     154  extern int loopdev_has_backing_file(const char *device);
     155  extern int loopdev_is_used(const char *device, const char *filename,
     156  			   uint64_t offset, uint64_t sizelimit, int flags);
     157  extern char *loopdev_find_by_backing_file(const char *filename,
     158  				uint64_t offset, uint64_t sizelimit, int flags);
     159  extern int loopcxt_find_unused(struct loopdev_cxt *lc);
     160  extern int loopdev_delete(const char *device);
     161  extern int loopdev_count_by_backing_file(const char *filename, char **loopdev);
     162  
     163  /*
     164   * Low-level
     165   */
     166  extern int loopcxt_init(struct loopdev_cxt *lc, int flags)
     167  				__attribute__ ((warn_unused_result));
     168  extern void loopcxt_deinit(struct loopdev_cxt *lc);
     169  
     170  extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
     171  				__attribute__ ((warn_unused_result));
     172  extern int loopcxt_has_device(struct loopdev_cxt *lc);
     173  extern int loopcxt_add_device(struct loopdev_cxt *lc);
     174  extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
     175  extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
     176  extern struct loop_info64 *loopcxt_get_info(struct loopdev_cxt *lc);
     177  
     178  extern int loopcxt_get_fd(struct loopdev_cxt *lc);
     179  extern int loopcxt_set_fd(struct loopdev_cxt *lc, int fd, int mode);
     180  
     181  extern int loopcxt_init_iterator(struct loopdev_cxt *lc, int flags);
     182  extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
     183  extern int loopcxt_next(struct loopdev_cxt *lc);
     184  
     185  extern int loopcxt_setup_device(struct loopdev_cxt *lc);
     186  extern int loopcxt_delete_device(struct loopdev_cxt *lc);
     187  
     188  extern int loopcxt_ioctl_status(struct loopdev_cxt *lc);
     189  extern int loopcxt_ioctl_capacity(struct loopdev_cxt *lc);
     190  extern int loopcxt_ioctl_dio(struct loopdev_cxt *lc, unsigned long use_dio);
     191  extern int loopcxt_ioctl_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
     192  
     193  int loopcxt_set_offset(struct loopdev_cxt *lc, uint64_t offset);
     194  int loopcxt_set_sizelimit(struct loopdev_cxt *lc, uint64_t sizelimit);
     195  int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
     196  int loopcxt_set_flags(struct loopdev_cxt *lc, uint32_t flags);
     197  int loopcxt_set_backing_file(struct loopdev_cxt *lc, const char *filename);
     198  
     199  extern char *loopcxt_get_backing_file(struct loopdev_cxt *lc);
     200  extern int loopcxt_get_backing_devno(struct loopdev_cxt *lc, dev_t *devno);
     201  extern int loopcxt_get_backing_inode(struct loopdev_cxt *lc, ino_t *ino);
     202  extern int loopcxt_get_offset(struct loopdev_cxt *lc, uint64_t *offset);
     203  extern int loopcxt_get_blocksize(struct loopdev_cxt *lc, uint64_t *blocksize);
     204  extern int loopcxt_get_sizelimit(struct loopdev_cxt *lc, uint64_t *size);
     205  extern int loopcxt_get_encrypt_type(struct loopdev_cxt *lc, uint32_t *type);
     206  extern const char *loopcxt_get_crypt_name(struct loopdev_cxt *lc);
     207  extern int loopcxt_is_autoclear(struct loopdev_cxt *lc);
     208  extern int loopcxt_is_readonly(struct loopdev_cxt *lc);
     209  extern int loopcxt_is_dio(struct loopdev_cxt *lc);
     210  extern int loopcxt_is_partscan(struct loopdev_cxt *lc);
     211  extern int loopcxt_find_by_backing_file(struct loopdev_cxt *lc,
     212  				const char *filename,
     213  				uint64_t offset, uint64_t sizelimit,
     214  				int flags);
     215  extern int loopcxt_find_overlap(struct loopdev_cxt *lc,
     216  				const char *filename,
     217  				uint64_t offset, uint64_t sizelimit);
     218  
     219  extern int loopcxt_is_used(struct loopdev_cxt *lc,
     220                      struct stat *st,
     221                      const char *backing_file,
     222                      uint64_t offset,
     223                      uint64_t sizelimit,
     224                      int flags);
     225  
     226  #endif /* UTIL_LINUX_LOOPDEV_H */