summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/bio.h14
-rw-r--r--include/linux/blk_types.h24
-rw-r--r--include/linux/blkdev.h3
-rw-r--r--include/linux/bug.h2
-rw-r--r--include/linux/time64.h15
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 */