diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-02-29 04:53:54 -0500 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2012-03-13 18:08:17 -0400 |
commit | f5d8d5c4bf29c9f7754d9cbe5e27c785106ba872 (patch) | |
tree | edb30eef42b3a26e5e9c33448e85a812971cbc30 /fs/xfs/xfs_inode_item.c | |
parent | 339a5f5dd9d3ac3d68a594d81507e1eab77ed223 (diff) |
xfs: split in-core and on-disk inode log item fields
Add a new ili_fields member to the inode log item to isolate the in-memory
flags from the ones that actually go to the log. This will allow tracking
timestamp-only updates for fdatasync and O_DSYNC in the next patch and
prepares for divorcing the on-disk log format from the in-memory log item
a little further down the road.
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_inode_item.c')
-rw-r--r-- | fs/xfs/xfs_inode_item.c | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 965d3d083625..8becef4f9e6a 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
@@ -59,20 +59,20 @@ xfs_inode_item_size( | |||
59 | 59 | ||
60 | switch (ip->i_d.di_format) { | 60 | switch (ip->i_d.di_format) { |
61 | case XFS_DINODE_FMT_EXTENTS: | 61 | case XFS_DINODE_FMT_EXTENTS: |
62 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DEXT) && | 62 | if ((iip->ili_fields & XFS_ILOG_DEXT) && |
63 | ip->i_d.di_nextents > 0 && | 63 | ip->i_d.di_nextents > 0 && |
64 | ip->i_df.if_bytes > 0) | 64 | ip->i_df.if_bytes > 0) |
65 | nvecs++; | 65 | nvecs++; |
66 | break; | 66 | break; |
67 | 67 | ||
68 | case XFS_DINODE_FMT_BTREE: | 68 | case XFS_DINODE_FMT_BTREE: |
69 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DBROOT) && | 69 | if ((iip->ili_fields & XFS_ILOG_DBROOT) && |
70 | ip->i_df.if_broot_bytes > 0) | 70 | ip->i_df.if_broot_bytes > 0) |
71 | nvecs++; | 71 | nvecs++; |
72 | break; | 72 | break; |
73 | 73 | ||
74 | case XFS_DINODE_FMT_LOCAL: | 74 | case XFS_DINODE_FMT_LOCAL: |
75 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DDATA) && | 75 | if ((iip->ili_fields & XFS_ILOG_DDATA) && |
76 | ip->i_df.if_bytes > 0) | 76 | ip->i_df.if_bytes > 0) |
77 | nvecs++; | 77 | nvecs++; |
78 | break; | 78 | break; |
@@ -95,20 +95,20 @@ xfs_inode_item_size( | |||
95 | */ | 95 | */ |
96 | switch (ip->i_d.di_aformat) { | 96 | switch (ip->i_d.di_aformat) { |
97 | case XFS_DINODE_FMT_EXTENTS: | 97 | case XFS_DINODE_FMT_EXTENTS: |
98 | if ((iip->ili_format.ilf_fields & XFS_ILOG_AEXT) && | 98 | if ((iip->ili_fields & XFS_ILOG_AEXT) && |
99 | ip->i_d.di_anextents > 0 && | 99 | ip->i_d.di_anextents > 0 && |
100 | ip->i_afp->if_bytes > 0) | 100 | ip->i_afp->if_bytes > 0) |
101 | nvecs++; | 101 | nvecs++; |
102 | break; | 102 | break; |
103 | 103 | ||
104 | case XFS_DINODE_FMT_BTREE: | 104 | case XFS_DINODE_FMT_BTREE: |
105 | if ((iip->ili_format.ilf_fields & XFS_ILOG_ABROOT) && | 105 | if ((iip->ili_fields & XFS_ILOG_ABROOT) && |
106 | ip->i_afp->if_broot_bytes > 0) | 106 | ip->i_afp->if_broot_bytes > 0) |
107 | nvecs++; | 107 | nvecs++; |
108 | break; | 108 | break; |
109 | 109 | ||
110 | case XFS_DINODE_FMT_LOCAL: | 110 | case XFS_DINODE_FMT_LOCAL: |
111 | if ((iip->ili_format.ilf_fields & XFS_ILOG_ADATA) && | 111 | if ((iip->ili_fields & XFS_ILOG_ADATA) && |
112 | ip->i_afp->if_bytes > 0) | 112 | ip->i_afp->if_bytes > 0) |
113 | nvecs++; | 113 | nvecs++; |
114 | break; | 114 | break; |
@@ -185,7 +185,6 @@ xfs_inode_item_format( | |||
185 | vecp->i_type = XLOG_REG_TYPE_ICORE; | 185 | vecp->i_type = XLOG_REG_TYPE_ICORE; |
186 | vecp++; | 186 | vecp++; |
187 | nvecs++; | 187 | nvecs++; |
188 | iip->ili_format.ilf_fields |= XFS_ILOG_CORE; | ||
189 | 188 | ||
190 | /* | 189 | /* |
191 | * If this is really an old format inode, then we need to | 190 | * If this is really an old format inode, then we need to |
@@ -218,11 +217,11 @@ xfs_inode_item_format( | |||
218 | 217 | ||
219 | switch (ip->i_d.di_format) { | 218 | switch (ip->i_d.di_format) { |
220 | case XFS_DINODE_FMT_EXTENTS: | 219 | case XFS_DINODE_FMT_EXTENTS: |
221 | iip->ili_format.ilf_fields &= | 220 | iip->ili_fields &= |
222 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | | 221 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | |
223 | XFS_ILOG_DEV | XFS_ILOG_UUID); | 222 | XFS_ILOG_DEV | XFS_ILOG_UUID); |
224 | 223 | ||
225 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DEXT) && | 224 | if ((iip->ili_fields & XFS_ILOG_DEXT) && |
226 | ip->i_d.di_nextents > 0 && | 225 | ip->i_d.di_nextents > 0 && |
227 | ip->i_df.if_bytes > 0) { | 226 | ip->i_df.if_bytes > 0) { |
228 | ASSERT(ip->i_df.if_u1.if_extents != NULL); | 227 | ASSERT(ip->i_df.if_u1.if_extents != NULL); |
@@ -251,16 +250,16 @@ xfs_inode_item_format( | |||
251 | vecp++; | 250 | vecp++; |
252 | nvecs++; | 251 | nvecs++; |
253 | } else { | 252 | } else { |
254 | iip->ili_format.ilf_fields &= ~XFS_ILOG_DEXT; | 253 | iip->ili_fields &= ~XFS_ILOG_DEXT; |
255 | } | 254 | } |
256 | break; | 255 | break; |
257 | 256 | ||
258 | case XFS_DINODE_FMT_BTREE: | 257 | case XFS_DINODE_FMT_BTREE: |
259 | iip->ili_format.ilf_fields &= | 258 | iip->ili_fields &= |
260 | ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | | 259 | ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | |
261 | XFS_ILOG_DEV | XFS_ILOG_UUID); | 260 | XFS_ILOG_DEV | XFS_ILOG_UUID); |
262 | 261 | ||
263 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DBROOT) && | 262 | if ((iip->ili_fields & XFS_ILOG_DBROOT) && |
264 | ip->i_df.if_broot_bytes > 0) { | 263 | ip->i_df.if_broot_bytes > 0) { |
265 | ASSERT(ip->i_df.if_broot != NULL); | 264 | ASSERT(ip->i_df.if_broot != NULL); |
266 | vecp->i_addr = ip->i_df.if_broot; | 265 | vecp->i_addr = ip->i_df.if_broot; |
@@ -270,7 +269,7 @@ xfs_inode_item_format( | |||
270 | nvecs++; | 269 | nvecs++; |
271 | iip->ili_format.ilf_dsize = ip->i_df.if_broot_bytes; | 270 | iip->ili_format.ilf_dsize = ip->i_df.if_broot_bytes; |
272 | } else { | 271 | } else { |
273 | ASSERT(!(iip->ili_format.ilf_fields & | 272 | ASSERT(!(iip->ili_fields & |
274 | XFS_ILOG_DBROOT)); | 273 | XFS_ILOG_DBROOT)); |
275 | #ifdef XFS_TRANS_DEBUG | 274 | #ifdef XFS_TRANS_DEBUG |
276 | if (iip->ili_root_size > 0) { | 275 | if (iip->ili_root_size > 0) { |
@@ -283,15 +282,15 @@ xfs_inode_item_format( | |||
283 | ASSERT(ip->i_df.if_broot_bytes == 0); | 282 | ASSERT(ip->i_df.if_broot_bytes == 0); |
284 | } | 283 | } |
285 | #endif | 284 | #endif |
286 | iip->ili_format.ilf_fields &= ~XFS_ILOG_DBROOT; | 285 | iip->ili_fields &= ~XFS_ILOG_DBROOT; |
287 | } | 286 | } |
288 | break; | 287 | break; |
289 | 288 | ||
290 | case XFS_DINODE_FMT_LOCAL: | 289 | case XFS_DINODE_FMT_LOCAL: |
291 | iip->ili_format.ilf_fields &= | 290 | iip->ili_fields &= |
292 | ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | | 291 | ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | |
293 | XFS_ILOG_DEV | XFS_ILOG_UUID); | 292 | XFS_ILOG_DEV | XFS_ILOG_UUID); |
294 | if ((iip->ili_format.ilf_fields & XFS_ILOG_DDATA) && | 293 | if ((iip->ili_fields & XFS_ILOG_DDATA) && |
295 | ip->i_df.if_bytes > 0) { | 294 | ip->i_df.if_bytes > 0) { |
296 | ASSERT(ip->i_df.if_u1.if_data != NULL); | 295 | ASSERT(ip->i_df.if_u1.if_data != NULL); |
297 | ASSERT(ip->i_d.di_size > 0); | 296 | ASSERT(ip->i_d.di_size > 0); |
@@ -311,25 +310,25 @@ xfs_inode_item_format( | |||
311 | nvecs++; | 310 | nvecs++; |
312 | iip->ili_format.ilf_dsize = (unsigned)data_bytes; | 311 | iip->ili_format.ilf_dsize = (unsigned)data_bytes; |
313 | } else { | 312 | } else { |
314 | iip->ili_format.ilf_fields &= ~XFS_ILOG_DDATA; | 313 | iip->ili_fields &= ~XFS_ILOG_DDATA; |
315 | } | 314 | } |
316 | break; | 315 | break; |
317 | 316 | ||
318 | case XFS_DINODE_FMT_DEV: | 317 | case XFS_DINODE_FMT_DEV: |
319 | iip->ili_format.ilf_fields &= | 318 | iip->ili_fields &= |
320 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | | 319 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | |
321 | XFS_ILOG_DEXT | XFS_ILOG_UUID); | 320 | XFS_ILOG_DEXT | XFS_ILOG_UUID); |
322 | if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) { | 321 | if (iip->ili_fields & XFS_ILOG_DEV) { |
323 | iip->ili_format.ilf_u.ilfu_rdev = | 322 | iip->ili_format.ilf_u.ilfu_rdev = |
324 | ip->i_df.if_u2.if_rdev; | 323 | ip->i_df.if_u2.if_rdev; |
325 | } | 324 | } |
326 | break; | 325 | break; |
327 | 326 | ||
328 | case XFS_DINODE_FMT_UUID: | 327 | case XFS_DINODE_FMT_UUID: |
329 | iip->ili_format.ilf_fields &= | 328 | iip->ili_fields &= |
330 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | | 329 | ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | |
331 | XFS_ILOG_DEXT | XFS_ILOG_DEV); | 330 | XFS_ILOG_DEXT | XFS_ILOG_DEV); |
332 | if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) { | 331 | if (iip->ili_fields & XFS_ILOG_UUID) { |
333 | iip->ili_format.ilf_u.ilfu_uuid = | 332 | iip->ili_format.ilf_u.ilfu_uuid = |
334 | ip->i_df.if_u2.if_uuid; | 333 | ip->i_df.if_u2.if_uuid; |
335 | } | 334 | } |
@@ -344,18 +343,17 @@ xfs_inode_item_format( | |||
344 | * If there are no attributes associated with the file, then we're done. | 343 | * If there are no attributes associated with the file, then we're done. |
345 | */ | 344 | */ |
346 | if (!XFS_IFORK_Q(ip)) { | 345 | if (!XFS_IFORK_Q(ip)) { |
347 | iip->ili_format.ilf_size = nvecs; | 346 | iip->ili_fields &= |
348 | iip->ili_format.ilf_fields &= | ||
349 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); | 347 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); |
350 | return; | 348 | goto out; |
351 | } | 349 | } |
352 | 350 | ||
353 | switch (ip->i_d.di_aformat) { | 351 | switch (ip->i_d.di_aformat) { |
354 | case XFS_DINODE_FMT_EXTENTS: | 352 | case XFS_DINODE_FMT_EXTENTS: |
355 | iip->ili_format.ilf_fields &= | 353 | iip->ili_fields &= |
356 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); | 354 | ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); |
357 | 355 | ||
358 | if ((iip->ili_format.ilf_fields & XFS_ILOG_AEXT) && | 356 | if ((iip->ili_fields & XFS_ILOG_AEXT) && |
359 | ip->i_d.di_anextents > 0 && | 357 | ip->i_d.di_anextents > 0 && |
360 | ip->i_afp->if_bytes > 0) { | 358 | ip->i_afp->if_bytes > 0) { |
361 | ASSERT(ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) == | 359 | ASSERT(ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) == |
@@ -378,15 +376,15 @@ xfs_inode_item_format( | |||
378 | vecp++; | 376 | vecp++; |
379 | nvecs++; | 377 | nvecs++; |
380 | } else { | 378 | } else { |
381 | iip->ili_format.ilf_fields &= ~XFS_ILOG_AEXT; | 379 | iip->ili_fields &= ~XFS_ILOG_AEXT; |
382 | } | 380 | } |
383 | break; | 381 | break; |
384 | 382 | ||
385 | case XFS_DINODE_FMT_BTREE: | 383 | case XFS_DINODE_FMT_BTREE: |
386 | iip->ili_format.ilf_fields &= | 384 | iip->ili_fields &= |
387 | ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); | 385 | ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); |
388 | 386 | ||
389 | if ((iip->ili_format.ilf_fields & XFS_ILOG_ABROOT) && | 387 | if ((iip->ili_fields & XFS_ILOG_ABROOT) && |
390 | ip->i_afp->if_broot_bytes > 0) { | 388 | ip->i_afp->if_broot_bytes > 0) { |
391 | ASSERT(ip->i_afp->if_broot != NULL); | 389 | ASSERT(ip->i_afp->if_broot != NULL); |
392 | 390 | ||
@@ -397,15 +395,15 @@ xfs_inode_item_format( | |||
397 | nvecs++; | 395 | nvecs++; |
398 | iip->ili_format.ilf_asize = ip->i_afp->if_broot_bytes; | 396 | iip->ili_format.ilf_asize = ip->i_afp->if_broot_bytes; |
399 | } else { | 397 | } else { |
400 | iip->ili_format.ilf_fields &= ~XFS_ILOG_ABROOT; | 398 | iip->ili_fields &= ~XFS_ILOG_ABROOT; |
401 | } | 399 | } |
402 | break; | 400 | break; |
403 | 401 | ||
404 | case XFS_DINODE_FMT_LOCAL: | 402 | case XFS_DINODE_FMT_LOCAL: |
405 | iip->ili_format.ilf_fields &= | 403 | iip->ili_fields &= |
406 | ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); | 404 | ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); |
407 | 405 | ||
408 | if ((iip->ili_format.ilf_fields & XFS_ILOG_ADATA) && | 406 | if ((iip->ili_fields & XFS_ILOG_ADATA) && |
409 | ip->i_afp->if_bytes > 0) { | 407 | ip->i_afp->if_bytes > 0) { |
410 | ASSERT(ip->i_afp->if_u1.if_data != NULL); | 408 | ASSERT(ip->i_afp->if_u1.if_data != NULL); |
411 | 409 | ||
@@ -424,7 +422,7 @@ xfs_inode_item_format( | |||
424 | nvecs++; | 422 | nvecs++; |
425 | iip->ili_format.ilf_asize = (unsigned)data_bytes; | 423 | iip->ili_format.ilf_asize = (unsigned)data_bytes; |
426 | } else { | 424 | } else { |
427 | iip->ili_format.ilf_fields &= ~XFS_ILOG_ADATA; | 425 | iip->ili_fields &= ~XFS_ILOG_ADATA; |
428 | } | 426 | } |
429 | break; | 427 | break; |
430 | 428 | ||
@@ -433,6 +431,14 @@ xfs_inode_item_format( | |||
433 | break; | 431 | break; |
434 | } | 432 | } |
435 | 433 | ||
434 | out: | ||
435 | /* | ||
436 | * Now update the log format that goes out to disk from the in-core | ||
437 | * values. We always write the inode core to make the arithmetic | ||
438 | * games in recovery easier, which isn't a big deal as just about any | ||
439 | * transaction would dirty it anyway. | ||
440 | */ | ||
441 | iip->ili_format.ilf_fields = XFS_ILOG_CORE | iip->ili_fields; | ||
436 | iip->ili_format.ilf_size = nvecs; | 442 | iip->ili_format.ilf_size = nvecs; |
437 | } | 443 | } |
438 | 444 | ||
@@ -517,7 +523,7 @@ xfs_inode_item_trylock( | |||
517 | 523 | ||
518 | #ifdef DEBUG | 524 | #ifdef DEBUG |
519 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { | 525 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { |
520 | ASSERT(iip->ili_format.ilf_fields != 0); | 526 | ASSERT(iip->ili_fields != 0); |
521 | ASSERT(iip->ili_logged == 0); | 527 | ASSERT(iip->ili_logged == 0); |
522 | ASSERT(lip->li_flags & XFS_LI_IN_AIL); | 528 | ASSERT(lip->li_flags & XFS_LI_IN_AIL); |
523 | } | 529 | } |
@@ -549,7 +555,7 @@ xfs_inode_item_unlock( | |||
549 | if (iip->ili_extents_buf != NULL) { | 555 | if (iip->ili_extents_buf != NULL) { |
550 | ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS); | 556 | ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS); |
551 | ASSERT(ip->i_d.di_nextents > 0); | 557 | ASSERT(ip->i_d.di_nextents > 0); |
552 | ASSERT(iip->ili_format.ilf_fields & XFS_ILOG_DEXT); | 558 | ASSERT(iip->ili_fields & XFS_ILOG_DEXT); |
553 | ASSERT(ip->i_df.if_bytes > 0); | 559 | ASSERT(ip->i_df.if_bytes > 0); |
554 | kmem_free(iip->ili_extents_buf); | 560 | kmem_free(iip->ili_extents_buf); |
555 | iip->ili_extents_buf = NULL; | 561 | iip->ili_extents_buf = NULL; |
@@ -557,7 +563,7 @@ xfs_inode_item_unlock( | |||
557 | if (iip->ili_aextents_buf != NULL) { | 563 | if (iip->ili_aextents_buf != NULL) { |
558 | ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS); | 564 | ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS); |
559 | ASSERT(ip->i_d.di_anextents > 0); | 565 | ASSERT(ip->i_d.di_anextents > 0); |
560 | ASSERT(iip->ili_format.ilf_fields & XFS_ILOG_AEXT); | 566 | ASSERT(iip->ili_fields & XFS_ILOG_AEXT); |
561 | ASSERT(ip->i_afp->if_bytes > 0); | 567 | ASSERT(ip->i_afp->if_bytes > 0); |
562 | kmem_free(iip->ili_aextents_buf); | 568 | kmem_free(iip->ili_aextents_buf); |
563 | iip->ili_aextents_buf = NULL; | 569 | iip->ili_aextents_buf = NULL; |
@@ -672,8 +678,7 @@ xfs_inode_item_push( | |||
672 | * lock without sleeping, then there must not have been | 678 | * lock without sleeping, then there must not have been |
673 | * anyone in the process of flushing the inode. | 679 | * anyone in the process of flushing the inode. |
674 | */ | 680 | */ |
675 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || | 681 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || iip->ili_fields != 0); |
676 | iip->ili_format.ilf_fields != 0); | ||
677 | 682 | ||
678 | /* | 683 | /* |
679 | * Push the inode to it's backing buffer. This will not remove the | 684 | * Push the inode to it's backing buffer. This will not remove the |
@@ -896,7 +901,7 @@ xfs_iflush_abort( | |||
896 | * Clear the inode logging fields so no more flushes are | 901 | * Clear the inode logging fields so no more flushes are |
897 | * attempted. | 902 | * attempted. |
898 | */ | 903 | */ |
899 | iip->ili_format.ilf_fields = 0; | 904 | iip->ili_fields = 0; |
900 | } | 905 | } |
901 | /* | 906 | /* |
902 | * Release the inode's flush lock since we're done with it. | 907 | * Release the inode's flush lock since we're done with it. |