|
@@ -259,7 +259,7 @@ err_free_blkg:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * blkg_lookup_create - lookup blkg, try to create one if not there
|
|
|
+ * __blkg_lookup_create - lookup blkg, try to create one if not there
|
|
|
* @blkcg: blkcg of interest
|
|
|
* @q: request_queue of interest
|
|
|
*
|
|
@@ -272,8 +272,8 @@ err_free_blkg:
|
|
|
* value on error. If @q is dead, returns ERR_PTR(-EINVAL). If @q is not
|
|
|
* dead and bypassing, returns ERR_PTR(-EBUSY).
|
|
|
*/
|
|
|
-struct blkcg_gq *blkg_lookup_create(struct blkcg *blkcg,
|
|
|
- struct request_queue *q)
|
|
|
+struct blkcg_gq *__blkg_lookup_create(struct blkcg *blkcg,
|
|
|
+ struct request_queue *q)
|
|
|
{
|
|
|
struct blkcg_gq *blkg;
|
|
|
|
|
@@ -310,6 +310,31 @@ struct blkcg_gq *blkg_lookup_create(struct blkcg *blkcg,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * blkg_lookup_create - find or create a blkg
|
|
|
+ * @blkcg: target block cgroup
|
|
|
+ * @q: target request_queue
|
|
|
+ *
|
|
|
+ * This looks up or creates the blkg representing the unique pair
|
|
|
+ * of the blkcg and the request_queue.
|
|
|
+ */
|
|
|
+struct blkcg_gq *blkg_lookup_create(struct blkcg *blkcg,
|
|
|
+ struct request_queue *q)
|
|
|
+{
|
|
|
+ struct blkcg_gq *blkg = blkg_lookup(blkcg, q);
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ if (unlikely(!blkg)) {
|
|
|
+ spin_lock_irqsave(q->queue_lock, flags);
|
|
|
+
|
|
|
+ blkg = __blkg_lookup_create(blkcg, q);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(q->queue_lock, flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ return blkg;
|
|
|
+}
|
|
|
+
|
|
|
static void blkg_destroy(struct blkcg_gq *blkg)
|
|
|
{
|
|
|
struct blkcg *blkcg = blkg->blkcg;
|