diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/bio.h | 14 | ||||
-rw-r--r-- | include/linux/blk_types.h | 24 | ||||
-rw-r--r-- | include/linux/blkdev.h | 3 | ||||
-rw-r--r-- | include/linux/bug.h | 2 | ||||
-rw-r--r-- | include/linux/time64.h | 15 |
5 files changed, 47 insertions, 11 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index 10cad5cc..7293eef0 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -243,7 +243,8 @@ static inline void bioset_free(struct bio_set *bs) static inline int bioset_init(struct bio_set *bs, unsigned pool_size, - unsigned front_pad) + unsigned front_pad, + int flags) { bs->front_pad = front_pad; return 0; @@ -251,6 +252,10 @@ static inline int bioset_init(struct bio_set *bs, extern struct bio_set *bioset_create(unsigned int, unsigned int); extern struct bio_set *bioset_create_nobvec(unsigned int, unsigned int); +enum { + BIOSET_NEED_BVECS = 1 << 0, + BIOSET_NEED_RESCUER = 1 << 1, +}; extern struct bio *bio_alloc_bioset(gfp_t, int, struct bio_set *); extern void bio_put(struct bio *); @@ -271,13 +276,6 @@ static inline struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask) } extern void bio_endio(struct bio *); -extern void bio_endio_nodec(struct bio *); - -static inline void bio_io_error(struct bio *bio) -{ - bio->bi_error = -EIO; - bio_endio(bio); -} extern void bio_advance(struct bio *, unsigned); diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 55179944..42cd0032 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -13,7 +13,27 @@ struct bio_set; struct bio; struct block_device; typedef void (bio_end_io_t) (struct bio *); -typedef void (bio_destructor_t) (struct bio *); + +/* + * Block error status values. See block/blk-core:blk_errors for the details. + */ +typedef u8 __bitwise blk_status_t; +#define BLK_STS_OK 0 +#define BLK_STS_NOTSUPP ((__force blk_status_t)1) +#define BLK_STS_TIMEOUT ((__force blk_status_t)2) +#define BLK_STS_NOSPC ((__force blk_status_t)3) +#define BLK_STS_TRANSPORT ((__force blk_status_t)4) +#define BLK_STS_TARGET ((__force blk_status_t)5) +#define BLK_STS_NEXUS ((__force blk_status_t)6) +#define BLK_STS_MEDIUM ((__force blk_status_t)7) +#define BLK_STS_PROTECTION ((__force blk_status_t)8) +#define BLK_STS_RESOURCE ((__force blk_status_t)9) +#define BLK_STS_IOERR ((__force blk_status_t)10) + +/* hack for device mapper, don't use elsewhere: */ +#define BLK_STS_DM_REQUEUE ((__force blk_status_t)11) + +#define BLK_STS_AGAIN ((__force blk_status_t)12) /* * main unit of I/O for the block layer and lower layers (ie drivers and @@ -22,7 +42,7 @@ typedef void (bio_destructor_t) (struct bio *); struct bio { struct bio *bi_next; /* request queue link */ struct block_device *bi_bdev; - int bi_error; + blk_status_t bi_status; unsigned int bi_opf; /* bottom bits req flags, * top bits REQ_OP. Use * accessors. diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f196c704..1d5581dc 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -197,5 +197,8 @@ static inline bool dir_emit_dots(struct file *file, struct dir_context *ctx) #define capable(cap) true +int blk_status_to_errno(blk_status_t status); +blk_status_t errno_to_blk_status(int errno); + #endif /* __TOOLS_LINUX_BLKDEV_H */ diff --git a/include/linux/bug.h b/include/linux/bug.h index 89cdd30d..e25568c8 100644 --- a/include/linux/bug.h +++ b/include/linux/bug.h @@ -14,7 +14,7 @@ #define BUG() do { assert(0); unreachable(); } while (0) #define BUG_ON(cond) assert(!(cond)) -#define WARN_ON_ONCE(cond) assert(!(cond)) +#define WARN_ON_ONCE(cond) ({ bool _r = (cond); if (_r) assert(0); _r; }) #define WARN_ONCE(cond, msg) ({ bool _r = (cond); if (_r) assert(0); _r; }) #define __WARN() assert(0) diff --git a/include/linux/time64.h b/include/linux/time64.h index 2d9f8291..870bdef4 100644 --- a/include/linux/time64.h +++ b/include/linux/time64.h @@ -204,4 +204,19 @@ static __always_inline void timespec64_add_ns(struct timespec64 *a, u64 ns) extern struct timespec64 timespec64_add_safe(const struct timespec64 lhs, const struct timespec64 rhs); +static inline struct timespec timespec_trunc(struct timespec t, unsigned gran) +{ + /* Avoid division in the common cases 1 ns and 1 s. */ + if (gran == 1) { + /* nothing */ + } else if (gran == NSEC_PER_SEC) { + t.tv_nsec = 0; + } else if (gran > 1 && gran < NSEC_PER_SEC) { + t.tv_nsec -= t.tv_nsec % gran; + } else { + WARN(1, "illegal file time granularity: %u", gran); + } + return t; +} + #endif /* _LINUX_TIME64_H */ |