|
@@ -1232,7 +1232,7 @@ xlog_alloc_log(xfs_mount_t *mp,
|
|
|
|
|
|
spin_lock_init(&log->l_icloglock);
|
|
|
spin_lock_init(&log->l_grant_lock);
|
|
|
- initnsema(&log->l_flushsema, 0, "ic-flush");
|
|
|
+ sv_init(&log->l_flush_wait, 0, "flush_wait");
|
|
|
|
|
|
/* log record size must be multiple of BBSIZE; see xlog_rec_header_t */
|
|
|
ASSERT((XFS_BUF_SIZE(bp) & BBMASK) == 0);
|
|
@@ -1577,7 +1577,6 @@ xlog_dealloc_log(xlog_t *log)
|
|
|
kmem_free(iclog);
|
|
|
iclog = next_iclog;
|
|
|
}
|
|
|
- freesema(&log->l_flushsema);
|
|
|
spinlock_destroy(&log->l_icloglock);
|
|
|
spinlock_destroy(&log->l_grant_lock);
|
|
|
|
|
@@ -2101,6 +2100,7 @@ xlog_state_do_callback(
|
|
|
int funcdidcallbacks; /* flag: function did callbacks */
|
|
|
int repeats; /* for issuing console warnings if
|
|
|
* looping too many times */
|
|
|
+ int wake = 0;
|
|
|
|
|
|
spin_lock(&log->l_icloglock);
|
|
|
first_iclog = iclog = log->l_iclog;
|
|
@@ -2282,15 +2282,13 @@ xlog_state_do_callback(
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- flushcnt = 0;
|
|
|
- if (log->l_iclog->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_IOERROR)) {
|
|
|
- flushcnt = log->l_flushcnt;
|
|
|
- log->l_flushcnt = 0;
|
|
|
- }
|
|
|
+ if (log->l_iclog->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_IOERROR))
|
|
|
+ wake = 1;
|
|
|
spin_unlock(&log->l_icloglock);
|
|
|
- while (flushcnt--)
|
|
|
- vsema(&log->l_flushsema);
|
|
|
-} /* xlog_state_do_callback */
|
|
|
+
|
|
|
+ if (wake)
|
|
|
+ sv_broadcast(&log->l_flush_wait);
|
|
|
+}
|
|
|
|
|
|
|
|
|
/*
|
|
@@ -2388,16 +2386,15 @@ restart:
|
|
|
}
|
|
|
|
|
|
iclog = log->l_iclog;
|
|
|
- if (! (iclog->ic_state == XLOG_STATE_ACTIVE)) {
|
|
|
- log->l_flushcnt++;
|
|
|
- spin_unlock(&log->l_icloglock);
|
|
|
+ if (iclog->ic_state != XLOG_STATE_ACTIVE) {
|
|
|
xlog_trace_iclog(iclog, XLOG_TRACE_SLEEP_FLUSH);
|
|
|
XFS_STATS_INC(xs_log_noiclogs);
|
|
|
- /* Ensure that log writes happen */
|
|
|
- psema(&log->l_flushsema, PINOD);
|
|
|
+
|
|
|
+ /* Wait for log writes to have flushed */
|
|
|
+ sv_wait(&log->l_flush_wait, 0, &log->l_icloglock, 0);
|
|
|
goto restart;
|
|
|
}
|
|
|
- ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
|
|
|
+
|
|
|
head = &iclog->ic_header;
|
|
|
|
|
|
atomic_inc(&iclog->ic_refcnt); /* prevents sync */
|