summaryrefslogtreecommitdiffstats
path: root/block/bio.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2015-05-22 17:13:24 -0400
committerJens Axboe <axboe@fb.com>2015-06-02 10:33:34 -0400
commit1d933cf096e3aea15f1aec8297657b7a846fab63 (patch)
tree43ac4eff222da7ef5c873259462d906f9e3f9a7b /block/bio.c
parentfd383c2d3cae146337cea809de0d622b8b887e6c (diff)
blkcg: implement bio_associate_blkcg()
Currently, a bio can only be associated with the io_context and blkcg of %current using bio_associate_current(). This is too restrictive for cgroup writeback support. Implement bio_associate_blkcg() which associates a bio with the specified blkcg. bio_associate_blkcg() leaves the io_context unassociated. bio_associate_current() is updated so that it considers a bio as already associated if it has a blkcg_css, instead of an io_context, associated with it. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/bio.c')
-rw-r--r--block/bio.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/block/bio.c b/block/bio.c
index c4f87018fb79..2a00d349cd68 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1988,6 +1988,28 @@ struct bio_set *bioset_create_nobvec(unsigned int pool_size, unsigned int front_
1988EXPORT_SYMBOL(bioset_create_nobvec); 1988EXPORT_SYMBOL(bioset_create_nobvec);
1989 1989
1990#ifdef CONFIG_BLK_CGROUP 1990#ifdef CONFIG_BLK_CGROUP
1991
1992/**
1993 * bio_associate_blkcg - associate a bio with the specified blkcg
1994 * @bio: target bio
1995 * @blkcg_css: css of the blkcg to associate
1996 *
1997 * Associate @bio with the blkcg specified by @blkcg_css. Block layer will
1998 * treat @bio as if it were issued by a task which belongs to the blkcg.
1999 *
2000 * This function takes an extra reference of @blkcg_css which will be put
2001 * when @bio is released. The caller must own @bio and is responsible for
2002 * synchronizing calls to this function.
2003 */
2004int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css)
2005{
2006 if (unlikely(bio->bi_css))
2007 return -EBUSY;
2008 css_get(blkcg_css);
2009 bio->bi_css = blkcg_css;
2010 return 0;
2011}
2012
1991/** 2013/**
1992 * bio_associate_current - associate a bio with %current 2014 * bio_associate_current - associate a bio with %current
1993 * @bio: target bio 2015 * @bio: target bio
@@ -2005,7 +2027,7 @@ int bio_associate_current(struct bio *bio)
2005{ 2027{
2006 struct io_context *ioc; 2028 struct io_context *ioc;
2007 2029
2008 if (bio->bi_ioc) 2030 if (bio->bi_css)
2009 return -EBUSY; 2031 return -EBUSY;
2010 2032
2011 ioc = current->io_context; 2033 ioc = current->io_context;