mirror of
https://github.com/kdave/btrfs-progs
synced 2025-05-16 23:08:38 +00:00
btrfs-progs: add helpers for parsing filesystem exclusive operation
Since kernel 5.10, the file /sys/fs/btrfs/FSID/exclusive_operation exports textual id of the running exclusive operation (balance, device add/remove, ...). Add definitions and parsing functions so they can be used to check before another operation is started and potentially blocks. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
34f0594bca
commit
639ddf61ca
@ -1925,3 +1925,53 @@ int sysfs_read_file(int fd, char *buf, size_t size)
|
|||||||
memset(buf, 0, size);
|
memset(buf, 0, size);
|
||||||
return read(fd, buf, size);
|
return read(fd, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char exclop_def[][16] = {
|
||||||
|
[BTRFS_EXCLOP_NONE] "none",
|
||||||
|
[BTRFS_EXCLOP_BALANCE] "balance",
|
||||||
|
[BTRFS_EXCLOP_DEV_ADD] "device add",
|
||||||
|
[BTRFS_EXCLOP_DEV_REMOVE] "device remove",
|
||||||
|
[BTRFS_EXCLOP_DEV_REPLACE] "device replace",
|
||||||
|
[BTRFS_EXCLOP_RESIZE] "resize",
|
||||||
|
[BTRFS_EXCLOP_SWAP_ACTIVATE] "swap activate",
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read currently running exclusive operation from sysfs. If this is not
|
||||||
|
* available, return BTRFS_EXCLOP_UNKNOWN
|
||||||
|
*/
|
||||||
|
int get_fs_exclop(int fd)
|
||||||
|
{
|
||||||
|
int sysfs_fd;
|
||||||
|
char buf[32];
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sysfs_fd = sysfs_open_fsid_file(fd, "exclusive_operation");
|
||||||
|
if (sysfs_fd < 0)
|
||||||
|
return BTRFS_EXCLOP_UNKNOWN;
|
||||||
|
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
ret = sysfs_read_file(sysfs_fd, buf, sizeof(buf));
|
||||||
|
close(sysfs_fd);
|
||||||
|
if (ret <= 0)
|
||||||
|
return BTRFS_EXCLOP_UNKNOWN;
|
||||||
|
|
||||||
|
i = strlen(buf) - 1;
|
||||||
|
while (i > 0 && isspace(buf[i])) i--;
|
||||||
|
if (i > 0)
|
||||||
|
buf[i + 1] = 0;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(exclop_def); i++) {
|
||||||
|
if (strcmp(exclop_def[i], buf) == 0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BTRFS_EXCLOP_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *get_fs_exclop_name(int op)
|
||||||
|
{
|
||||||
|
if (0 <= op && op <= ARRAY_SIZE(exclop_def))
|
||||||
|
return exclop_def[op];
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
@ -52,6 +52,17 @@
|
|||||||
#define UNITS_HUMAN (UNITS_HUMAN_BINARY)
|
#define UNITS_HUMAN (UNITS_HUMAN_BINARY)
|
||||||
#define UNITS_DEFAULT (UNITS_HUMAN)
|
#define UNITS_DEFAULT (UNITS_HUMAN)
|
||||||
|
|
||||||
|
enum exclusive_operation {
|
||||||
|
BTRFS_EXCLOP_NONE,
|
||||||
|
BTRFS_EXCLOP_BALANCE,
|
||||||
|
BTRFS_EXCLOP_DEV_ADD,
|
||||||
|
BTRFS_EXCLOP_DEV_REMOVE,
|
||||||
|
BTRFS_EXCLOP_DEV_REPLACE,
|
||||||
|
BTRFS_EXCLOP_RESIZE,
|
||||||
|
BTRFS_EXCLOP_SWAP_ACTIVATE,
|
||||||
|
BTRFS_EXCLOP_UNKNOWN = -1,
|
||||||
|
};
|
||||||
|
|
||||||
void units_set_mode(unsigned *units, unsigned mode);
|
void units_set_mode(unsigned *units, unsigned mode);
|
||||||
void units_set_base(unsigned *units, unsigned base);
|
void units_set_base(unsigned *units, unsigned base);
|
||||||
|
|
||||||
@ -76,6 +87,8 @@ int get_fs_info(const char *path, struct btrfs_ioctl_fs_info_args *fi_args,
|
|||||||
struct btrfs_ioctl_dev_info_args **di_ret);
|
struct btrfs_ioctl_dev_info_args **di_ret);
|
||||||
int get_fsid(const char *path, u8 *fsid, int silent);
|
int get_fsid(const char *path, u8 *fsid, int silent);
|
||||||
int get_fsid_fd(int fd, u8 *fsid);
|
int get_fsid_fd(int fd, u8 *fsid);
|
||||||
|
int get_fs_exclop(int fd);
|
||||||
|
const char *get_fs_exclop_name(int op);
|
||||||
|
|
||||||
int get_label(const char *btrfs_dev, char *label);
|
int get_label(const char *btrfs_dev, char *label);
|
||||||
int set_label(const char *btrfs_dev, const char *label);
|
int set_label(const char *btrfs_dev, const char *label);
|
||||||
|
Loading…
Reference in New Issue
Block a user