summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_log.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2012-02-20 02:31:29 +0000
committerBen Myers <bpm@sgi.com>2012-02-22 22:31:45 -0600
commite179840d74606ab1935c83fe5ad9d93c95ddc956 (patch)
tree47899d69dd92e2e804c7cf47f9cc53abdafdf335 /fs/xfs/xfs_log.c
parent23ee3df349b8b8fd153bd02fccf08b31aec5bce3 (diff)
downloadlwn-e179840d74606ab1935c83fe5ad9d93c95ddc956.tar.gz
lwn-e179840d74606ab1935c83fe5ad9d93c95ddc956.zip
xfs: share code for grant head wakeups
Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r--fs/xfs/xfs_log.c50
1 files changed, 20 insertions, 30 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index c2d13827582b..685997548fb8 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -171,49 +171,39 @@ xlog_grant_head_wake_all(
spin_unlock(&head->lock);
}
-STATIC bool
-xlog_reserveq_wake(
+static inline int
+xlog_ticket_reservation(
struct log *log,
- int *free_bytes)
+ struct xlog_grant_head *head,
+ struct xlog_ticket *tic)
{
- struct xlog_ticket *tic;
- int need_bytes;
-
- list_for_each_entry(tic, &log->l_reserve_head.waiters, t_queue) {
+ if (head == &log->l_write_head) {
+ ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
+ return tic->t_unit_res;
+ } else {
if (tic->t_flags & XLOG_TIC_PERM_RESERV)
- need_bytes = tic->t_unit_res * tic->t_cnt;
+ return tic->t_unit_res * tic->t_cnt;
else
- need_bytes = tic->t_unit_res;
-
- if (*free_bytes < need_bytes)
- return false;
- *free_bytes -= need_bytes;
-
- trace_xfs_log_grant_wake_up(log, tic);
- wake_up_process(tic->t_task);
+ return tic->t_unit_res;
}
-
- return true;
}
STATIC bool
-xlog_writeq_wake(
+xlog_grant_head_wake(
struct log *log,
+ struct xlog_grant_head *head,
int *free_bytes)
{
struct xlog_ticket *tic;
int need_bytes;
- list_for_each_entry(tic, &log->l_write_head.waiters, t_queue) {
- ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
-
- need_bytes = tic->t_unit_res;
-
+ list_for_each_entry(tic, &head->waiters, t_queue) {
+ need_bytes = xlog_ticket_reservation(log, head, tic);
if (*free_bytes < need_bytes)
return false;
- *free_bytes -= need_bytes;
- trace_xfs_log_regrant_write_wake_up(log, tic);
+ *free_bytes -= need_bytes;
+ trace_xfs_log_grant_wake_up(log, tic);
wake_up_process(tic->t_task);
}
@@ -772,7 +762,7 @@ xfs_log_space_wake(
spin_lock(&log->l_write_head.lock);
free_bytes = xlog_space_left(log, &log->l_write_head.grant);
- xlog_writeq_wake(log, &free_bytes);
+ xlog_grant_head_wake(log, &log->l_write_head, &free_bytes);
spin_unlock(&log->l_write_head.lock);
}
@@ -781,7 +771,7 @@ xfs_log_space_wake(
spin_lock(&log->l_reserve_head.lock);
free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
- xlog_reserveq_wake(log, &free_bytes);
+ xlog_grant_head_wake(log, &log->l_reserve_head, &free_bytes);
spin_unlock(&log->l_reserve_head.lock);
}
}
@@ -2562,7 +2552,7 @@ xlog_grant_log_space(
free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
if (!list_empty_careful(&log->l_reserve_head.waiters)) {
spin_lock(&log->l_reserve_head.lock);
- if (!xlog_reserveq_wake(log, &free_bytes) ||
+ if (!xlog_grant_head_wake(log, &log->l_reserve_head, &free_bytes) ||
free_bytes < need_bytes) {
error = xlog_grant_head_wait(log, &log->l_reserve_head,
tic, need_bytes);
@@ -2618,7 +2608,7 @@ xlog_regrant_write_log_space(
free_bytes = xlog_space_left(log, &log->l_write_head.grant);
if (!list_empty_careful(&log->l_write_head.waiters)) {
spin_lock(&log->l_write_head.lock);
- if (!xlog_writeq_wake(log, &free_bytes) ||
+ if (!xlog_grant_head_wake(log, &log->l_write_head, &free_bytes) ||
free_bytes < need_bytes) {
error = xlog_grant_head_wait(log, &log->l_write_head,
tic, need_bytes);