diff options
author | David Chinner <david@fromorbit.com> | 2008-08-13 02:34:31 -0400 |
---|---|---|
committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-08-13 02:34:31 -0400 |
commit | 12017faf387437c01ff63bbe46b629550b15bd70 (patch) | |
tree | 30213176cb4521fc8b5e944c5815832ecfd93bc5 /fs/xfs/xfs_log.c | |
parent | 597bca6378e0273a5d16346c941cab1ec2e0116d (diff) |
[XFS] clean up stale references to semaphores
A lot of code has been converted away from semaphores, but there are still
comments that reference semaphore behaviour. The log code is the worst
offender. Update the comments to reflect what the code really does now.
SGI-PV: 981498
SGI-Modid: xfs-linux-melb:xfs-kern:31814a
Signed-off-by: David Chinner <david@fromorbit.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r-- | fs/xfs/xfs_log.c | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 91b00a5686cd..0816c5d6d76b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -357,11 +357,11 @@ xfs_log_done(xfs_mount_t *mp, | |||
357 | * Asynchronous forces are implemented by setting the WANT_SYNC | 357 | * Asynchronous forces are implemented by setting the WANT_SYNC |
358 | * bit in the appropriate in-core log and then returning. | 358 | * bit in the appropriate in-core log and then returning. |
359 | * | 359 | * |
360 | * Synchronous forces are implemented with a semaphore. All callers | 360 | * 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 | 361 | * 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 | 362 | * 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 | 363 | * write to disk, that thread will wake up all threads waiting on the |
364 | * semaphore. | 364 | * sv. |
365 | */ | 365 | */ |
366 | int | 366 | int |
367 | _xfs_log_force( | 367 | _xfs_log_force( |
@@ -707,7 +707,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
707 | if (!(iclog->ic_state == XLOG_STATE_ACTIVE || | 707 | if (!(iclog->ic_state == XLOG_STATE_ACTIVE || |
708 | iclog->ic_state == XLOG_STATE_DIRTY)) { | 708 | iclog->ic_state == XLOG_STATE_DIRTY)) { |
709 | if (!XLOG_FORCED_SHUTDOWN(log)) { | 709 | if (!XLOG_FORCED_SHUTDOWN(log)) { |
710 | sv_wait(&iclog->ic_forcesema, PMEM, | 710 | sv_wait(&iclog->ic_force_wait, PMEM, |
711 | &log->l_icloglock, s); | 711 | &log->l_icloglock, s); |
712 | } else { | 712 | } else { |
713 | spin_unlock(&log->l_icloglock); | 713 | spin_unlock(&log->l_icloglock); |
@@ -748,7 +748,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
748 | || iclog->ic_state == XLOG_STATE_DIRTY | 748 | || iclog->ic_state == XLOG_STATE_DIRTY |
749 | || iclog->ic_state == XLOG_STATE_IOERROR) ) { | 749 | || iclog->ic_state == XLOG_STATE_IOERROR) ) { |
750 | 750 | ||
751 | sv_wait(&iclog->ic_forcesema, PMEM, | 751 | sv_wait(&iclog->ic_force_wait, PMEM, |
752 | &log->l_icloglock, s); | 752 | &log->l_icloglock, s); |
753 | } else { | 753 | } else { |
754 | spin_unlock(&log->l_icloglock); | 754 | spin_unlock(&log->l_icloglock); |
@@ -838,7 +838,7 @@ xfs_log_move_tail(xfs_mount_t *mp, | |||
838 | break; | 838 | break; |
839 | tail_lsn = 0; | 839 | tail_lsn = 0; |
840 | free_bytes -= tic->t_unit_res; | 840 | free_bytes -= tic->t_unit_res; |
841 | sv_signal(&tic->t_sema); | 841 | sv_signal(&tic->t_wait); |
842 | tic = tic->t_next; | 842 | tic = tic->t_next; |
843 | } while (tic != log->l_write_headq); | 843 | } while (tic != log->l_write_headq); |
844 | } | 844 | } |
@@ -859,7 +859,7 @@ xfs_log_move_tail(xfs_mount_t *mp, | |||
859 | break; | 859 | break; |
860 | tail_lsn = 0; | 860 | tail_lsn = 0; |
861 | free_bytes -= need_bytes; | 861 | free_bytes -= need_bytes; |
862 | sv_signal(&tic->t_sema); | 862 | sv_signal(&tic->t_wait); |
863 | tic = tic->t_next; | 863 | tic = tic->t_next; |
864 | } while (tic != log->l_reserve_headq); | 864 | } while (tic != log->l_reserve_headq); |
865 | } | 865 | } |
@@ -1285,8 +1285,8 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
1285 | 1285 | ||
1286 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); | 1286 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); |
1287 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); | 1287 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); |
1288 | sv_init(&iclog->ic_forcesema, SV_DEFAULT, "iclog-force"); | 1288 | sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force"); |
1289 | sv_init(&iclog->ic_writesema, SV_DEFAULT, "iclog-write"); | 1289 | sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write"); |
1290 | 1290 | ||
1291 | iclogp = &iclog->ic_next; | 1291 | iclogp = &iclog->ic_next; |
1292 | } | 1292 | } |
@@ -1565,8 +1565,8 @@ xlog_dealloc_log(xlog_t *log) | |||
1565 | 1565 | ||
1566 | iclog = log->l_iclog; | 1566 | iclog = log->l_iclog; |
1567 | for (i=0; i<log->l_iclog_bufs; i++) { | 1567 | for (i=0; i<log->l_iclog_bufs; i++) { |
1568 | sv_destroy(&iclog->ic_forcesema); | 1568 | sv_destroy(&iclog->ic_force_wait); |
1569 | sv_destroy(&iclog->ic_writesema); | 1569 | sv_destroy(&iclog->ic_write_wait); |
1570 | xfs_buf_free(iclog->ic_bp); | 1570 | xfs_buf_free(iclog->ic_bp); |
1571 | #ifdef XFS_LOG_TRACE | 1571 | #ifdef XFS_LOG_TRACE |
1572 | if (iclog->ic_trace != NULL) { | 1572 | if (iclog->ic_trace != NULL) { |
@@ -1976,7 +1976,7 @@ xlog_write(xfs_mount_t * mp, | |||
1976 | /* Clean iclogs starting from the head. This ordering must be | 1976 | /* Clean iclogs starting from the head. This ordering must be |
1977 | * maintained, so an iclog doesn't become ACTIVE beyond one that | 1977 | * 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 | 1978 | * 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 | 1979 | * a ordered wait queue to hold off would be writers to the log when every |
1980 | * iclog is trying to sync to disk. | 1980 | * iclog is trying to sync to disk. |
1981 | * | 1981 | * |
1982 | * State Change: DIRTY -> ACTIVE | 1982 | * State Change: DIRTY -> ACTIVE |
@@ -2240,7 +2240,7 @@ xlog_state_do_callback( | |||
2240 | xlog_state_clean_log(log); | 2240 | xlog_state_clean_log(log); |
2241 | 2241 | ||
2242 | /* wake up threads waiting in xfs_log_force() */ | 2242 | /* wake up threads waiting in xfs_log_force() */ |
2243 | sv_broadcast(&iclog->ic_forcesema); | 2243 | sv_broadcast(&iclog->ic_force_wait); |
2244 | 2244 | ||
2245 | iclog = iclog->ic_next; | 2245 | iclog = iclog->ic_next; |
2246 | } while (first_iclog != iclog); | 2246 | } while (first_iclog != iclog); |
@@ -2302,8 +2302,7 @@ xlog_state_do_callback( | |||
2302 | * the second completion goes through. | 2302 | * the second completion goes through. |
2303 | * | 2303 | * |
2304 | * Callbacks could take time, so they are done outside the scope of the | 2304 | * 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 | 2305 | * global state machine log lock. |
2306 | * take a long time. At least we know it won't sleep. | ||
2307 | */ | 2306 | */ |
2308 | STATIC void | 2307 | STATIC void |
2309 | xlog_state_done_syncing( | 2308 | xlog_state_done_syncing( |
@@ -2339,7 +2338,7 @@ xlog_state_done_syncing( | |||
2339 | * iclog buffer, we wake them all, one will get to do the | 2338 | * iclog buffer, we wake them all, one will get to do the |
2340 | * I/O, the others get to wait for the result. | 2339 | * I/O, the others get to wait for the result. |
2341 | */ | 2340 | */ |
2342 | sv_broadcast(&iclog->ic_writesema); | 2341 | sv_broadcast(&iclog->ic_write_wait); |
2343 | spin_unlock(&log->l_icloglock); | 2342 | spin_unlock(&log->l_icloglock); |
2344 | xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ | 2343 | xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ |
2345 | } /* xlog_state_done_syncing */ | 2344 | } /* xlog_state_done_syncing */ |
@@ -2347,11 +2346,9 @@ xlog_state_done_syncing( | |||
2347 | 2346 | ||
2348 | /* | 2347 | /* |
2349 | * If the head of the in-core log ring is not (ACTIVE or DIRTY), then we must | 2348 | * 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 | 2349 | * 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, | 2350 | * 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. | 2351 | * 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 | * | 2352 | * |
2356 | * The in-core logs are used in a circular fashion. They are not used | 2353 | * 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. | 2354 | * out-of-order even when an iclog past the head is free. |
@@ -2508,7 +2505,7 @@ xlog_grant_log_space(xlog_t *log, | |||
2508 | goto error_return; | 2505 | goto error_return; |
2509 | 2506 | ||
2510 | XFS_STATS_INC(xs_sleep_logspace); | 2507 | XFS_STATS_INC(xs_sleep_logspace); |
2511 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2508 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
2512 | /* | 2509 | /* |
2513 | * If we got an error, and the filesystem is shutting down, | 2510 | * If we got an error, and the filesystem is shutting down, |
2514 | * we'll catch it down below. So just continue... | 2511 | * we'll catch it down below. So just continue... |
@@ -2534,7 +2531,7 @@ redo: | |||
2534 | xlog_trace_loggrant(log, tic, | 2531 | xlog_trace_loggrant(log, tic, |
2535 | "xlog_grant_log_space: sleep 2"); | 2532 | "xlog_grant_log_space: sleep 2"); |
2536 | XFS_STATS_INC(xs_sleep_logspace); | 2533 | XFS_STATS_INC(xs_sleep_logspace); |
2537 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2534 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
2538 | 2535 | ||
2539 | if (XLOG_FORCED_SHUTDOWN(log)) { | 2536 | if (XLOG_FORCED_SHUTDOWN(log)) { |
2540 | spin_lock(&log->l_grant_lock); | 2537 | spin_lock(&log->l_grant_lock); |
@@ -2633,7 +2630,7 @@ xlog_regrant_write_log_space(xlog_t *log, | |||
2633 | if (free_bytes < ntic->t_unit_res) | 2630 | if (free_bytes < ntic->t_unit_res) |
2634 | break; | 2631 | break; |
2635 | free_bytes -= ntic->t_unit_res; | 2632 | free_bytes -= ntic->t_unit_res; |
2636 | sv_signal(&ntic->t_sema); | 2633 | sv_signal(&ntic->t_wait); |
2637 | ntic = ntic->t_next; | 2634 | ntic = ntic->t_next; |
2638 | } while (ntic != log->l_write_headq); | 2635 | } while (ntic != log->l_write_headq); |
2639 | 2636 | ||
@@ -2644,7 +2641,7 @@ xlog_regrant_write_log_space(xlog_t *log, | |||
2644 | xlog_trace_loggrant(log, tic, | 2641 | xlog_trace_loggrant(log, tic, |
2645 | "xlog_regrant_write_log_space: sleep 1"); | 2642 | "xlog_regrant_write_log_space: sleep 1"); |
2646 | XFS_STATS_INC(xs_sleep_logspace); | 2643 | XFS_STATS_INC(xs_sleep_logspace); |
2647 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, | 2644 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, |
2648 | &log->l_grant_lock, s); | 2645 | &log->l_grant_lock, s); |
2649 | 2646 | ||
2650 | /* If we're shutting down, this tic is already | 2647 | /* If we're shutting down, this tic is already |
@@ -2673,7 +2670,7 @@ redo: | |||
2673 | if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) | 2670 | if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) |
2674 | xlog_ins_ticketq(&log->l_write_headq, tic); | 2671 | xlog_ins_ticketq(&log->l_write_headq, tic); |
2675 | XFS_STATS_INC(xs_sleep_logspace); | 2672 | XFS_STATS_INC(xs_sleep_logspace); |
2676 | sv_wait(&tic->t_sema, PINOD|PLTWAIT, &log->l_grant_lock, s); | 2673 | sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); |
2677 | 2674 | ||
2678 | /* If we're shutting down, this tic is already off the queue */ | 2675 | /* If we're shutting down, this tic is already off the queue */ |
2679 | if (XLOG_FORCED_SHUTDOWN(log)) { | 2676 | if (XLOG_FORCED_SHUTDOWN(log)) { |
@@ -2916,7 +2913,7 @@ xlog_state_switch_iclogs(xlog_t *log, | |||
2916 | * 2. the current iclog is drity, and the previous iclog is in the | 2913 | * 2. the current iclog is drity, and the previous iclog is in the |
2917 | * active or dirty state. | 2914 | * active or dirty state. |
2918 | * | 2915 | * |
2919 | * We may sleep (call psema) if: | 2916 | * We may sleep if: |
2920 | * | 2917 | * |
2921 | * 1. the current iclog is not in the active nor dirty state. | 2918 | * 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 | 2919 | * 2. the current iclog dirty, and the previous iclog is not in the |
@@ -3013,7 +3010,7 @@ maybe_sleep: | |||
3013 | return XFS_ERROR(EIO); | 3010 | return XFS_ERROR(EIO); |
3014 | } | 3011 | } |
3015 | XFS_STATS_INC(xs_log_force_sleep); | 3012 | XFS_STATS_INC(xs_log_force_sleep); |
3016 | sv_wait(&iclog->ic_forcesema, PINOD, &log->l_icloglock, s); | 3013 | sv_wait(&iclog->ic_force_wait, PINOD, &log->l_icloglock, s); |
3017 | /* | 3014 | /* |
3018 | * No need to grab the log lock here since we're | 3015 | * No need to grab the log lock here since we're |
3019 | * only deciding whether or not to return EIO | 3016 | * only deciding whether or not to return EIO |
@@ -3096,7 +3093,7 @@ try_again: | |||
3096 | XLOG_STATE_SYNCING))) { | 3093 | XLOG_STATE_SYNCING))) { |
3097 | ASSERT(!(iclog->ic_state & XLOG_STATE_IOERROR)); | 3094 | ASSERT(!(iclog->ic_state & XLOG_STATE_IOERROR)); |
3098 | XFS_STATS_INC(xs_log_force_sleep); | 3095 | XFS_STATS_INC(xs_log_force_sleep); |
3099 | sv_wait(&iclog->ic_prev->ic_writesema, PSWP, | 3096 | sv_wait(&iclog->ic_prev->ic_write_wait, PSWP, |
3100 | &log->l_icloglock, s); | 3097 | &log->l_icloglock, s); |
3101 | *log_flushed = 1; | 3098 | *log_flushed = 1; |
3102 | already_slept = 1; | 3099 | already_slept = 1; |
@@ -3116,7 +3113,7 @@ try_again: | |||
3116 | !(iclog->ic_state & (XLOG_STATE_ACTIVE | XLOG_STATE_DIRTY))) { | 3113 | !(iclog->ic_state & (XLOG_STATE_ACTIVE | XLOG_STATE_DIRTY))) { |
3117 | 3114 | ||
3118 | /* | 3115 | /* |
3119 | * Don't wait on the forcesema if we know that we've | 3116 | * Don't wait on completion if we know that we've |
3120 | * gotten a log write error. | 3117 | * gotten a log write error. |
3121 | */ | 3118 | */ |
3122 | if (iclog->ic_state & XLOG_STATE_IOERROR) { | 3119 | if (iclog->ic_state & XLOG_STATE_IOERROR) { |
@@ -3124,7 +3121,7 @@ try_again: | |||
3124 | return XFS_ERROR(EIO); | 3121 | return XFS_ERROR(EIO); |
3125 | } | 3122 | } |
3126 | XFS_STATS_INC(xs_log_force_sleep); | 3123 | XFS_STATS_INC(xs_log_force_sleep); |
3127 | sv_wait(&iclog->ic_forcesema, PSWP, &log->l_icloglock, s); | 3124 | sv_wait(&iclog->ic_force_wait, PSWP, &log->l_icloglock, s); |
3128 | /* | 3125 | /* |
3129 | * No need to grab the log lock here since we're | 3126 | * No need to grab the log lock here since we're |
3130 | * only deciding whether or not to return EIO | 3127 | * only deciding whether or not to return EIO |
@@ -3180,7 +3177,7 @@ STATIC void | |||
3180 | xlog_ticket_put(xlog_t *log, | 3177 | xlog_ticket_put(xlog_t *log, |
3181 | xlog_ticket_t *ticket) | 3178 | xlog_ticket_t *ticket) |
3182 | { | 3179 | { |
3183 | sv_destroy(&ticket->t_sema); | 3180 | sv_destroy(&ticket->t_wait); |
3184 | kmem_zone_free(xfs_log_ticket_zone, ticket); | 3181 | kmem_zone_free(xfs_log_ticket_zone, ticket); |
3185 | } /* xlog_ticket_put */ | 3182 | } /* xlog_ticket_put */ |
3186 | 3183 | ||
@@ -3270,7 +3267,7 @@ xlog_ticket_get(xlog_t *log, | |||
3270 | tic->t_trans_type = 0; | 3267 | tic->t_trans_type = 0; |
3271 | if (xflags & XFS_LOG_PERM_RESERV) | 3268 | if (xflags & XFS_LOG_PERM_RESERV) |
3272 | tic->t_flags |= XLOG_TIC_PERM_RESERV; | 3269 | tic->t_flags |= XLOG_TIC_PERM_RESERV; |
3273 | sv_init(&(tic->t_sema), SV_DEFAULT, "logtick"); | 3270 | sv_init(&(tic->t_wait), SV_DEFAULT, "logtick"); |
3274 | 3271 | ||
3275 | xlog_tic_reset_res(tic); | 3272 | xlog_tic_reset_res(tic); |
3276 | 3273 | ||
@@ -3557,14 +3554,14 @@ xfs_log_force_umount( | |||
3557 | */ | 3554 | */ |
3558 | if ((tic = log->l_reserve_headq)) { | 3555 | if ((tic = log->l_reserve_headq)) { |
3559 | do { | 3556 | do { |
3560 | sv_signal(&tic->t_sema); | 3557 | sv_signal(&tic->t_wait); |
3561 | tic = tic->t_next; | 3558 | tic = tic->t_next; |
3562 | } while (tic != log->l_reserve_headq); | 3559 | } while (tic != log->l_reserve_headq); |
3563 | } | 3560 | } |
3564 | 3561 | ||
3565 | if ((tic = log->l_write_headq)) { | 3562 | if ((tic = log->l_write_headq)) { |
3566 | do { | 3563 | do { |
3567 | sv_signal(&tic->t_sema); | 3564 | sv_signal(&tic->t_wait); |
3568 | tic = tic->t_next; | 3565 | tic = tic->t_next; |
3569 | } while (tic != log->l_write_headq); | 3566 | } while (tic != log->l_write_headq); |
3570 | } | 3567 | } |