summaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/libxfs/xfs_log_format.h3
-rw-r--r--fs/xfs/xfs_log_recover.c4
-rw-r--r--fs/xfs/xfs_rmap_item.c50
-rw-r--r--fs/xfs/xfs_rmap_item.h8
-rw-r--r--fs/xfs/xfs_super.c4
-rw-r--r--fs/xfs/xfs_trans.h2
-rw-r--r--fs/xfs/xfs_trans_rmap.c33
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 {
658struct xfs_rud_log_format { 658struct 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
275STATIC void 275STATIC void
276xfs_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 */
289static inline int
290xfs_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
298STATIC void
299xfs_rud_item_size( 276xfs_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 = {
437struct xfs_rud_log_item * 412struct xfs_rud_log_item *
438xfs_rud_init( 413xfs_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 {
77struct xfs_rud_log_item { 77struct 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
89extern struct kmem_zone *xfs_rui_zone; 83extern struct kmem_zone *xfs_rui_zone;
90extern struct kmem_zone *xfs_rud_zone; 84extern struct kmem_zone *xfs_rud_zone;
91 85
92struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint); 86struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint);
93struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *, 87struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *,
94 struct xfs_rui_log_item *, uint); 88 struct xfs_rui_log_item *);
95int xfs_rui_copy_format(struct xfs_log_iovec *buf, 89int 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);
97void xfs_rui_item_free(struct xfs_rui_log_item *); 91void 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
242void xfs_rmap_update_init_defer_op(void); 242void xfs_rmap_update_init_defer_op(void);
243struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, 243struct 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);
245int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, 245int 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 */
138struct xfs_rud_log_item * 132struct xfs_rud_log_item *
139xfs_trans_get_rud( 133xfs_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. */