You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
6.9 KiB
243 lines
6.9 KiB
/*
|
|
* Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef TST_FS_H__
|
|
#define TST_FS_H__
|
|
|
|
/* man 2 statfs or kernel-source/include/linux/magic.h */
|
|
#define TST_BTRFS_MAGIC 0x9123683E
|
|
#define TST_NFS_MAGIC 0x6969
|
|
#define TST_RAMFS_MAGIC 0x858458f6
|
|
#define TST_TMPFS_MAGIC 0x01021994
|
|
#define TST_V9FS_MAGIC 0x01021997
|
|
#define TST_XFS_MAGIC 0x58465342
|
|
#define TST_EXT2_OLD_MAGIC 0xEF51
|
|
/* ext2, ext3, ext4 have the same magic number */
|
|
#define TST_EXT234_MAGIC 0xEF53
|
|
#define TST_MINIX_MAGIC 0x137F
|
|
#define TST_MINIX_MAGIC2 0x138F
|
|
#define TST_MINIX2_MAGIC 0x2468
|
|
#define TST_MINIX2_MAGIC2 0x2478
|
|
#define TST_MINIX3_MAGIC 0x4D5A
|
|
#define TST_UDF_MAGIC 0x15013346
|
|
#define TST_SYSV2_MAGIC 0x012FF7B6
|
|
#define TST_SYSV4_MAGIC 0x012FF7B5
|
|
#define TST_UFS_MAGIC 0x00011954
|
|
#define TST_UFS2_MAGIC 0x19540119
|
|
#define TST_F2FS_MAGIC 0xF2F52010
|
|
#define TST_NILFS_MAGIC 0x3434
|
|
#define TST_EXOFS_MAGIC 0x5DF5
|
|
#define TST_OVERLAYFS_MAGIC 0x794c7630
|
|
|
|
enum {
|
|
TST_BYTES = 1,
|
|
TST_KB = 1024,
|
|
TST_MB = 1048576,
|
|
TST_GB = 1073741824,
|
|
};
|
|
|
|
#define OVL_BASE_MNTPOINT "mntpoint"
|
|
#define OVL_LOWER OVL_BASE_MNTPOINT"/lower"
|
|
#define OVL_UPPER OVL_BASE_MNTPOINT"/upper"
|
|
#define OVL_WORK OVL_BASE_MNTPOINT"/work"
|
|
#define OVL_MNT OVL_BASE_MNTPOINT"/ovl"
|
|
|
|
/*
|
|
* @path: path is the pathname of any file within the mounted file system
|
|
* @mult: mult should be TST_KB, TST_MB or TST_GB
|
|
* the required free space is calculated by @size * @mult
|
|
*/
|
|
int tst_fs_has_free_(void (*cleanup)(void), const char *path,
|
|
unsigned int size, unsigned int mult);
|
|
|
|
/*
|
|
* Returns filesystem magick for a given path.
|
|
*
|
|
* The expected usage is:
|
|
*
|
|
* if (tst_fs_type(cleanup, ".") == TST_NFS_MAGIC) {
|
|
* tst_brkm(TCONF, cleanup,
|
|
* "Test not supported on NFS filesystem");
|
|
* }
|
|
*
|
|
* Or:
|
|
*
|
|
* long type;
|
|
*
|
|
* swtich ((type = tst_fs_type(cleanup, "."))) {
|
|
* case TST_NFS_MAGIC:
|
|
* case TST_TMPFS_MAGIC:
|
|
* case TST_RAMFS_MAGIC:
|
|
* tst_brkm(TCONF, cleanup, "Test not supported on %s filesystem",
|
|
* tst_fs_type_name(type));
|
|
* break;
|
|
* }
|
|
*/
|
|
long tst_fs_type_(void (*cleanup)(void), const char *path);
|
|
|
|
/*
|
|
* Returns filesystem name given magic.
|
|
*/
|
|
const char *tst_fs_type_name(long f_type);
|
|
|
|
/*
|
|
* Try to get maximum number of hard links to a regular file inside the @dir.
|
|
*
|
|
* Note: This number depends on the filesystem @dir is on.
|
|
*
|
|
* The code uses link(2) to create hard links to a single file until it gets
|
|
* EMLINK or creates 65535 links.
|
|
*
|
|
* If limit is hit maximal number of hardlinks is returned and the the @dir is
|
|
* filled with hardlinks in format "testfile%i" where i belongs to [0, limit)
|
|
* interval.
|
|
*
|
|
* If no limit is hit (succed to create 65535 without error) or if link()
|
|
* failed with ENOSPC or EDQUOT zero is returned previously created files are
|
|
* removed.
|
|
*/
|
|
int tst_fs_fill_hardlinks_(void (*cleanup) (void), const char *dir);
|
|
|
|
/*
|
|
* Try to get maximum number of subdirectories in directory.
|
|
*
|
|
* Note: This number depends on the filesystem @dir is on.
|
|
*
|
|
* The code uses mkdir(2) to create directories in @dir until it gets EMLINK
|
|
* or creates 65535 directories.
|
|
*
|
|
* If limit is hit the maximal number of subdirectories is returned and the
|
|
* @dir is filled with subdirectories in format "testdir%i" where i belongs to
|
|
* [0, limit - 2) interval (because each newly created dir has two links
|
|
* already the '.' and link from parent dir).
|
|
*
|
|
* If no limit is hit or mkdir() failed with ENOSPC or EDQUOT zero is returned
|
|
* previously created directories are removed.
|
|
*
|
|
*/
|
|
int tst_fs_fill_subdirs_(void (*cleanup) (void), const char *dir);
|
|
|
|
/*
|
|
* Checks if a given directory contains any entities,
|
|
* returns 1 if directory is empty, 0 otherwise
|
|
*/
|
|
int tst_dir_is_empty_(void (*cleanup)(void), const char *name, int verbose);
|
|
|
|
/*
|
|
* Search $PATH for prog_name and fills buf with absolute path if found.
|
|
*
|
|
* Returns -1 on failure, either command was not found or buffer was too small.
|
|
*/
|
|
int tst_get_path(const char *prog_name, char *buf, size_t buf_len);
|
|
|
|
/*
|
|
* Fill a file with specified pattern
|
|
* @fd: file descriptor
|
|
* @pattern: pattern
|
|
* @bs: block size
|
|
* @bcount: blocks count
|
|
*/
|
|
int tst_fill_fd(int fd, char pattern, size_t bs, size_t bcount);
|
|
|
|
/*
|
|
* Creates/ovewrites a file with specified pattern
|
|
* @path: path to file
|
|
* @pattern: pattern
|
|
* @bs: block size
|
|
* @bcount: blocks amount
|
|
*/
|
|
int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
|
|
|
|
#define TST_FS_SKIP_FUSE 0x01
|
|
|
|
/*
|
|
* Return 1 if a specified fiilsystem is supported
|
|
* Return 0 if a specified fiilsystem isn't supported
|
|
*/
|
|
int tst_fs_is_supported(const char *fs_type, int flags);
|
|
|
|
/*
|
|
* Returns NULL-terminated array of kernel-supported filesystems.
|
|
*/
|
|
const char **tst_get_supported_fs_types(int flags);
|
|
|
|
/*
|
|
* Creates and writes to files on given path until write fails with ENOSPC
|
|
*/
|
|
void tst_fill_fs(const char *path, int verbose);
|
|
|
|
/*
|
|
* test if FIBMAP ioctl is supported
|
|
*/
|
|
int tst_fibmap(const char *filename);
|
|
|
|
#ifdef TST_TEST_H__
|
|
static inline long tst_fs_type(const char *path)
|
|
{
|
|
return tst_fs_type_(NULL, path);
|
|
}
|
|
|
|
static inline int tst_fs_has_free(const char *path, unsigned int size,
|
|
unsigned int mult)
|
|
{
|
|
return tst_fs_has_free_(NULL, path, size, mult);
|
|
}
|
|
|
|
static inline int tst_fs_fill_hardlinks(const char *dir)
|
|
{
|
|
return tst_fs_fill_hardlinks_(NULL, dir);
|
|
}
|
|
|
|
static inline int tst_fs_fill_subdirs(const char *dir)
|
|
{
|
|
return tst_fs_fill_subdirs_(NULL, dir);
|
|
}
|
|
|
|
static inline int tst_dir_is_empty(const char *name, int verbose)
|
|
{
|
|
return tst_dir_is_empty_(NULL, name, verbose);
|
|
}
|
|
#else
|
|
static inline long tst_fs_type(void (*cleanup)(void), const char *path)
|
|
{
|
|
return tst_fs_type_(cleanup, path);
|
|
}
|
|
|
|
static inline int tst_fs_has_free(void (*cleanup)(void), const char *path,
|
|
unsigned int size, unsigned int mult)
|
|
{
|
|
return tst_fs_has_free_(cleanup, path, size, mult);
|
|
}
|
|
|
|
static inline int tst_fs_fill_hardlinks(void (*cleanup)(void), const char *dir)
|
|
{
|
|
return tst_fs_fill_hardlinks_(cleanup, dir);
|
|
}
|
|
|
|
static inline int tst_fs_fill_subdirs(void (*cleanup)(void), const char *dir)
|
|
{
|
|
return tst_fs_fill_subdirs_(cleanup, dir);
|
|
}
|
|
|
|
static inline int tst_dir_is_empty(void (*cleanup)(void), const char *name, int verbose)
|
|
{
|
|
return tst_dir_is_empty_(cleanup, name, verbose);
|
|
}
|
|
#endif
|
|
|
|
#endif /* TST_FS_H__ */
|