xfs: share code for grant head waiting
authorChristoph Hellwig <hch@infradead.org>
Mon, 20 Feb 2012 02:31:28 +0000 (02:31 +0000)
committerBen Myers <bpm@sgi.com>
Thu, 23 Feb 2012 04:29:39 +0000 (22:29 -0600)
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>
fs/xfs/xfs_log.c
fs/xfs/xfs_trace.h

index a0d1376..c2d1382 100644 (file)
@@ -221,12 +221,13 @@ xlog_writeq_wake(
 }
 
 STATIC int
-xlog_reserveq_wait(
+xlog_grant_head_wait(
        struct log              *log,
+       struct xlog_grant_head  *head,
        struct xlog_ticket      *tic,
        int                     need_bytes)
 {
-       list_add_tail(&tic->t_queue, &log->l_reserve_head.waiters);
+       list_add_tail(&tic->t_queue, &head->waiters);
 
        do {
                if (XLOG_FORCED_SHUTDOWN(log))
@@ -234,7 +235,7 @@ xlog_reserveq_wait(
                xlog_grant_push_ail(log, need_bytes);
 
                __set_current_state(TASK_UNINTERRUPTIBLE);
-               spin_unlock(&log->l_reserve_head.lock);
+               spin_unlock(&head->lock);
 
                XFS_STATS_INC(xs_sleep_logspace);
 
@@ -242,44 +243,10 @@ xlog_reserveq_wait(
                schedule();
                trace_xfs_log_grant_wake(log, tic);
 
-               spin_lock(&log->l_reserve_head.lock);
+               spin_lock(&head->lock);
                if (XLOG_FORCED_SHUTDOWN(log))
                        goto shutdown;
-       } while (xlog_space_left(log, &log->l_reserve_head.grant) < need_bytes);
-
-       list_del_init(&tic->t_queue);
-       return 0;
-shutdown:
-       list_del_init(&tic->t_queue);
-       return XFS_ERROR(EIO);
-}
-
-STATIC int
-xlog_writeq_wait(
-       struct log              *log,
-       struct xlog_ticket      *tic,
-       int                     need_bytes)
-{
-       list_add_tail(&tic->t_queue, &log->l_write_head.waiters);
-
-       do {
-               if (XLOG_FORCED_SHUTDOWN(log))
-                       goto shutdown;
-               xlog_grant_push_ail(log, need_bytes);
-
-               __set_current_state(TASK_UNINTERRUPTIBLE);
-               spin_unlock(&log->l_write_head.lock);
-
-               XFS_STATS_INC(xs_sleep_logspace);
-
-               trace_xfs_log_regrant_write_sleep(log, tic);
-               schedule();
-               trace_xfs_log_regrant_write_wake(log, tic);
-
-               spin_lock(&log->l_write_head.lock);
-               if (XLOG_FORCED_SHUTDOWN(log))
-                       goto shutdown;
-       } while (xlog_space_left(log, &log->l_write_head.grant) < need_bytes);
+       } while (xlog_space_left(log, &head->grant) < need_bytes);
 
        list_del_init(&tic->t_queue);
        return 0;
@@ -2596,12 +2563,15 @@ xlog_grant_log_space(
        if (!list_empty_careful(&log->l_reserve_head.waiters)) {
                spin_lock(&log->l_reserve_head.lock);
                if (!xlog_reserveq_wake(log, &free_bytes) ||
-                   free_bytes < need_bytes)
-                       error = xlog_reserveq_wait(log, tic, need_bytes);
+                   free_bytes < need_bytes) {
+                       error = xlog_grant_head_wait(log, &log->l_reserve_head,
+                                                    tic, need_bytes);
+               }
                spin_unlock(&log->l_reserve_head.lock);
        } else if (free_bytes < need_bytes) {
                spin_lock(&log->l_reserve_head.lock);
-               error = xlog_reserveq_wait(log, tic, need_bytes);
+               error = xlog_grant_head_wait(log, &log->l_reserve_head, tic,
+                                            need_bytes);
                spin_unlock(&log->l_reserve_head.lock);
        }
        if (error)
@@ -2649,12 +2619,15 @@ xlog_regrant_write_log_space(
        if (!list_empty_careful(&log->l_write_head.waiters)) {
                spin_lock(&log->l_write_head.lock);
                if (!xlog_writeq_wake(log, &free_bytes) ||
-                   free_bytes < need_bytes)
-                       error = xlog_writeq_wait(log, tic, need_bytes);
+                   free_bytes < need_bytes) {
+                       error = xlog_grant_head_wait(log, &log->l_write_head,
+                                                    tic, need_bytes);
+               }
                spin_unlock(&log->l_write_head.lock);
        } else if (free_bytes < need_bytes) {
                spin_lock(&log->l_write_head.lock);
-               error = xlog_writeq_wait(log, tic, need_bytes);
+               error = xlog_grant_head_wait(log, &log->l_write_head, tic,
+                                            need_bytes);
                spin_unlock(&log->l_write_head.lock);
        }
 
index a80e308..7ee18e9 100644 (file)
@@ -837,8 +837,6 @@ DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake_up);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_enter);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_exit);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_error);
-DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep);
-DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake_up);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit);