]> git.ipfire.org Git - thirdparty/util-linux.git/blame - include/loopdev.h
Merge branch 'master' of https://github.com/breavyn/util-linux
[thirdparty/util-linux.git] / include / loopdev.h
CommitLineData
faeb1b64
KZ
1/*
2 * No copyright is claimed. This code is in the public domain; do with
3 * it what you wish.
4 */
10ee5932
KZ
5#ifndef UTIL_LINUX_LOOPDEV_H
6#define UTIL_LINUX_LOOPDEV_H
7
fd7f0718
KZ
8#include "sysfs.h"
9
10ee5932
KZ
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
64c3bb3c 30#define LOOP_SET_DIRECT_IO 0x4C08
a1a41597 31#define LOOP_SET_BLOCK_SIZE 0x4C09
10ee5932 32
0b14bf7a
KZ
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
10ee5932
KZ
40/*
41 * loop_info.lo_flags
42 */
43enum {
44 LO_FLAGS_READ_ONLY = 1,
45 LO_FLAGS_USE_AOPS = 2,
916bf85e
KZ
46 LO_FLAGS_AUTOCLEAR = 4, /* kernel >= 2.6.25 */
47 LO_FLAGS_PARTSCAN = 8, /* kernel >= 3.2 */
faeef4d2 48 LO_FLAGS_DIRECT_IO = 16, /* kernel >= 4.2 */
10ee5932
KZ
49};
50
51#define LO_NAME_SIZE 64
52#define LO_KEY_SIZE 32
53
54/*
a5c523a0 55 * Linux LOOP_{SET,GET}_STATUS64 ioctl struct
10ee5932
KZ
56 */
57struct 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
d5fd456c 73#ifndef LOOP_CONFIGURE
a61955ba
KZ
74/*
75 * Since Linux v5.8-rc1 (commit 3448914e8cc550ba792d4ccc74471d1ca4293aae)
76 */
77# define LOOP_CONFIGURE 0x4C0A
d5fd456c
SK
78struct 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
10ee5932
KZ
86#define LOOPDEV_MAJOR 7 /* loop major number */
87#define LOOPDEV_DEFAULT_NNODES 8 /* default number of loop devices */
88
89struct loopdev_iter {
90 FILE *proc; /* /proc/partitions */
e4062c72 91 DIR *sysblock; /* /sys/block */
10ee5932
KZ
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
9feec79c
KZ
98 unsigned int done:1; /* scanning done */
99 unsigned int default_check:1;/* check first LOOPDEV_NLOOPS */
10ee5932
KZ
100 int flags; /* LOOPITER_FL_* flags */
101};
102
103enum {
104 LOOPITER_FL_FREE = (1 << 0),
105 LOOPITER_FL_USED = (1 << 1)
106};
107
108/*
109 * handler for work with loop devices
110 */
111struct 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>) */
ced1142d 115 mode_t mode; /* fd mode O_{RDONLY,RDWR} */
75d239ff 116 uint64_t blocksize; /* used by loopcxt_setup_device() */
10ee5932
KZ
117
118 int flags; /* LOOPDEV_FL_* flags */
9feec79c
KZ
119 unsigned int has_info:1; /* .info contains data */
120 unsigned int extra_check:1; /* unusual stuff for iterator */
6c224de1 121 unsigned int info_failed:1; /* LOOP_GET_STATUS ioctl failed */
663bf040 122 unsigned int control_ok:1; /* /dev/loop-control success */
10ee5932 123
7604f85f 124 struct path_cxt *sysfs; /* pointer to /sys/dev/block/<maj:min>/ */
db8f7815 125 struct loop_config config; /* for GET/SET ioctl */
10ee5932
KZ
126 struct loopdev_iter iter; /* scans /sys or /dev for used/free devices */
127};
128
7604f85f 129#define UL_LOOPDEVCXT_EMPTY { .fd = -1 }
6219c25e 130
10ee5932
KZ
131/*
132 * loopdev_cxt.flags
133 */
134enum {
10ee5932
KZ
135 LOOPDEV_FL_OFFSET = (1 << 4),
136 LOOPDEV_FL_NOSYSFS = (1 << 5),
137 LOOPDEV_FL_NOIOCTL = (1 << 6),
0b14bf7a
KZ
138 LOOPDEV_FL_DEVSUBDIR = (1 << 7),
139 LOOPDEV_FL_CONTROL = (1 << 8), /* system with /dev/loop-control */
c7e0925d 140 LOOPDEV_FL_SIZELIMIT = (1 << 9)
10ee5932
KZ
141};
142
143/*
144 * High-level
145 */
59d749c3
KZ
146extern int loopmod_supports_partscan(void);
147
10ee5932
KZ
148extern int is_loopdev(const char *device);
149extern int loopdev_is_autoclear(const char *device);
6c224de1 150
10ee5932 151extern char *loopdev_get_backing_file(const char *device);
14bb8e3c 152extern int loopdev_has_backing_file(const char *device);
10ee5932 153extern int loopdev_is_used(const char *device, const char *filename,
74a4705a 154 uint64_t offset, uint64_t sizelimit, int flags);
10ee5932 155extern char *loopdev_find_by_backing_file(const char *filename,
74a4705a 156 uint64_t offset, uint64_t sizelimit, int flags);
10ee5932
KZ
157extern int loopcxt_find_unused(struct loopdev_cxt *lc);
158extern int loopdev_delete(const char *device);
d5688130 159extern int loopdev_count_by_backing_file(const char *filename, char **loopdev);
10ee5932
KZ
160
161/*
162 * Low-level
163 */
defa0710
KZ
164extern int loopcxt_init(struct loopdev_cxt *lc, int flags)
165 __attribute__ ((warn_unused_result));
10ee5932
KZ
166extern void loopcxt_deinit(struct loopdev_cxt *lc);
167
defa0710
KZ
168extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
169 __attribute__ ((warn_unused_result));
c7e0925d 170extern int loopcxt_has_device(struct loopdev_cxt *lc);
3cb2413b 171extern int loopcxt_add_device(struct loopdev_cxt *lc);
10ee5932
KZ
172extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
173extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
c8ea3514 174extern struct loop_info64 *loopcxt_get_info(struct loopdev_cxt *lc);
fd7f0718 175
10ee5932 176extern int loopcxt_get_fd(struct loopdev_cxt *lc);
ced1142d 177extern int loopcxt_set_fd(struct loopdev_cxt *lc, int fd, mode_t mode);
10ee5932
KZ
178
179extern int loopcxt_init_iterator(struct loopdev_cxt *lc, int flags);
180extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
181extern int loopcxt_next(struct loopdev_cxt *lc);
182
183extern int loopcxt_setup_device(struct loopdev_cxt *lc);
184extern int loopcxt_delete_device(struct loopdev_cxt *lc);
9fcc8936
KZ
185
186extern int loopcxt_ioctl_status(struct loopdev_cxt *lc);
187extern int loopcxt_ioctl_capacity(struct loopdev_cxt *lc);
188extern int loopcxt_ioctl_dio(struct loopdev_cxt *lc, unsigned long use_dio);
189extern int loopcxt_ioctl_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
10ee5932
KZ
190
191int loopcxt_set_offset(struct loopdev_cxt *lc, uint64_t offset);
192int loopcxt_set_sizelimit(struct loopdev_cxt *lc, uint64_t sizelimit);
75d239ff 193int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize);
10ee5932
KZ
194int loopcxt_set_flags(struct loopdev_cxt *lc, uint32_t flags);
195int loopcxt_set_backing_file(struct loopdev_cxt *lc, const char *filename);
db8f7815 196int loopcxt_set_refname(struct loopdev_cxt *lc, const char *refname);
10ee5932
KZ
197
198extern char *loopcxt_get_backing_file(struct loopdev_cxt *lc);
db8f7815 199extern char *loopcxt_get_refname(struct loopdev_cxt *lc);
6c224de1
KZ
200extern int loopcxt_get_backing_devno(struct loopdev_cxt *lc, dev_t *devno);
201extern int loopcxt_get_backing_inode(struct loopdev_cxt *lc, ino_t *ino);
10ee5932 202extern int loopcxt_get_offset(struct loopdev_cxt *lc, uint64_t *offset);
a1a41597 203extern int loopcxt_get_blocksize(struct loopdev_cxt *lc, uint64_t *blocksize);
10ee5932 204extern int loopcxt_get_sizelimit(struct loopdev_cxt *lc, uint64_t *size);
6c224de1
KZ
205extern int loopcxt_get_encrypt_type(struct loopdev_cxt *lc, uint32_t *type);
206extern const char *loopcxt_get_crypt_name(struct loopdev_cxt *lc);
10ee5932 207extern int loopcxt_is_autoclear(struct loopdev_cxt *lc);
fd7f0718 208extern int loopcxt_is_readonly(struct loopdev_cxt *lc);
faeef4d2 209extern int loopcxt_is_dio(struct loopdev_cxt *lc);
59d749c3 210extern int loopcxt_is_partscan(struct loopdev_cxt *lc);
10ee5932
KZ
211extern int loopcxt_find_by_backing_file(struct loopdev_cxt *lc,
212 const char *filename,
74a4705a
SB
213 uint64_t offset, uint64_t sizelimit,
214 int flags);
c444a71b
KZ
215extern int loopcxt_find_overlap(struct loopdev_cxt *lc,
216 const char *filename,
217 uint64_t offset, uint64_t sizelimit);
10ee5932 218
6c224de1
KZ
219extern int loopcxt_is_used(struct loopdev_cxt *lc,
220 struct stat *st,
221 const char *backing_file,
222 uint64_t offset,
74a4705a 223 uint64_t sizelimit,
6c224de1
KZ
224 int flags);
225
10ee5932 226#endif /* UTIL_LINUX_LOOPDEV_H */