summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-08-02 22:28:43 -0400
committerDave Chinner <david@fromorbit.com>2016-08-02 22:28:43 -0400
commit722e251770306ee325151b28e40b5d7e5497d687 (patch)
treee08729ba5724bf31c9b6df0331bbb0359ab5ecc1
parentc1d22ae89cf6086d6a457b3b9241fcb36ebddd14 (diff)
xfs: remove the extents array from the rmap update done log item
Nothing ever uses the extent array in the rmap update done redo item, so remove it before it is fixed in the on-disk log format. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-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. */