2017-01-08 12:13:18 +03:00
|
|
|
#ifndef __TOOLS_LINUX_BLKDEV_H
|
|
|
|
#define __TOOLS_LINUX_BLKDEV_H
|
|
|
|
|
|
|
|
#include <linux/backing-dev.h>
|
|
|
|
#include <linux/blk_types.h>
|
2017-03-11 00:40:01 +03:00
|
|
|
#include <linux/kobject.h>
|
2017-04-04 11:28:13 +03:00
|
|
|
#include <linux/types.h>
|
2017-01-08 12:13:18 +03:00
|
|
|
|
2021-10-16 22:41:43 +03:00
|
|
|
#define BIO_MAX_VECS 256U
|
2018-11-23 11:04:34 +03:00
|
|
|
|
2017-01-08 12:13:18 +03:00
|
|
|
typedef unsigned fmode_t;
|
|
|
|
|
|
|
|
struct bio;
|
|
|
|
struct user_namespace;
|
|
|
|
|
|
|
|
#define MINORBITS 20
|
|
|
|
#define MINORMASK ((1U << MINORBITS) - 1)
|
|
|
|
|
|
|
|
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
|
|
|
|
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
|
|
|
|
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
|
|
|
|
|
|
|
|
/* file is open for reading */
|
|
|
|
#define FMODE_READ ((__force fmode_t)0x1)
|
|
|
|
/* file is open for writing */
|
|
|
|
#define FMODE_WRITE ((__force fmode_t)0x2)
|
|
|
|
/* file is seekable */
|
|
|
|
#define FMODE_LSEEK ((__force fmode_t)0x4)
|
|
|
|
/* file can be accessed using pread */
|
|
|
|
#define FMODE_PREAD ((__force fmode_t)0x8)
|
|
|
|
/* file can be accessed using pwrite */
|
|
|
|
#define FMODE_PWRITE ((__force fmode_t)0x10)
|
|
|
|
/* File is opened for execution with sys_execve / sys_uselib */
|
|
|
|
#define FMODE_EXEC ((__force fmode_t)0x20)
|
|
|
|
/* File is opened with O_NDELAY (only set for block devices) */
|
|
|
|
#define FMODE_NDELAY ((__force fmode_t)0x40)
|
|
|
|
/* File is opened with O_EXCL (only set for block devices) */
|
|
|
|
#define FMODE_EXCL ((__force fmode_t)0x80)
|
|
|
|
/* File is opened using open(.., 3, ..) and is writeable only for ioctls
|
|
|
|
(specialy hack for floppy.c) */
|
|
|
|
#define FMODE_WRITE_IOCTL ((__force fmode_t)0x100)
|
|
|
|
/* 32bit hashes as llseek() offset (for directories) */
|
|
|
|
#define FMODE_32BITHASH ((__force fmode_t)0x200)
|
|
|
|
/* 64bit hashes as llseek() offset (for directories) */
|
|
|
|
#define FMODE_64BITHASH ((__force fmode_t)0x400)
|
|
|
|
|
|
|
|
struct inode {
|
|
|
|
unsigned long i_ino;
|
|
|
|
loff_t i_size;
|
|
|
|
struct super_block *i_sb;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct file {
|
|
|
|
struct inode *f_inode;
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline struct inode *file_inode(const struct file *f)
|
|
|
|
{
|
|
|
|
return f->f_inode;
|
|
|
|
}
|
|
|
|
|
2017-03-11 00:40:01 +03:00
|
|
|
#define part_to_dev(part) (part)
|
|
|
|
|
2017-01-08 12:13:18 +03:00
|
|
|
void generic_make_request(struct bio *);
|
|
|
|
int submit_bio_wait(struct bio *);
|
2017-03-20 02:56:34 +03:00
|
|
|
|
|
|
|
static inline void submit_bio(struct bio *bio)
|
|
|
|
{
|
|
|
|
generic_make_request(bio);
|
|
|
|
}
|
|
|
|
|
2017-01-08 12:13:18 +03:00
|
|
|
int blkdev_issue_discard(struct block_device *, sector_t,
|
|
|
|
sector_t, gfp_t, unsigned long);
|
|
|
|
|
|
|
|
#define bdev_get_queue(bdev) (&((bdev)->queue))
|
|
|
|
|
2021-11-04 04:24:52 +03:00
|
|
|
#ifndef SECTOR_SHIFT
|
|
|
|
#define SECTOR_SHIFT 9
|
|
|
|
#endif
|
|
|
|
#ifndef SECTOR_SIZE
|
|
|
|
#define SECTOR_SIZE (1 << SECTOR_SHIFT)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PAGE_SECTORS_SHIFT (PAGE_SHIFT - SECTOR_SHIFT)
|
|
|
|
#define PAGE_SECTORS (1 << PAGE_SECTORS_SHIFT)
|
|
|
|
#define SECTOR_MASK (PAGE_SECTORS - 1)
|
|
|
|
|
2017-01-08 12:13:18 +03:00
|
|
|
#define blk_queue_discard(q) ((void) (q), 0)
|
|
|
|
#define blk_queue_nonrot(q) ((void) (q), 0)
|
|
|
|
|
|
|
|
unsigned bdev_logical_block_size(struct block_device *bdev);
|
|
|
|
sector_t get_capacity(struct gendisk *disk);
|
|
|
|
|
|
|
|
void blkdev_put(struct block_device *bdev, fmode_t mode);
|
|
|
|
void bdput(struct block_device *bdev);
|
|
|
|
struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, void *holder);
|
2021-04-30 23:48:21 +03:00
|
|
|
int lookup_bdev(const char *path, dev_t *);
|
2017-01-08 12:13:18 +03:00
|
|
|
|
|
|
|
struct super_block {
|
|
|
|
void *s_fs_info;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* File types
|
|
|
|
*
|
|
|
|
* NOTE! These match bits 12..15 of stat.st_mode
|
|
|
|
* (ie "(i_mode >> 12) & 15").
|
|
|
|
*/
|
2017-03-01 13:45:15 +03:00
|
|
|
#ifndef DT_UNKNOWN
|
2017-01-08 12:13:18 +03:00
|
|
|
#define DT_UNKNOWN 0
|
|
|
|
#define DT_FIFO 1
|
|
|
|
#define DT_CHR 2
|
|
|
|
#define DT_DIR 4
|
|
|
|
#define DT_BLK 6
|
|
|
|
#define DT_REG 8
|
|
|
|
#define DT_LNK 10
|
|
|
|
#define DT_SOCK 12
|
|
|
|
#define DT_WHT 14
|
2021-07-13 23:31:40 +03:00
|
|
|
#define DT_MAX 16
|
2017-03-01 13:45:15 +03:00
|
|
|
#endif
|
2017-01-08 12:13:18 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This is the "filldir" function type, used by readdir() to let
|
|
|
|
* the kernel specify what kind of dirent layout it wants to have.
|
|
|
|
* This allows the kernel to read directories into kernel space or
|
|
|
|
* to have different dirent layouts depending on the binary type.
|
|
|
|
*/
|
|
|
|
struct dir_context;
|
|
|
|
typedef int (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64,
|
|
|
|
unsigned);
|
|
|
|
|
|
|
|
struct dir_context {
|
|
|
|
const filldir_t actor;
|
|
|
|
u64 pos;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* /sys/fs */
|
|
|
|
extern struct kobject *fs_kobj;
|
|
|
|
|
|
|
|
struct file_operations {
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline int register_chrdev(unsigned int major, const char *name,
|
|
|
|
const struct file_operations *fops)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void unregister_chrdev(unsigned int major, const char *name)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline const char *bdevname(struct block_device *bdev, char *buf)
|
|
|
|
{
|
|
|
|
snprintf(buf, BDEVNAME_SIZE, "%s", bdev->name);
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool op_is_write(unsigned int op)
|
|
|
|
{
|
|
|
|
return op == REQ_OP_READ ? false : true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* return data direction, READ or WRITE
|
|
|
|
*/
|
|
|
|
static inline int bio_data_dir(struct bio *bio)
|
|
|
|
{
|
|
|
|
return op_is_write(bio_op(bio)) ? WRITE : READ;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool dir_emit(struct dir_context *ctx,
|
|
|
|
const char *name, int namelen,
|
|
|
|
u64 ino, unsigned type)
|
|
|
|
{
|
|
|
|
return ctx->actor(ctx, name, namelen, ctx->pos, ino, type) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool dir_emit_dots(struct file *file, struct dir_context *ctx)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define capable(cap) true
|
|
|
|
|
2017-12-22 02:00:30 +03:00
|
|
|
int blk_status_to_errno(blk_status_t status);
|
|
|
|
blk_status_t errno_to_blk_status(int errno);
|
2020-08-24 23:05:04 +03:00
|
|
|
const char *blk_status_to_str(blk_status_t status);
|
2017-12-22 02:00:30 +03:00
|
|
|
|
2017-01-08 12:13:18 +03:00
|
|
|
#endif /* __TOOLS_LINUX_BLKDEV_H */
|
|
|
|
|