aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/iocontext.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/iocontext.h')
-rw-r--r--include/linux/iocontext.h22
1 files changed, 18 insertions, 4 deletions
diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h
index 186807ea62e2..cd44d458124a 100644
--- a/include/linux/iocontext.h
+++ b/include/linux/iocontext.h
@@ -54,13 +54,15 @@ struct cfq_io_context {
54}; 54};
55 55
56/* 56/*
57 * This is the per-process I/O subsystem state. It is refcounted and 57 * I/O subsystem state of the associated processes. It is refcounted
58 * kmalloc'ed. Currently all fields are modified in process io context 58 * and kmalloc'ed. These could be shared between processes.
59 * (apart from the atomic refcount), so require no locking.
60 */ 59 */
61struct io_context { 60struct io_context {
62 atomic_t refcount; 61 atomic_t refcount;
63 struct task_struct *task; 62 atomic_t nr_tasks;
63
64 /* all the fields below are protected by this lock */
65 spinlock_t lock;
64 66
65 unsigned short ioprio; 67 unsigned short ioprio;
66 unsigned short ioprio_changed; 68 unsigned short ioprio_changed;
@@ -76,4 +78,16 @@ struct io_context {
76 void *ioc_data; 78 void *ioc_data;
77}; 79};
78 80
81static inline struct io_context *ioc_task_link(struct io_context *ioc)
82{
83 /*
84 * if ref count is zero, don't allow sharing (ioc is going away, it's
85 * a race).
86 */
87 if (ioc && atomic_inc_not_zero(&ioc->refcount))
88 return ioc;
89
90 return NULL;
91}
92
79#endif 93#endif