diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/libxfs/xfs_log_format.h | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_rmap_item.c | 50 | ||||
-rw-r--r-- | fs/xfs/xfs_rmap_item.h | 8 | ||||
-rw-r--r-- | fs/xfs/xfs_super.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_trans.h | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_rmap.c | 33 |
7 files changed, 15 insertions, 89 deletions
diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index a8d794d1ae9a..a6eed43fa7cd 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h | |||
@@ -658,9 +658,8 @@ struct xfs_rui_log_format { | |||
658 | struct xfs_rud_log_format { | 658 | struct xfs_rud_log_format { |
659 | __uint16_t rud_type; /* rud log item type */ | 659 | __uint16_t rud_type; /* rud log item type */ |
660 | __uint16_t rud_size; /* size of this item */ | 660 | __uint16_t rud_size; /* size of this item */ |
661 | __uint32_t rud_nextents; /* # of extents freed */ | 661 | __uint32_t __pad; |
662 | __uint64_t rud_rui_id; /* id of corresponding rui */ | 662 | __uint64_t rud_rui_id; /* id of corresponding rui */ |
663 | struct xfs_map_extent rud_extents[1]; /* array of extents rmapped */ | ||
664 | }; | 663 | }; |
665 | 664 | ||
666 | /* | 665 | /* |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e51fd2bdacb6..e8638fd2c0c3 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -3482,9 +3482,7 @@ xlog_recover_rud_pass2( | |||
3482 | struct xfs_ail *ailp = log->l_ailp; | 3482 | struct xfs_ail *ailp = log->l_ailp; |
3483 | 3483 | ||
3484 | rud_formatp = item->ri_buf[0].i_addr; | 3484 | rud_formatp = item->ri_buf[0].i_addr; |
3485 | ASSERT(item->ri_buf[0].i_len == (sizeof(struct xfs_rud_log_format) + | 3485 | ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_rud_log_format)); |
3486 | ((rud_formatp->rud_nextents - 1) * | ||
3487 | sizeof(struct xfs_map_extent)))); | ||
3488 | rui_id = rud_formatp->rud_rui_id; | 3486 | rui_id = rud_formatp->rud_rui_id; |
3489 | 3487 | ||
3490 | /* | 3488 | /* |
diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 6d6cc3b8d44f..7e4743219430 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c | |||
@@ -273,36 +273,13 @@ static inline struct xfs_rud_log_item *RUD_ITEM(struct xfs_log_item *lip) | |||
273 | } | 273 | } |
274 | 274 | ||
275 | STATIC void | 275 | STATIC void |
276 | xfs_rud_item_free(struct xfs_rud_log_item *rudp) | ||
277 | { | ||
278 | if (rudp->rud_format.rud_nextents > XFS_RUD_MAX_FAST_EXTENTS) | ||
279 | kmem_free(rudp); | ||
280 | else | ||
281 | kmem_zone_free(xfs_rud_zone, rudp); | ||
282 | } | ||
283 | |||
284 | /* | ||
285 | * This returns the number of iovecs needed to log the given rud item. | ||
286 | * We only need 1 iovec for an rud item. It just logs the rud_log_format | ||
287 | * structure. | ||
288 | */ | ||
289 | static inline int | ||
290 | xfs_rud_item_sizeof( | ||
291 | struct xfs_rud_log_item *rudp) | ||
292 | { | ||
293 | return sizeof(struct xfs_rud_log_format) + | ||
294 | (rudp->rud_format.rud_nextents - 1) * | ||
295 | sizeof(struct xfs_map_extent); | ||
296 | } | ||
297 | |||
298 | STATIC void | ||
299 | xfs_rud_item_size( | 276 | xfs_rud_item_size( |
300 | struct xfs_log_item *lip, | 277 | struct xfs_log_item *lip, |
301 | int *nvecs, | 278 | int *nvecs, |
302 | int *nbytes) | 279 | int *nbytes) |
303 | { | 280 | { |
304 | *nvecs += 1; | 281 | *nvecs += 1; |
305 | *nbytes += xfs_rud_item_sizeof(RUD_ITEM(lip)); | 282 | *nbytes += sizeof(struct xfs_rud_log_format); |
306 | } | 283 | } |
307 | 284 | ||
308 | /* | 285 | /* |
@@ -320,13 +297,11 @@ xfs_rud_item_format( | |||
320 | struct xfs_rud_log_item *rudp = RUD_ITEM(lip); | 297 | struct xfs_rud_log_item *rudp = RUD_ITEM(lip); |
321 | struct xfs_log_iovec *vecp = NULL; | 298 | struct xfs_log_iovec *vecp = NULL; |
322 | 299 | ||
323 | ASSERT(rudp->rud_next_extent == rudp->rud_format.rud_nextents); | ||
324 | |||
325 | rudp->rud_format.rud_type = XFS_LI_RUD; | 300 | rudp->rud_format.rud_type = XFS_LI_RUD; |
326 | rudp->rud_format.rud_size = 1; | 301 | rudp->rud_format.rud_size = 1; |
327 | 302 | ||
328 | xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_RUD_FORMAT, &rudp->rud_format, | 303 | xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_RUD_FORMAT, &rudp->rud_format, |
329 | xfs_rud_item_sizeof(rudp)); | 304 | sizeof(struct xfs_rud_log_format)); |
330 | } | 305 | } |
331 | 306 | ||
332 | /* | 307 | /* |
@@ -374,7 +349,7 @@ xfs_rud_item_unlock( | |||
374 | 349 | ||
375 | if (lip->li_flags & XFS_LI_ABORTED) { | 350 | if (lip->li_flags & XFS_LI_ABORTED) { |
376 | xfs_rui_release(rudp->rud_ruip); | 351 | xfs_rui_release(rudp->rud_ruip); |
377 | xfs_rud_item_free(rudp); | 352 | kmem_zone_free(xfs_rud_zone, rudp); |
378 | } | 353 | } |
379 | } | 354 | } |
380 | 355 | ||
@@ -398,7 +373,7 @@ xfs_rud_item_committed( | |||
398 | * aborted due to log I/O error). | 373 | * aborted due to log I/O error). |
399 | */ | 374 | */ |
400 | xfs_rui_release(rudp->rud_ruip); | 375 | xfs_rui_release(rudp->rud_ruip); |
401 | xfs_rud_item_free(rudp); | 376 | kmem_zone_free(xfs_rud_zone, rudp); |
402 | 377 | ||
403 | return (xfs_lsn_t)-1; | 378 | return (xfs_lsn_t)-1; |
404 | } | 379 | } |
@@ -437,25 +412,14 @@ static const struct xfs_item_ops xfs_rud_item_ops = { | |||
437 | struct xfs_rud_log_item * | 412 | struct xfs_rud_log_item * |
438 | xfs_rud_init( | 413 | xfs_rud_init( |
439 | struct xfs_mount *mp, | 414 | struct xfs_mount *mp, |
440 | struct xfs_rui_log_item *ruip, | 415 | struct xfs_rui_log_item *ruip) |
441 | uint nextents) | ||
442 | 416 | ||
443 | { | 417 | { |
444 | struct xfs_rud_log_item *rudp; | 418 | struct xfs_rud_log_item *rudp; |
445 | uint size; | ||
446 | |||
447 | ASSERT(nextents > 0); | ||
448 | if (nextents > XFS_RUD_MAX_FAST_EXTENTS) { | ||
449 | size = (uint)(sizeof(struct xfs_rud_log_item) + | ||
450 | ((nextents - 1) * sizeof(struct xfs_map_extent))); | ||
451 | rudp = kmem_zalloc(size, KM_SLEEP); | ||
452 | } else { | ||
453 | rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); | ||
454 | } | ||
455 | 419 | ||
420 | rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); | ||
456 | xfs_log_item_init(mp, &rudp->rud_item, XFS_LI_RUD, &xfs_rud_item_ops); | 421 | xfs_log_item_init(mp, &rudp->rud_item, XFS_LI_RUD, &xfs_rud_item_ops); |
457 | rudp->rud_ruip = ruip; | 422 | rudp->rud_ruip = ruip; |
458 | rudp->rud_format.rud_nextents = nextents; | ||
459 | rudp->rud_format.rud_rui_id = ruip->rui_format.rui_id; | 423 | rudp->rud_format.rud_rui_id = ruip->rui_format.rui_id; |
460 | 424 | ||
461 | return rudp; | 425 | return rudp; |
@@ -523,7 +487,7 @@ xfs_rui_recover( | |||
523 | error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); | 487 | error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); |
524 | if (error) | 488 | if (error) |
525 | return error; | 489 | return error; |
526 | rudp = xfs_trans_get_rud(tp, ruip, ruip->rui_format.rui_nextents); | 490 | rudp = xfs_trans_get_rud(tp, ruip); |
527 | 491 | ||
528 | for (i = 0; i < ruip->rui_format.rui_nextents; i++) { | 492 | for (i = 0; i < ruip->rui_format.rui_nextents; i++) { |
529 | rmap = &(ruip->rui_format.rui_extents[i]); | 493 | rmap = &(ruip->rui_format.rui_extents[i]); |
diff --git a/fs/xfs/xfs_rmap_item.h b/fs/xfs/xfs_rmap_item.h index 59ef3ecaa493..aefcc3a318a5 100644 --- a/fs/xfs/xfs_rmap_item.h +++ b/fs/xfs/xfs_rmap_item.h | |||
@@ -77,21 +77,15 @@ struct xfs_rui_log_item { | |||
77 | struct xfs_rud_log_item { | 77 | struct xfs_rud_log_item { |
78 | struct xfs_log_item rud_item; | 78 | struct xfs_log_item rud_item; |
79 | struct xfs_rui_log_item *rud_ruip; | 79 | struct xfs_rui_log_item *rud_ruip; |
80 | uint rud_next_extent; | ||
81 | struct xfs_rud_log_format rud_format; | 80 | struct xfs_rud_log_format rud_format; |
82 | }; | 81 | }; |
83 | 82 | ||
84 | /* | ||
85 | * Max number of extents in fast allocation path. | ||
86 | */ | ||
87 | #define XFS_RUD_MAX_FAST_EXTENTS 16 | ||
88 | |||
89 | extern struct kmem_zone *xfs_rui_zone; | 83 | extern struct kmem_zone *xfs_rui_zone; |
90 | extern struct kmem_zone *xfs_rud_zone; | 84 | extern struct kmem_zone *xfs_rud_zone; |
91 | 85 | ||
92 | struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint); | 86 | struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint); |
93 | struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *, | 87 | struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *, |
94 | struct xfs_rui_log_item *, uint); | 88 | struct xfs_rui_log_item *); |
95 | int xfs_rui_copy_format(struct xfs_log_iovec *buf, | 89 | int xfs_rui_copy_format(struct xfs_log_iovec *buf, |
96 | struct xfs_rui_log_format *dst_rui_fmt); | 90 | struct xfs_rui_log_format *dst_rui_fmt); |
97 | void xfs_rui_item_free(struct xfs_rui_log_item *); | 91 | void xfs_rui_item_free(struct xfs_rui_log_item *); |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 45773df1dd0b..24ef83ef04de 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
@@ -1770,9 +1770,7 @@ xfs_init_zones(void) | |||
1770 | if (!xfs_icreate_zone) | 1770 | if (!xfs_icreate_zone) |
1771 | goto out_destroy_ili_zone; | 1771 | goto out_destroy_ili_zone; |
1772 | 1772 | ||
1773 | xfs_rud_zone = kmem_zone_init((sizeof(struct xfs_rud_log_item) + | 1773 | xfs_rud_zone = kmem_zone_init(sizeof(struct xfs_rud_log_item), |
1774 | ((XFS_RUD_MAX_FAST_EXTENTS - 1) * | ||
1775 | sizeof(struct xfs_map_extent))), | ||
1776 | "xfs_rud_item"); | 1774 | "xfs_rud_item"); |
1777 | if (!xfs_rud_zone) | 1775 | if (!xfs_rud_zone) |
1778 | goto out_destroy_icreate_zone; | 1776 | goto out_destroy_icreate_zone; |
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index bb4b84f9347e..e2bf86aad33d 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h | |||
@@ -241,7 +241,7 @@ enum xfs_rmap_intent_type; | |||
241 | 241 | ||
242 | void xfs_rmap_update_init_defer_op(void); | 242 | void xfs_rmap_update_init_defer_op(void); |
243 | struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, | 243 | struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, |
244 | struct xfs_rui_log_item *ruip, uint nextents); | 244 | struct xfs_rui_log_item *ruip); |
245 | int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, | 245 | int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, |
246 | struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, | 246 | struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, |
247 | __uint64_t owner, int whichfork, xfs_fileoff_t startoff, | 247 | __uint64_t owner, int whichfork, xfs_fileoff_t startoff, |
diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 83414764e1ab..35650d6b2606 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c | |||
@@ -129,29 +129,14 @@ xfs_trans_log_start_rmap_update( | |||
129 | xfs_trans_set_rmap_flags(rmap, type, whichfork, state); | 129 | xfs_trans_set_rmap_flags(rmap, type, whichfork, state); |
130 | } | 130 | } |
131 | 131 | ||
132 | /* | ||
133 | * This routine is called to allocate an "rmap update done" | ||
134 | * log item that will hold nextents worth of extents. The | ||
135 | * caller must use all nextents extents, because we are not | ||
136 | * flexible about this at all. | ||
137 | */ | ||
138 | struct xfs_rud_log_item * | 132 | struct xfs_rud_log_item * |
139 | xfs_trans_get_rud( | 133 | xfs_trans_get_rud( |
140 | struct xfs_trans *tp, | 134 | struct xfs_trans *tp, |
141 | struct xfs_rui_log_item *ruip, | 135 | struct xfs_rui_log_item *ruip) |
142 | uint nextents) | ||
143 | { | 136 | { |
144 | struct xfs_rud_log_item *rudp; | 137 | struct xfs_rud_log_item *rudp; |
145 | 138 | ||
146 | ASSERT(tp != NULL); | 139 | rudp = xfs_rud_init(tp->t_mountp, ruip); |
147 | ASSERT(nextents > 0); | ||
148 | |||
149 | rudp = xfs_rud_init(tp->t_mountp, ruip, nextents); | ||
150 | ASSERT(rudp != NULL); | ||
151 | |||
152 | /* | ||
153 | * Get a log_item_desc to point at the new item. | ||
154 | */ | ||
155 | xfs_trans_add_item(tp, &rudp->rud_item); | 140 | xfs_trans_add_item(tp, &rudp->rud_item); |
156 | return rudp; | 141 | return rudp; |
157 | } | 142 | } |
@@ -174,8 +159,6 @@ xfs_trans_log_finish_rmap_update( | |||
174 | xfs_exntst_t state, | 159 | xfs_exntst_t state, |
175 | struct xfs_btree_cur **pcur) | 160 | struct xfs_btree_cur **pcur) |
176 | { | 161 | { |
177 | uint next_extent; | ||
178 | struct xfs_map_extent *rmap; | ||
179 | int error; | 162 | int error; |
180 | 163 | ||
181 | error = xfs_rmap_finish_one(tp, type, owner, whichfork, startoff, | 164 | error = xfs_rmap_finish_one(tp, type, owner, whichfork, startoff, |
@@ -191,16 +174,6 @@ xfs_trans_log_finish_rmap_update( | |||
191 | tp->t_flags |= XFS_TRANS_DIRTY; | 174 | tp->t_flags |= XFS_TRANS_DIRTY; |
192 | rudp->rud_item.li_desc->lid_flags |= XFS_LID_DIRTY; | 175 | rudp->rud_item.li_desc->lid_flags |= XFS_LID_DIRTY; |
193 | 176 | ||
194 | next_extent = rudp->rud_next_extent; | ||
195 | ASSERT(next_extent < rudp->rud_format.rud_nextents); | ||
196 | rmap = &(rudp->rud_format.rud_extents[next_extent]); | ||
197 | rmap->me_owner = owner; | ||
198 | rmap->me_startblock = startblock; | ||
199 | rmap->me_startoff = startoff; | ||
200 | rmap->me_len = blockcount; | ||
201 | xfs_trans_set_rmap_flags(rmap, type, whichfork, state); | ||
202 | rudp->rud_next_extent++; | ||
203 | |||
204 | return error; | 177 | return error; |
205 | } | 178 | } |
206 | 179 | ||
@@ -255,7 +228,7 @@ xfs_rmap_update_create_done( | |||
255 | void *intent, | 228 | void *intent, |
256 | unsigned int count) | 229 | unsigned int count) |
257 | { | 230 | { |
258 | return xfs_trans_get_rud(tp, intent, count); | 231 | return xfs_trans_get_rud(tp, intent); |
259 | } | 232 | } |
260 | 233 | ||
261 | /* Process a deferred rmap update. */ | 234 | /* Process a deferred rmap update. */ |