summaryrefslogtreecommitdiffstats
path: root/include/linux/iocontext.h
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2012-03-05 13:15:25 -0800
committerJens Axboe <axboe@kernel.dk>2012-03-06 21:27:24 +0100
commit3d48749d93a3dce732dd30a14002ab90ec4355f3 (patch)
tree50ce414ec87e590493476cf644092439c5f337fd /include/linux/iocontext.h
parent24acfc34fba0b4f62ef9d5c2616eb0faa802b606 (diff)
downloadlinux-3d48749d93a3dce732dd30a14002ab90ec4355f3.tar.gz
linux-3d48749d93a3dce732dd30a14002ab90ec4355f3.tar.bz2
linux-3d48749d93a3dce732dd30a14002ab90ec4355f3.zip
block: ioc_task_link() can't fail
ioc_task_link() is used to share %current's ioc on clone. If %current->io_context is set, %current is guaranteed to have refcount on the ioc and, thus, ioc_task_link() can't fail. Replace error checking in ioc_task_link() with WARN_ON_ONCE() and make it just increment refcount and nr_tasks. -v2: Description typo fix (Vivek). Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'include/linux/iocontext.h')
-rw-r--r--include/linux/iocontext.h16
1 files changed, 5 insertions, 11 deletions
diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h
index 1a3018063034..81a8870ac224 100644
--- a/include/linux/iocontext.h
+++ b/include/linux/iocontext.h
@@ -120,18 +120,12 @@ struct io_context {
struct work_struct release_work;
};
-static inline struct io_context *ioc_task_link(struct io_context *ioc)
+static inline void ioc_task_link(struct io_context *ioc)
{
- /*
- * if ref count is zero, don't allow sharing (ioc is going away, it's
- * a race).
- */
- if (ioc && atomic_long_inc_not_zero(&ioc->refcount)) {
- atomic_inc(&ioc->nr_tasks);
- return ioc;
- }
-
- return NULL;
+ WARN_ON_ONCE(atomic_long_read(&ioc->refcount) <= 0);
+ WARN_ON_ONCE(atomic_read(&ioc->nr_tasks) <= 0);
+ atomic_long_inc(&ioc->refcount);
+ atomic_inc(&ioc->nr_tasks);
}
struct task_struct;