diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-18 11:39:39 -0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-18 11:39:39 -0400 | 
| commit | 253ba4e79edc695b2925bd2ef34de06ff4d4070c (patch) | |
| tree | 259667140ca702d6a218cc54f4df275fbbda747b /fs/xfs/xfs_alloc.c | |
| parent | 188da98800893691e47eea9335a234378e32aceb (diff) | |
| parent | 65e67f5165c8a156b34ee7adf65d5ed3b16a910d (diff) | |
Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6
* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6: (87 commits)
  [XFS] Fix merge failure
  [XFS] The forward declarations for the xfs_ioctl() helpers and the
  [XFS] Update XFS documentation for noikeep/ikeep.
  [XFS] Update XFS Documentation for ikeep and ihashsize
  [XFS] Remove unused HAVE_SPLICE macro.
  [XFS] Remove CONFIG_XFS_SECURITY.
  [XFS] xfs_bmap_compute_maxlevels should be based on di_forkoff
  [XFS] Always use di_forkoff when checking for attr space.
  [XFS] Ensure the inode is joined in xfs_itruncate_finish
  [XFS] Remove periodic logging of in-core superblock counters.
  [XFS] fix logic error in xfs_alloc_ag_vextent_near()
  [XFS] Don't error out on good I/Os.
  [XFS] Catch log unmount failures.
  [XFS] Sanitise xfs_log_force error checking.
  [XFS] Check for errors when changing buffer pointers.
  [XFS] Don't allow silent errors in xfs_inactive().
  [XFS] Catch errors from xfs_imap().
  [XFS] xfs_bulkstat_one_dinode() never returns an error.
  [XFS] xfs_iflush_fork() never returns an error.
  [XFS] Catch unwritten extent conversion errors.
  ...
Diffstat (limited to 'fs/xfs/xfs_alloc.c')
| -rw-r--r-- | fs/xfs/xfs_alloc.c | 65 | 
1 files changed, 29 insertions, 36 deletions
diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index bdbfbbee4959..1956f83489f1 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c  | |||
| @@ -45,7 +45,7 @@ | |||
| 45 | #define XFSA_FIXUP_BNO_OK 1 | 45 | #define XFSA_FIXUP_BNO_OK 1 | 
| 46 | #define XFSA_FIXUP_CNT_OK 2 | 46 | #define XFSA_FIXUP_CNT_OK 2 | 
| 47 | 47 | ||
| 48 | STATIC int | 48 | STATIC void | 
| 49 | xfs_alloc_search_busy(xfs_trans_t *tp, | 49 | xfs_alloc_search_busy(xfs_trans_t *tp, | 
| 50 | xfs_agnumber_t agno, | 50 | xfs_agnumber_t agno, | 
| 51 | xfs_agblock_t bno, | 51 | xfs_agblock_t bno, | 
| @@ -55,24 +55,24 @@ xfs_alloc_search_busy(xfs_trans_t *tp, | |||
| 55 | ktrace_t *xfs_alloc_trace_buf; | 55 | ktrace_t *xfs_alloc_trace_buf; | 
| 56 | 56 | ||
| 57 | #define TRACE_ALLOC(s,a) \ | 57 | #define TRACE_ALLOC(s,a) \ | 
| 58 | xfs_alloc_trace_alloc(__FUNCTION__, s, a, __LINE__) | 58 | xfs_alloc_trace_alloc(__func__, s, a, __LINE__) | 
| 59 | #define TRACE_FREE(s,a,b,x,f) \ | 59 | #define TRACE_FREE(s,a,b,x,f) \ | 
| 60 | xfs_alloc_trace_free(__FUNCTION__, s, mp, a, b, x, f, __LINE__) | 60 | xfs_alloc_trace_free(__func__, s, mp, a, b, x, f, __LINE__) | 
| 61 | #define TRACE_MODAGF(s,a,f) \ | 61 | #define TRACE_MODAGF(s,a,f) \ | 
| 62 | xfs_alloc_trace_modagf(__FUNCTION__, s, mp, a, f, __LINE__) | 62 | xfs_alloc_trace_modagf(__func__, s, mp, a, f, __LINE__) | 
| 63 | #define TRACE_BUSY(__FUNCTION__,s,ag,agb,l,sl,tp) \ | 63 | #define TRACE_BUSY(__func__,s,ag,agb,l,sl,tp) \ | 
| 64 | xfs_alloc_trace_busy(__FUNCTION__, s, mp, ag, agb, l, sl, tp, XFS_ALLOC_KTRACE_BUSY, __LINE__) | 64 | xfs_alloc_trace_busy(__func__, s, mp, ag, agb, l, sl, tp, XFS_ALLOC_KTRACE_BUSY, __LINE__) | 
| 65 | #define TRACE_UNBUSY(__FUNCTION__,s,ag,sl,tp) \ | 65 | #define TRACE_UNBUSY(__func__,s,ag,sl,tp) \ | 
| 66 | xfs_alloc_trace_busy(__FUNCTION__, s, mp, ag, -1, -1, sl, tp, XFS_ALLOC_KTRACE_UNBUSY, __LINE__) | 66 | xfs_alloc_trace_busy(__func__, s, mp, ag, -1, -1, sl, tp, XFS_ALLOC_KTRACE_UNBUSY, __LINE__) | 
| 67 | #define TRACE_BUSYSEARCH(__FUNCTION__,s,ag,agb,l,sl,tp) \ | 67 | #define TRACE_BUSYSEARCH(__func__,s,ag,agb,l,tp) \ | 
| 68 | xfs_alloc_trace_busy(__FUNCTION__, s, mp, ag, agb, l, sl, tp, XFS_ALLOC_KTRACE_BUSYSEARCH, __LINE__) | 68 | xfs_alloc_trace_busy(__func__, s, mp, ag, agb, l, 0, tp, XFS_ALLOC_KTRACE_BUSYSEARCH, __LINE__) | 
| 69 | #else | 69 | #else | 
| 70 | #define TRACE_ALLOC(s,a) | 70 | #define TRACE_ALLOC(s,a) | 
| 71 | #define TRACE_FREE(s,a,b,x,f) | 71 | #define TRACE_FREE(s,a,b,x,f) | 
| 72 | #define TRACE_MODAGF(s,a,f) | 72 | #define TRACE_MODAGF(s,a,f) | 
| 73 | #define TRACE_BUSY(s,a,ag,agb,l,sl,tp) | 73 | #define TRACE_BUSY(s,a,ag,agb,l,sl,tp) | 
| 74 | #define TRACE_UNBUSY(fname,s,ag,sl,tp) | 74 | #define TRACE_UNBUSY(fname,s,ag,sl,tp) | 
| 75 | #define TRACE_BUSYSEARCH(fname,s,ag,agb,l,sl,tp) | 75 | #define TRACE_BUSYSEARCH(fname,s,ag,agb,l,tp) | 
| 76 | #endif /* XFS_ALLOC_TRACE */ | 76 | #endif /* XFS_ALLOC_TRACE */ | 
| 77 | 77 | ||
| 78 | /* | 78 | /* | 
| @@ -93,7 +93,7 @@ STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, | |||
| 93 | * Compute aligned version of the found extent. | 93 | * Compute aligned version of the found extent. | 
| 94 | * Takes alignment and min length into account. | 94 | * Takes alignment and min length into account. | 
| 95 | */ | 95 | */ | 
| 96 | STATIC int /* success (>= minlen) */ | 96 | STATIC void | 
| 97 | xfs_alloc_compute_aligned( | 97 | xfs_alloc_compute_aligned( | 
| 98 | xfs_agblock_t foundbno, /* starting block in found extent */ | 98 | xfs_agblock_t foundbno, /* starting block in found extent */ | 
| 99 | xfs_extlen_t foundlen, /* length in found extent */ | 99 | xfs_extlen_t foundlen, /* length in found extent */ | 
| @@ -116,7 +116,6 @@ xfs_alloc_compute_aligned( | |||
| 116 | } | 116 | } | 
| 117 | *resbno = bno; | 117 | *resbno = bno; | 
| 118 | *reslen = len; | 118 | *reslen = len; | 
| 119 | return len >= minlen; | ||
| 120 | } | 119 | } | 
| 121 | 120 | ||
| 122 | /* | 121 | /* | 
| @@ -837,9 +836,9 @@ xfs_alloc_ag_vextent_near( | |||
| 837 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) | 836 | if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) | 
| 838 | goto error0; | 837 | goto error0; | 
| 839 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 838 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 
| 840 | if (!xfs_alloc_compute_aligned(ltbno, ltlen, | 839 | xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, | 
| 841 | args->alignment, args->minlen, | 840 | args->minlen, <bnoa, <lena); | 
| 842 | <bnoa, <lena)) | 841 | if (ltlena < args->minlen) | 
| 843 | continue; | 842 | continue; | 
| 844 | args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); | 843 | args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); | 
| 845 | xfs_alloc_fix_len(args); | 844 | xfs_alloc_fix_len(args); | 
| @@ -958,9 +957,9 @@ xfs_alloc_ag_vextent_near( | |||
| 958 | if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) | 957 | if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) | 
| 959 | goto error0; | 958 | goto error0; | 
| 960 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 959 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 
| 961 | if (xfs_alloc_compute_aligned(ltbno, ltlen, | 960 | xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, | 
| 962 | args->alignment, args->minlen, | 961 | args->minlen, <bnoa, <lena); | 
| 963 | <bnoa, <lena)) | 962 | if (ltlena >= args->minlen) | 
| 964 | break; | 963 | break; | 
| 965 | if ((error = xfs_alloc_decrement(bno_cur_lt, 0, &i))) | 964 | if ((error = xfs_alloc_decrement(bno_cur_lt, 0, &i))) | 
| 966 | goto error0; | 965 | goto error0; | 
| @@ -974,9 +973,9 @@ xfs_alloc_ag_vextent_near( | |||
| 974 | if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) | 973 | if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) | 
| 975 | goto error0; | 974 | goto error0; | 
| 976 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 975 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 
| 977 | if (xfs_alloc_compute_aligned(gtbno, gtlen, | 976 | xfs_alloc_compute_aligned(gtbno, gtlen, args->alignment, | 
| 978 | args->alignment, args->minlen, | 977 | args->minlen, >bnoa, >lena); | 
| 979 | >bnoa, >lena)) | 978 | if (gtlena >= args->minlen) | 
| 980 | break; | 979 | break; | 
| 981 | if ((error = xfs_alloc_increment(bno_cur_gt, 0, &i))) | 980 | if ((error = xfs_alloc_increment(bno_cur_gt, 0, &i))) | 
| 982 | goto error0; | 981 | goto error0; | 
| @@ -2562,9 +2561,10 @@ xfs_alloc_clear_busy(xfs_trans_t *tp, | |||
| 2562 | 2561 | ||
| 2563 | 2562 | ||
| 2564 | /* | 2563 | /* | 
| 2565 | * returns non-zero if any of (agno,bno):len is in a busy list | 2564 | * If we find the extent in the busy list, force the log out to get the | 
| 2565 | * extent out of the busy list so the caller can use it straight away. | ||
| 2566 | */ | 2566 | */ | 
| 2567 | STATIC int | 2567 | STATIC void | 
| 2568 | xfs_alloc_search_busy(xfs_trans_t *tp, | 2568 | xfs_alloc_search_busy(xfs_trans_t *tp, | 
| 2569 | xfs_agnumber_t agno, | 2569 | xfs_agnumber_t agno, | 
| 2570 | xfs_agblock_t bno, | 2570 | xfs_agblock_t bno, | 
| @@ -2572,7 +2572,6 @@ xfs_alloc_search_busy(xfs_trans_t *tp, | |||
| 2572 | { | 2572 | { | 
| 2573 | xfs_mount_t *mp; | 2573 | xfs_mount_t *mp; | 
| 2574 | xfs_perag_busy_t *bsy; | 2574 | xfs_perag_busy_t *bsy; | 
| 2575 | int n; | ||
| 2576 | xfs_agblock_t uend, bend; | 2575 | xfs_agblock_t uend, bend; | 
| 2577 | xfs_lsn_t lsn; | 2576 | xfs_lsn_t lsn; | 
| 2578 | int cnt; | 2577 | int cnt; | 
| @@ -2585,21 +2584,18 @@ xfs_alloc_search_busy(xfs_trans_t *tp, | |||
| 2585 | uend = bno + len - 1; | 2584 | uend = bno + len - 1; | 
| 2586 | 2585 | ||
| 2587 | /* search pagb_list for this slot, skipping open slots */ | 2586 | /* search pagb_list for this slot, skipping open slots */ | 
| 2588 | for (bsy = mp->m_perag[agno].pagb_list, n = 0; | 2587 | for (bsy = mp->m_perag[agno].pagb_list; cnt; bsy++) { | 
| 2589 | cnt; bsy++, n++) { | ||
| 2590 | 2588 | ||
| 2591 | /* | 2589 | /* | 
| 2592 | * (start1,length1) within (start2, length2) | 2590 | * (start1,length1) within (start2, length2) | 
| 2593 | */ | 2591 | */ | 
| 2594 | if (bsy->busy_tp != NULL) { | 2592 | if (bsy->busy_tp != NULL) { | 
| 2595 | bend = bsy->busy_start + bsy->busy_length - 1; | 2593 | bend = bsy->busy_start + bsy->busy_length - 1; | 
| 2596 | if ((bno > bend) || | 2594 | if ((bno > bend) || (uend < bsy->busy_start)) { | 
| 2597 | (uend < bsy->busy_start)) { | ||
| 2598 | cnt--; | 2595 | cnt--; | 
| 2599 | } else { | 2596 | } else { | 
| 2600 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", | 2597 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", | 
| 2601 | "found1", agno, bno, len, n, | 2598 | "found1", agno, bno, len, tp); | 
| 2602 | tp); | ||
| 2603 | break; | 2599 | break; | 
| 2604 | } | 2600 | } | 
| 2605 | } | 2601 | } | 
| @@ -2610,15 +2606,12 @@ xfs_alloc_search_busy(xfs_trans_t *tp, | |||
| 2610 | * transaction that freed the block | 2606 | * transaction that freed the block | 
| 2611 | */ | 2607 | */ | 
| 2612 | if (cnt) { | 2608 | if (cnt) { | 
| 2613 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", "found", agno, bno, len, n, tp); | 2609 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", "found", agno, bno, len, tp); | 
| 2614 | lsn = bsy->busy_tp->t_commit_lsn; | 2610 | lsn = bsy->busy_tp->t_commit_lsn; | 
| 2615 | spin_unlock(&mp->m_perag[agno].pagb_lock); | 2611 | spin_unlock(&mp->m_perag[agno].pagb_lock); | 
| 2616 | xfs_log_force(mp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); | 2612 | xfs_log_force(mp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); | 
| 2617 | } else { | 2613 | } else { | 
| 2618 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", "not-found", agno, bno, len, n, tp); | 2614 | TRACE_BUSYSEARCH("xfs_alloc_search_busy", "not-found", agno, bno, len, tp); | 
| 2619 | n = -1; | ||
| 2620 | spin_unlock(&mp->m_perag[agno].pagb_lock); | 2615 | spin_unlock(&mp->m_perag[agno].pagb_lock); | 
| 2621 | } | 2616 | } | 
| 2622 | |||
| 2623 | return n; | ||
| 2624 | } | 2617 | } | 
