diff options
Diffstat (limited to 'fs/xfs/xfs_log.c')
| -rw-r--r-- | fs/xfs/xfs_log.c | 86 |
1 files changed, 40 insertions, 46 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 91b00a5686cd..ccba14eb9dbe 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -160,7 +160,7 @@ void | |||
| 160 | xlog_trace_iclog(xlog_in_core_t *iclog, uint state) | 160 | xlog_trace_iclog(xlog_in_core_t *iclog, uint state) |
| 161 | { | 161 | { |
| 162 | if (!iclog->ic_trace) | 162 | if (!iclog->ic_trace) |
| 163 | iclog->ic_trace = ktrace_alloc(256, KM_SLEEP); | 163 | iclog->ic_trace = ktrace_alloc(256, KM_NOFS); |
| 164 | ktrace_enter(iclog->ic_trace, | 164 | ktrace_enter(iclog->ic_trace, |
| 165 | (void *)((unsigned long)state), | 165 | (void *)((unsigned long)state), |
| 166 | (void *)((unsigned long)current_pid()), | 166 | (void *)((unsigned long)current_pid()), |
| @@ -336,15 +336,12 @@ xfs_log_done(xfs_mount_t *mp, | |||
| 336 | } else { | 336 | } else { |
| 337 | xlog_trace_loggrant(log, ticket, "xfs_log_done: (permanent)"); | 337 | xlog_trace_loggrant(log, ticket, "xfs_log_done: (permanent)"); |
| 338 | xlog_regrant_reserve_log_space(log, ticket); | 338 | xlog_regrant_reserve_log_space(log, ticket); |
| 339 | } | 339 | /* If this ticket was a permanent reservation and we aren't |
| 340 | 340 | * trying to release it, reset the inited flags; so next time | |
| 341 | /* If this ticket was a permanent reservation and we aren't | 341 | * we write, a start record will be written out. |
| 342 | * trying to release it, reset the inited flags; so next time | 342 | */ |
| 343 | * we write, a start record will be written out. | ||
| 344 | */ | ||
| 345 | if ((ticket->t_flags & XLOG_TIC_PERM_RESERV) && | ||
| 346 | (flags & XFS_LOG_REL_PERM_RESERV) == 0) | ||
| 347 | ticket->t_flags |= XLOG_TIC_INITED; | 343 | ticket->t_flags |= XLOG_TIC_INITED; |
| 344 | } | ||
| 348 | 345 | ||
| 349 | return lsn; | 346 | return lsn; |
| 350 | } /* xfs_log_done */ | 347 | } /* xfs_log_done */ |
| @@ -357,11 +354,11 @@ xfs_log_done(xfs_mount_t *mp, | |||
| 357 | * Asynchronous forces are implemented by setting the WANT_SYNC | 354 | * Asynchronous forces are implemented by setting the WANT_SYNC |
| 358 | * bit in the appropriate in-core log and then returning. | 355 | * bit in the appropriate in-core log and then returning. |
| 359 | * | 356 | * |
| 360 | * Synchronous forces are implemented with a semaphore. All callers | 357 | * Synchronous forces are implemented with a signal variable. All callers |
| 361 | * to force a given lsn to disk will wait on a semaphore attached to the | 358 | * to force a given lsn to disk will wait on a the sv attached to the |
| 362 | * specific in-core log. When given in-core log finally completes its | 359 | * specific in-core log. When given in-core log finally completes its |
| 363 | * write to disk, that thread will wake up all threads waiting on the | 360 | * write to disk, that thread will wake up all threads waiting on the |
| 364 | * semaphore. | 361 | * sv. |
| 365 | */ | 362 | */ |
| 366 | int | 363 | int |
| 367 | _xfs_log_force( | 364 | _xfs_log_force( |
| @@ -588,12 +585,12 @@ error: | |||
| 588 | * mp - ubiquitous xfs mount point structure | 585 | * mp - ubiquitous xfs mount point structure |
| 589 | */ | 586 | */ |
| 590 | int | 587 | int |
| 591 | xfs_log_mount_finish(xfs_mount_t *mp, int mfsi_flags) | 588 | xfs_log_mount_finish(xfs_mount_t *mp) |
| 592 | { | 589 | { |
| 593 | int error; | 590 | int error; |
| 594 | 591 | ||
| 595 | if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) | 592 | if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) |
| 596 | error = xlog_recover_finish(mp->m_log, mfsi_flags); | 593 | error = xlog_recover_finish(mp->m_log); |
| 597 | else { | 594 | else { |
| 598 | error = 0; | 595 | error = 0; |
| 599 | ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); | 596 | ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); |
| @@ -707,7 +704,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
| 707 | if (!(iclog->ic_state == XLOG_STATE_ACTIVE || | 704 | if (!(iclog->ic_state == XLOG_STATE_ACTIVE || |
| 708 | iclog->ic_state == XLOG_STATE_DIRTY)) { | 705 | iclog->ic_state == XLOG_STATE_DIRTY)) { |
| 709 | if (!XLOG_FORCED_SHUTDOWN(log)) { | 706 | if (!XLOG_FORCED_SHUTDOWN(log)) { |
| 710 | sv_wait(&iclog->ic_forcesema, PMEM, | 707 | sv_wait(&iclog->ic_force_wait, PMEM, |
| 711 | &log->l_icloglock, s); | 708 | &log->l_icloglock, s); |
| 712 | } else { | 709 | } else { |
| 713 | spin_unlock(&log->l_icloglock); | 710 | spin_unlock(&log->l_icloglock); |
| @@ -748,7 +745,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
| 748 | || iclog->ic_state == XLOG_STATE_DIRTY | 745 | || iclog->ic_state == XLOG_STATE_DIRTY |
| 749 | || iclog->ic_state == XLOG_STATE_IOERROR) ) { | 746 | || iclog->ic_state == XLOG_STATE_IOERROR) ) { |
| 750 | 747 | ||
| 751 | sv_wait(&iclog->ic_forcesema, PMEM, | 748 | sv_wait(&iclog->ic_force_wait, PMEM, |
| 752 | &log->l_icloglock, s); | 749 | &log->l_icloglock, s); |
| 753 | } else { | 750 | } else { |
| 754 | spin_unlock(&log->l_icloglock); | 751 | spin_unlock(&log->l_icloglock); |
| @@ -838,7 +835,7 @@ xfs_log_move_tail(xfs_mount_t *mp, | |||
| 838 | break; | 835 | break; |
| 839 | tail_lsn = 0; | 836 | tail_lsn = 0; |
| 840 | free_bytes -= tic->t_unit_res; | 837 | free_bytes -= tic->t_unit_res; |
| 841 | sv_signal(&tic->t_sema); | 838 | sv_signal(&tic->t_wait); |
| 842 | tic = tic->t_next; | 839 | tic = tic->t_next; |
| 843 | } while (tic != log->l_write_headq); | 840 | } while (tic != log->l_write_headq); |
| 844 | } | 841 | } |
| @@ -859,7 +856,7 @@ xfs_log_move_tail(xfs_mount_t *mp, | |||
| 859 | break; | 856 | break; |
| 860 | tail_lsn = 0; | 857 | tail_lsn = 0; |
| 861 | free_bytes -= need_bytes; | 858 | free_bytes -= need_bytes; |
| 862 | sv_signal(&tic->t_sema); | 859 | sv_signal(&tic->t_wait); |
| 863 | tic = tic->t_next; | 860 | tic = tic->t_next; |
| 864 | } while (tic != log->l_reserve_headq); | 861 | } while (tic != log->l_reserve_headq); |
| 865 | } | 862 | } |
| @@ -1285,8 +1282,8 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1285 | 1282 | ||
| 1286 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); | 1283 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); |
| 1287 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); | 1284 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); |
| 1288 | sv_init(&iclog->ic_forcesema, SV_DEFAULT, "iclog-force"); | 1285 | sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force"); |
| 1289 | sv_init(&iclog->ic_writesema, SV_DEFAULT, "iclog-write"); | 1286 | sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write"); |
| 1290 | 1287 | ||
| 1291 | iclogp = &iclog->ic_next; | 1288 | iclogp = &iclog->ic_next; |
| 1292 | } | 1289 | } |
| @@ -1565,8 +1562,8 @@ xlog_dealloc_log(xlog_t *log) | |||
| 1565 | 1562 | ||
| 1566 | iclog = log->l_iclog; | 1563 | iclog = log->l_iclog; |
| 1567 | for (i=0; i<log->l_iclog_bufs; i++) { | 1564 | for (i=0; i<log->l_iclog_bufs; i++) { |
| 1568 | sv_destroy(&iclog->ic_forcesema); | 1565 | sv_destroy(&iclog->ic_force_wait); |
| 1569 | sv_destroy(&iclog->ic_writesema); | 1566 | sv_destroy(&iclog->ic_write_wait); |
| 1570 | xfs_buf_free(iclog->ic_bp); | 1567 | xfs_buf_free(iclog->ic_bp); |
| 1571 | #ifdef XFS_LOG_TRACE | 1568 | #ifdef XFS_LOG_TRACE |
| 1572 | if (iclog->ic_trace != NULL) { | 1569 | if (iclog->ic_trace != NULL) { |
| @@ -1976,7 +1973,7 @@ xlog_write(xfs_mount_t * mp, | |||
| 1976 | /* Clean iclogs starting from the head. This ordering must be | 1973 | /* Clean iclogs starting from the head. This ordering must be |
| 1977 | * maintained, so an iclog doesn't become ACTIVE beyond one that | 1974 | * maintained, so an iclog doesn't become ACTIVE beyond one that |
| 1978 | * is SYNCING. This is also required to maintain the notion that we use | 1975 | * is SYNCING. This is also required to maintain the notion that we use |
| 1979 | * a counting semaphore to hold off would be writers to the log when every | 1976 | * a ordered wait queue to hold off would be writers to the log when every |
| 1980 | * iclog is trying to sync to disk. | 1977 | * iclog is trying to sync to disk. |
| 1981 | * | 1978 | * |
| 1982 | * State Change: DIRTY -> ACTIVE | 1979 | * State Change: DIRTY -> ACTIVE |
| @@ -2240,7 +2237,7 @@ xlog_state_do_callback( | |||
| 2240 | xlog_state_clean_log(log); | 2237 | xlog_state_clean_log(log); |
| 2241 | 2238 | ||
| 2242 | /* wake up threads waiting in xfs_log_force() */ | 2239 | /* wake up threads waiting in xfs_log_force() */ |
| 2243 | sv_broadcast(&iclog->ic_forcesema); | 2240 | sv_broadcast(&iclog->ic_force_wait); |
| 2244 | 2241 | ||
| 2245 | iclog = iclog->ic_next; | 2242 | iclog = iclog->ic_next; |
| 2246 | } while (first_iclog != iclog); | 2243 | } while (first_iclog != iclog); |
| @@ -2302,8 +2299,7 @@ xlog_state_do_callback( | |||
| 2302 | * the second completion goes through. | 2299 | * the second completion goes through. |
| 2303 | * | 2300 | * |
| 2304 | * Callbacks could take time, so they are done outside the scope of the | 2301 | * Callbacks could take time, so they are done outside the scope of the |
| 2305 | * global state machine log lock. Assume that the calls to cvsema won't | 2302 | * global state machine log lock. |
| 2306 | * take a long time. At least we know it won't sleep. | ||
| 2307 | */ | 2303 | */ |
| 2308 | STATIC void | 2304 | STATIC void |
| 2309 | xlog_state_done_syncing( | 2305 | xlog_state_done_syncing( |
| @@ -2339,7 +2335,7 @@ xlog_state_done_syncing( | |||
| 2339 | * iclog buffer, we wake them all, one will get to do the | 2335 | * iclog buffer, we wake them all, one will get to do the |
| 2340 | * I/O, the others get to wait for the result. | 2336 | * I/O, the others get to wait for the result. |
| 2341 | */ | 2337 | */ |
| 2342 | sv_broadcast(&iclog->ic_writesema); | 2338 | sv_broadcast(&iclog->ic_write_wait); |
| 2343 | spin_unlock(&log->l_icloglock); | 2339 | spin_unlock(&log->l_icloglock); |
| 2344 | xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ | 2340 | xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ |
| 2345 | } /* xlog_state_done_syncing */ | 2341 | } /* xlog_state_done_syncing */ |
| @@ -2347,11 +2343,9 @@ xlog_state_done_syncing( | |||
| 2347 | 2343 | ||
| 2348 | /* | 2344 | /* |
| 2349 | * If the head of the in-core log ring is not (ACTIVE or DIRTY), then we must | 2345 | * If the head of the in-core log ring is not (ACTIVE or DIRTY), then we must |
| 2350 | * sleep. The flush semaphore is set to the number of in-core buffers and | 2346 | * sleep. We wait on the flush queue on the head iclog as that should be |
| 2351 | * decremented around disk syncing. Therefore, if all buffers are syncing, | 2347 | * the first iclog to complete flushing. Hence if all iclogs are syncing, |
| 2352 | * this semaphore will cause new writes to sleep until a sync completes. | 2348 | * we will wait here and all new writes will sleep until a sync completes. |
| 2353 | * Otherwise, this code just does p() followed by v(). This approximates | ||
| 2354 | * a sleep/wakeup except we can't race. | ||
| 2355 | * | 2349 | * |
| 2356 | * The in-core logs are used in a circular fashion. They are not used | 2350 | * The in-core logs are used in a circular fashion. They are not used |
| 2357 | * out-of-order even when an iclog past the head is free. | 2351 | * out-of-order even when an iclog past the head is free. |
| @@ -2508,7 +2502,7 @@ xlog_grant_log_space(xlog_t *log, | |||
| 2508 | goto error_return; | 2502 | goto error_return; |
| 2509 | 2503 | ||
| 2510 | XFS_STATS_INC(xs_sleep_logspace); | 2504 | XFS_STATS_INC(xs_sleep_logspace); |
| 2511 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2505 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
| 2512 | /* | 2506 | /* |
| 2513 | * If we got an error, and the filesystem is shutting down, | 2507 | * If we got an error, and the filesystem is shutting down, |
| 2514 | * we'll catch it down below. So just continue... | 2508 | * we'll catch it down below. So just continue... |
| @@ -2534,7 +2528,7 @@ redo: | |||
| 2534 | xlog_trace_loggrant(log, tic, | 2528 | xlog_trace_loggrant(log, tic, |
| 2535 | "xlog_grant_log_space: sleep 2"); | 2529 | "xlog_grant_log_space: sleep 2"); |
| 2536 | XFS_STATS_INC(xs_sleep_logspace); | 2530 | XFS_STATS_INC(xs_sleep_logspace); |
| 2537 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2531 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
| 2538 | 2532 | ||
| 2539 | if (XLOG_FORCED_SHUTDOWN(log)) { | 2533 | if (XLOG_FORCED_SHUTDOWN(log)) { |
| 2540 | spin_lock(&log->l_grant_lock); | 2534 | spin_lock(&log->l_grant_lock); |
| @@ -2633,7 +2627,7 @@ xlog_regrant_write_log_space(xlog_t *log, | |||
| 2633 | if (free_bytes < ntic->t_unit_res) | 2627 | if (free_bytes < ntic->t_unit_res) |
| 2634 | break; | 2628 | break; |
| 2635 | free_bytes -= ntic->t_unit_res; | 2629 | free_bytes -= ntic->t_unit_res; |
| 2636 | sv_signal(&ntic->t_sema); | 2630 | sv_signal(&ntic->t_wait); |
| 2637 | ntic = ntic->t_next; | 2631 | ntic = ntic->t_next; |
| 2638 | } while (ntic != log->l_write_headq); | 2632 | } while (ntic != log->l_write_headq); |
| 2639 | 2633 | ||
| @@ -2644,7 +2638,7 @@ xlog_regrant_write_log_space(xlog_t *log, | |||
| 2644 | xlog_trace_loggrant(log, tic, | 2638 | xlog_trace_loggrant(log, tic, |
| 2645 | "xlog_regrant_write_log_space: sleep 1"); | 2639 | "xlog_regrant_write_log_space: sleep 1"); |
| 2646 | XFS_STATS_INC(xs_sleep_logspace); | 2640 | XFS_STATS_INC(xs_sleep_logspace); |
| 2647 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, | 2641 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, |
| 2648 | &log->l_grant_lock, s); | 2642 | &log->l_grant_lock, s); |
| 2649 | 2643 | ||
| 2650 | /* If we're shutting down, this tic is already | 2644 | /* If we're shutting down, this tic is already |
| @@ -2673,7 +2667,7 @@ redo: | |||
| 2673 | if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) | 2667 | if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) |
| 2674 | xlog_ins_ticketq(&log->l_write_headq, tic); | 2668 | xlog_ins_ticketq(&log->l_write_headq, tic); |
| 2675 | XFS_STATS_INC(xs_sleep_logspace); | 2669 | XFS_STATS_INC(xs_sleep_logspace); |
| 2676 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2670 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
| 2677 | 2671 | ||
| 2678 | /* If we're shutting down, this tic is already off the queue */ | 2672 | /* If we're shutting down, this tic is already off the queue */ |
| 2679 | if (XLOG_FORCED_SHUTDOWN(log)) { | 2673 | if (XLOG_FORCED_SHUTDOWN(log)) { |
| @@ -2916,7 +2910,7 @@ xlog_state_switch_iclogs(xlog_t *log, | |||
| 2916 | * 2. the current iclog is drity, and the previous iclog is in the | 2910 | * 2. the current iclog is drity, and the previous iclog is in the |
| 2917 | * active or dirty state. | 2911 | * active or dirty state. |
| 2918 | * | 2912 | * |
| 2919 | * We may sleep (call psema) if: | 2913 | * We may sleep if: |
| 2920 | * | 2914 | * |
| 2921 | * 1. the current iclog is not in the active nor dirty state. | 2915 | * 1. the current iclog is not in the active nor dirty state. |
| 2922 | * 2. the current iclog dirty, and the previous iclog is not in the | 2916 | * 2. the current iclog dirty, and the previous iclog is not in the |
| @@ -3013,7 +3007,7 @@ maybe_sleep: | |||
| 3013 | return XFS_ERROR(EIO); | 3007 | return XFS_ERROR(EIO); |
| 3014 | } | 3008 | } |
| 3015 | XFS_STATS_INC(xs_log_force_sleep); | 3009 | XFS_STATS_INC(xs_log_force_sleep); |
| 3016 | sv_wait(&iclog->ic_forcesema, PINOD, &log->l_icloglock, s); | 3010 | sv_wait(&iclog->ic_force_wait, PINOD, &log->l_icloglock, s); |
| 3017 | /* | 3011 | /* |
| 3018 | * No need to grab the log lock here since we're | 3012 | * No need to grab the log lock here since we're |
| 3019 | * only deciding whether or not to return EIO | 3013 | * only deciding whether or not to return EIO |
| @@ -3096,7 +3090,7 @@ try_again: | |||
| 3096 | XLOG_STATE_SYNCING))) { | 3090 | XLOG_STATE_SYNCING))) { |
| 3097 | ASSERT(!(iclog->ic_state & XLOG_STATE_IOERROR)); | 3091 | ASSERT(!(iclog->ic_state & XLOG_STATE_IOERROR)); |
| 3098 | XFS_STATS_INC(xs_log_force_sleep); | 3092 | XFS_STATS_INC(xs_log_force_sleep); |
| 3099 | sv_wait(&iclog->ic_prev->ic_writesema, PSWP, | 3093 | sv_wait(&iclog->ic_prev->ic_write_wait, PSWP, |
| 3100 | &log->l_icloglock, s); | 3094 | &log->l_icloglock, s); |
| 3101 | *log_flushed = 1; | 3095 | *log_flushed = 1; |
| 3102 | already_slept = 1; | 3096 | already_slept = 1; |
| @@ -3116,7 +3110,7 @@ try_again: | |||
| 3116 | !(iclog->ic_state & (XLOG_STATE_ACTIVE | XLOG_STATE_DIRTY))) { | 3110 | !(iclog->ic_state & (XLOG_STATE_ACTIVE | XLOG_STATE_DIRTY))) { |
| 3117 | 3111 | ||
| 3118 | /* | 3112 | /* |
| 3119 | * Don't wait on the forcesema if we know that we've | 3113 | * Don't wait on completion if we know that we've |
| 3120 | * gotten a log write error. | 3114 | * gotten a log write error. |
| 3121 | */ | 3115 | */ |
| 3122 | if (iclog->ic_state & XLOG_STATE_IOERROR) { | 3116 | if (iclog->ic_state & XLOG_STATE_IOERROR) { |
| @@ -3124,7 +3118,7 @@ try_again: | |||
| 3124 | return XFS_ERROR(EIO); | 3118 | return XFS_ERROR(EIO); |
| 3125 | } | 3119 | } |
| 3126 | XFS_STATS_INC(xs_log_force_sleep); | 3120 | XFS_STATS_INC(xs_log_force_sleep); |
| 3127 | sv_wait(&iclog->ic_forcesema, PSWP, &log->l_icloglock, s); | 3121 | sv_wait(&iclog->ic_force_wait, PSWP, &log->l_icloglock, s); |
| 3128 | /* | 3122 | /* |
| 3129 | * No need to grab the log lock here since we're | 3123 | * No need to grab the log lock here since we're |
| 3130 | * only deciding whether or not to return EIO | 3124 | * only deciding whether or not to return EIO |
| @@ -3180,7 +3174,7 @@ STATIC void | |||
| 3180 | xlog_ticket_put(xlog_t *log, | 3174 | xlog_ticket_put(xlog_t *log, |
| 3181 | xlog_ticket_t *ticket) | 3175 | xlog_ticket_t *ticket) |
| 3182 | { | 3176 | { |
| 3183 | sv_destroy(&ticket->t_sema); | 3177 | sv_destroy(&ticket->t_wait); |
| 3184 | kmem_zone_free(xfs_log_ticket_zone, ticket); | 3178 | kmem_zone_free(xfs_log_ticket_zone, ticket); |
| 3185 | } /* xlog_ticket_put */ | 3179 | } /* xlog_ticket_put */ |
| 3186 | 3180 | ||
| @@ -3270,7 +3264,7 @@ xlog_ticket_get(xlog_t *log, | |||
| 3270 | tic->t_trans_type = 0; | 3264 | tic->t_trans_type = 0; |
| 3271 | if (xflags & XFS_LOG_PERM_RESERV) | 3265 | if (xflags & XFS_LOG_PERM_RESERV) |
| 3272 | tic->t_flags |= XLOG_TIC_PERM_RESERV; | 3266 | tic->t_flags |= XLOG_TIC_PERM_RESERV; |
| 3273 | sv_init(&(tic->t_sema), SV_DEFAULT, "logtick"); | 3267 | sv_init(&(tic->t_wait), SV_DEFAULT, "logtick"); |
| 3274 | 3268 | ||
| 3275 | xlog_tic_reset_res(tic); | 3269 | xlog_tic_reset_res(tic); |
| 3276 | 3270 | ||
| @@ -3557,14 +3551,14 @@ xfs_log_force_umount( | |||
| 3557 | */ | 3551 | */ |
| 3558 | if ((tic = log->l_reserve_headq)) { | 3552 | if ((tic = log->l_reserve_headq)) { |
| 3559 | do { | 3553 | do { |
| 3560 | sv_signal(&tic->t_sema); | 3554 | sv_signal(&tic->t_wait); |
| 3561 | tic = tic->t_next; | 3555 | tic = tic->t_next; |
| 3562 | } while (tic != log->l_reserve_headq); | 3556 | } while (tic != log->l_reserve_headq); |
| 3563 | } | 3557 | } |
| 3564 | 3558 | ||
| 3565 | if ((tic = log->l_write_headq)) { | 3559 | if ((tic = log->l_write_headq)) { |
| 3566 | do { | 3560 | do { |
| 3567 | sv_signal(&tic->t_sema); | 3561 | sv_signal(&tic->t_wait); |
| 3568 | tic = tic->t_next; | 3562 | tic = tic->t_next; |
| 3569 | } while (tic != log->l_write_headq); | 3563 | } while (tic != log->l_write_headq); |
| 3570 | } | 3564 | } |
