diff options
-rw-r--r-- | fs/xfs/xfs_ag.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_alloc.c | 9 | ||||
-rw-r--r-- | fs/xfs/xfs_alloc.h | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_alloc_btree.c | 3 |
4 files changed, 10 insertions, 5 deletions
diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 8d52ba4c87e5..6530769a999b 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h | |||
@@ -189,6 +189,7 @@ struct xfs_busy_extent { | |||
189 | xfs_extlen_t length; | 189 | xfs_extlen_t length; |
190 | unsigned int flags; | 190 | unsigned int flags; |
191 | #define XFS_ALLOC_BUSY_DISCARDED 0x01 /* undergoing a discard op. */ | 191 | #define XFS_ALLOC_BUSY_DISCARDED 0x01 /* undergoing a discard op. */ |
192 | #define XFS_ALLOC_BUSY_SKIP_DISCARD 0x02 /* do not discard */ | ||
192 | }; | 193 | }; |
193 | 194 | ||
194 | /* | 195 | /* |
diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 721db22c6ec9..95862bbff56b 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c | |||
@@ -2469,7 +2469,7 @@ xfs_free_extent( | |||
2469 | 2469 | ||
2470 | error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); | 2470 | error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); |
2471 | if (!error) | 2471 | if (!error) |
2472 | xfs_alloc_busy_insert(tp, args.agno, args.agbno, len); | 2472 | xfs_alloc_busy_insert(tp, args.agno, args.agbno, len, 0); |
2473 | error0: | 2473 | error0: |
2474 | xfs_perag_put(args.pag); | 2474 | xfs_perag_put(args.pag); |
2475 | return error; | 2475 | return error; |
@@ -2480,7 +2480,8 @@ xfs_alloc_busy_insert( | |||
2480 | struct xfs_trans *tp, | 2480 | struct xfs_trans *tp, |
2481 | xfs_agnumber_t agno, | 2481 | xfs_agnumber_t agno, |
2482 | xfs_agblock_t bno, | 2482 | xfs_agblock_t bno, |
2483 | xfs_extlen_t len) | 2483 | xfs_extlen_t len, |
2484 | unsigned int flags) | ||
2484 | { | 2485 | { |
2485 | struct xfs_busy_extent *new; | 2486 | struct xfs_busy_extent *new; |
2486 | struct xfs_busy_extent *busyp; | 2487 | struct xfs_busy_extent *busyp; |
@@ -2504,6 +2505,7 @@ xfs_alloc_busy_insert( | |||
2504 | new->bno = bno; | 2505 | new->bno = bno; |
2505 | new->length = len; | 2506 | new->length = len; |
2506 | INIT_LIST_HEAD(&new->list); | 2507 | INIT_LIST_HEAD(&new->list); |
2508 | new->flags = flags; | ||
2507 | 2509 | ||
2508 | /* trace before insert to be able to see failed inserts */ | 2510 | /* trace before insert to be able to see failed inserts */ |
2509 | trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len); | 2511 | trace_xfs_alloc_busy(tp->t_mountp, agno, bno, len); |
@@ -3018,7 +3020,8 @@ xfs_alloc_busy_clear( | |||
3018 | agno = busyp->agno; | 3020 | agno = busyp->agno; |
3019 | } | 3021 | } |
3020 | 3022 | ||
3021 | if (do_discard && busyp->length) | 3023 | if (do_discard && busyp->length && |
3024 | !(busyp->flags & XFS_ALLOC_BUSY_SKIP_DISCARD)) | ||
3022 | busyp->flags = XFS_ALLOC_BUSY_DISCARDED; | 3025 | busyp->flags = XFS_ALLOC_BUSY_DISCARDED; |
3023 | else | 3026 | else |
3024 | xfs_alloc_busy_clear_one(mp, pag, busyp); | 3027 | xfs_alloc_busy_clear_one(mp, pag, busyp); |
diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 06aa8217452b..2f52b924be79 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h | |||
@@ -137,7 +137,7 @@ xfs_alloc_longest_free_extent(struct xfs_mount *mp, | |||
137 | #ifdef __KERNEL__ | 137 | #ifdef __KERNEL__ |
138 | void | 138 | void |
139 | xfs_alloc_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, | 139 | xfs_alloc_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, |
140 | xfs_agblock_t bno, xfs_extlen_t len); | 140 | xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); |
141 | 141 | ||
142 | void | 142 | void |
143 | xfs_alloc_busy_clear(struct xfs_mount *mp, struct list_head *list, | 143 | xfs_alloc_busy_clear(struct xfs_mount *mp, struct list_head *list, |
diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 8b469d53599f..2b3518826a69 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c | |||
@@ -120,7 +120,8 @@ xfs_allocbt_free_block( | |||
120 | if (error) | 120 | if (error) |
121 | return error; | 121 | return error; |
122 | 122 | ||
123 | xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); | 123 | xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, |
124 | XFS_ALLOC_BUSY_SKIP_DISCARD); | ||
124 | xfs_trans_agbtree_delta(cur->bc_tp, -1); | 125 | xfs_trans_agbtree_delta(cur->bc_tp, -1); |
125 | return 0; | 126 | return 0; |
126 | } | 127 | } |