mirror of
https://github.com/versity/scoutfs.git
synced 2026-04-30 09:56:55 +00:00
Support O_TMPFILE: Create an unlinked file and put it on the orphan list. If it ever gains a link, take it off the orphan list. Change MOVE_BLOCKS ioctl to allow moving blocks into offline extent ranges. Ioctl callers must set a new flag to enable this operation mode. RH-compat: tmpfile support it actually backported by RH into 3.10 kernel. We need to use some of their kabi-maintaining wrappers to use it: use a struct inode_operations_wrapper instead of base struct inode_operations, set S_IOPS_WRAPPER flag in i_flags. This lets RH's modified vfs_tmpfile() find our tmpfile fn pointer. Add a test that tests both creating tmpfiles as well as moving their contents into a destination file via MOVE_BLOCKS. xfstests common/004 now runs because tmpfile is supported. Signed-off-by: Andy Grover <agrover@versity.com>
37 lines
1.3 KiB
C
37 lines
1.3 KiB
C
#ifndef _SCOUTFS_EXT_H_
|
|
#define _SCOUTFS_EXT_H_
|
|
|
|
struct scoutfs_extent {
|
|
u64 start;
|
|
u64 len;
|
|
u64 map;
|
|
u8 flags;
|
|
};
|
|
|
|
struct scoutfs_ext_ops {
|
|
int (*next)(struct super_block *sb, void *arg,
|
|
u64 start, u64 len, struct scoutfs_extent *ext);
|
|
int (*insert)(struct super_block *sb, void *arg,
|
|
u64 start, u64 len, u64 map, u8 flags);
|
|
int (*remove)(struct super_block *sb, void *arg, u64 start, u64 len,
|
|
u64 map, u8 flags);
|
|
};
|
|
|
|
bool scoutfs_ext_can_merge(struct scoutfs_extent *left,
|
|
struct scoutfs_extent *right);
|
|
|
|
int scoutfs_ext_next(struct super_block *sb, struct scoutfs_ext_ops *ops,
|
|
void *arg, u64 start, u64 len, struct scoutfs_extent *ext);
|
|
int scoutfs_ext_insert(struct super_block *sb, struct scoutfs_ext_ops *ops,
|
|
void *arg, u64 start, u64 len, u64 map, u8 flags);
|
|
int scoutfs_ext_remove(struct super_block *sb, struct scoutfs_ext_ops *ops,
|
|
void *arg, u64 start, u64 len);
|
|
int scoutfs_ext_alloc(struct super_block *sb, struct scoutfs_ext_ops *ops,
|
|
void *arg, u64 start, u64 len, u64 limit,
|
|
struct scoutfs_extent *ext);
|
|
int scoutfs_ext_set(struct super_block *sb, struct scoutfs_ext_ops *ops,
|
|
void *arg, u64 start, u64 len, u64 map, u8 flags);
|
|
bool scoutfs_ext_inside(u64 start, u64 len, struct scoutfs_extent *out);
|
|
|
|
#endif
|