/* SPDX-License-Identifier: GPL-2.0 */ /* * loop_file_fmt.h * * File format subsystem for the loop device module. * * Copyright (C) 2019 Manuel Bentele */ #ifndef _LINUX_LOOP_FILE_FMT_H #define _LINUX_LOOP_FILE_FMT_H #include "loop_main.h" struct loop_file_fmt; /* data structure representing the file format subsystem interface */ struct loop_file_fmt_ops { int (*init) (struct loop_file_fmt *lo_fmt); void (*exit) (struct loop_file_fmt *lo_fmt); int (*read) (struct loop_file_fmt *lo_fmt, struct request *rq); int (*write) (struct loop_file_fmt *lo_fmt, struct request *rq); int (*read_aio) (struct loop_file_fmt *lo_fmt, struct request *rq); int (*write_aio) (struct loop_file_fmt *lo_fmt, struct request *rq); int (*discard) (struct loop_file_fmt *lo_fmt, struct request *rq); int (*flush) (struct loop_file_fmt *lo_fmt); loff_t (*sector_size) (struct loop_file_fmt *lo_fmt); }; /* data structure for implementing file format drivers */ struct loop_file_fmt_driver { const char *name; const u32 file_fmt_type; struct loop_file_fmt_ops *ops; struct module *owner; }; /* * states of the file format * * transitions: * loop_file_fmt_init(...) * ---> uninitialized ------------------------------> initialized * loop_file_fmt_exit(...) * initialized ------------------------------> uninitialized * loop_file_fmt_read(...) * initialized ------------------------------> initialized * loop_file_fmt_read_aio(...) * initialized ------------------------------> initialized * loop_file_fmt_write(...) * initialized ------------------------------> initialized * loop_file_fmt_write_aio(...) * initialized ------------------------------> initialized * loop_file_fmt_discard(...) * initialized ------------------------------> initialized * loop_file_fmt_flush(...) * initialized ------------------------------> initialized * loop_file_fmt_sector_size(...) * initialized ------------------------------> initialized * * loop_file_fmt_change(...) * +-----------------------------------------------------------+ * | exit(...) init(...) | * | initialized -------> uninitialized -------> initialized | * +-----------------------------------------------------------+ */ enum { file_fmt_uninitialized = 0, file_fmt_initialized }; /* data structure for using with the file format subsystem */ struct loop_file_fmt { u32 file_fmt_type; int file_fmt_state; struct loop_device *lo; void *private_data; }; /* subsystem functions for the driver implementation */ extern int loop_file_fmt_register_driver(struct loop_file_fmt_driver *drv); extern void loop_file_fmt_unregister_driver(struct loop_file_fmt_driver *drv); /* subsystem functions for subsystem usage */ extern struct loop_file_fmt *loop_file_fmt_alloc(void); extern void loop_file_fmt_free(struct loop_file_fmt *lo_fmt); extern int loop_file_fmt_set_lo(struct loop_file_fmt *lo_fmt, struct loop_device *lo); extern struct loop_device *loop_file_fmt_get_lo(struct loop_file_fmt *lo_fmt); extern int loop_file_fmt_init(struct loop_file_fmt *lo_fmt, u32 file_fmt_type); extern void loop_file_fmt_exit(struct loop_file_fmt *lo_fmt); extern int loop_file_fmt_read(struct loop_file_fmt *lo_fmt, struct request *rq); extern int loop_file_fmt_read_aio(struct loop_file_fmt *lo_fmt, struct request *rq); extern int loop_file_fmt_write(struct loop_file_fmt *lo_fmt, struct request *rq); extern int loop_file_fmt_write_aio(struct loop_file_fmt *lo_fmt, struct request *rq); extern int loop_file_fmt_discard(struct loop_file_fmt *lo_fmt, struct request *rq); extern int loop_file_fmt_flush(struct loop_file_fmt *lo_fmt); extern loff_t loop_file_fmt_sector_size(struct loop_file_fmt *lo_fmt); extern int loop_file_fmt_change(struct loop_file_fmt *lo_fmt, u32 file_fmt_type_new); /* helper functions of the subsystem */ extern ssize_t loop_file_fmt_print_type(u32 file_fmt_type, char *file_fmt_name); #endif