aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode_item.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2012-02-29 04:53:54 -0500
committerBen Myers <bpm@sgi.com>2012-03-13 18:08:17 -0400
commitf5d8d5c4bf29c9f7754d9cbe5e27c785106ba872 (patch)
treeedb30eef42b3a26e5e9c33448e85a812971cbc30 /fs/xfs/xfs_inode_item.c
parent339a5f5dd9d3ac3d68a594d81507e1eab77ed223 (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.c83
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
434out:
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.