#ifndef IOCONTEXT_H
#define IOCONTEXT_H
+#include <linux/radix-tree.h>
+#include <linux/rcupdate.h>
+
/*
* This is the per-process anticipatory I/O scheduler state.
*/
struct cfq_queue;
struct cfq_io_context {
- struct rb_node rb_node;
void *key;
+ unsigned long dead_key;
struct cfq_queue *cfqq[2];
sector_t seek_mean;
struct list_head queue_list;
+ struct hlist_node cic_list;
void (*dtor)(struct io_context *); /* destructor */
void (*exit)(struct io_context *); /* called on task exit */
+
+ struct rcu_head rcu_head;
};
/*
int nr_batch_requests; /* Number of requests left in the batch */
struct as_io_context *aic;
- struct rb_root cic_root;
+ struct radix_tree_root radix_root;
+ struct hlist_head cic_list;
void *ioc_data;
};
* if ref count is zero, don't allow sharing (ioc is going away, it's
* a race).
*/
- if (ioc && atomic_inc_not_zero(&ioc->refcount))
+ if (ioc && atomic_inc_not_zero(&ioc->refcount)) {
+ atomic_inc(&ioc->nr_tasks);
return ioc;
+ }
return NULL;
}
+#ifdef CONFIG_BLOCK
+int put_io_context(struct io_context *ioc);
+void exit_io_context(void);
+struct io_context *get_io_context(gfp_t gfp_flags, int node);
+struct io_context *alloc_io_context(gfp_t gfp_flags, int node);
+void copy_io_context(struct io_context **pdst, struct io_context **psrc);
+#else
+static inline void exit_io_context(void)
+{
+}
+
+struct io_context;
+static inline int put_io_context(struct io_context *ioc)
+{
+ return 1;
+}
+#endif
+
#endif