diff options
Diffstat (limited to 'include/linux/iocontext.h')
-rw-r--r-- | include/linux/iocontext.h | 22 |
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 | */ |
61 | struct io_context { | 60 | struct 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 | ||
81 | static 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 |