diff options
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 9 | ||||
| -rw-r--r-- | fs/xfs/xfs_ag.h | 1 | ||||
| -rw-r--r-- | fs/xfs/xfs_iget.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_mount.c | 52 |
5 files changed, 21 insertions, 46 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 3884e20bc14e..ef7f0218bccb 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
| @@ -164,10 +164,6 @@ xfs_inode_ag_iterator( | |||
| 164 | struct xfs_perag *pag; | 164 | struct xfs_perag *pag; |
| 165 | 165 | ||
| 166 | pag = xfs_perag_get(mp, ag); | 166 | pag = xfs_perag_get(mp, ag); |
| 167 | if (!pag->pag_ici_init) { | ||
| 168 | xfs_perag_put(pag); | ||
| 169 | continue; | ||
| 170 | } | ||
| 171 | error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, | 167 | error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, |
| 172 | exclusive, &nr); | 168 | exclusive, &nr); |
| 173 | xfs_perag_put(pag); | 169 | xfs_perag_put(pag); |
| @@ -867,12 +863,7 @@ xfs_reclaim_inode_shrink( | |||
| 867 | down_read(&xfs_mount_list_lock); | 863 | down_read(&xfs_mount_list_lock); |
| 868 | list_for_each_entry(mp, &xfs_mount_list, m_mplist) { | 864 | list_for_each_entry(mp, &xfs_mount_list, m_mplist) { |
| 869 | for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { | 865 | for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { |
| 870 | |||
| 871 | pag = xfs_perag_get(mp, ag); | 866 | pag = xfs_perag_get(mp, ag); |
| 872 | if (!pag->pag_ici_init) { | ||
| 873 | xfs_perag_put(pag); | ||
| 874 | continue; | ||
| 875 | } | ||
| 876 | reclaimable += pag->pag_ici_reclaimable; | 867 | reclaimable += pag->pag_ici_reclaimable; |
| 877 | xfs_perag_put(pag); | 868 | xfs_perag_put(pag); |
| 878 | } | 869 | } |
diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 401f364ad36c..4917d4eed4ed 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h | |||
| @@ -227,7 +227,6 @@ typedef struct xfs_perag { | |||
| 227 | 227 | ||
| 228 | atomic_t pagf_fstrms; /* # of filestreams active in this AG */ | 228 | atomic_t pagf_fstrms; /* # of filestreams active in this AG */ |
| 229 | 229 | ||
| 230 | int pag_ici_init; /* incore inode cache initialised */ | ||
| 231 | rwlock_t pag_ici_lock; /* incore inode lock */ | 230 | rwlock_t pag_ici_lock; /* incore inode lock */ |
| 232 | struct radix_tree_root pag_ici_root; /* incore inode cache root */ | 231 | struct radix_tree_root pag_ici_root; /* incore inode cache root */ |
| 233 | int pag_ici_reclaimable; /* reclaimable inodes */ | 232 | int pag_ici_reclaimable; /* reclaimable inodes */ |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 6845db90818f..f44a367907a8 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -382,9 +382,6 @@ xfs_iget( | |||
| 382 | 382 | ||
| 383 | /* get the perag structure and ensure that it's inode capable */ | 383 | /* get the perag structure and ensure that it's inode capable */ |
| 384 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); | 384 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); |
| 385 | if (!pag->pagi_inodeok) | ||
| 386 | return EINVAL; | ||
| 387 | ASSERT(pag->pag_ici_init); | ||
| 388 | agino = XFS_INO_TO_AGINO(mp, ino); | 385 | agino = XFS_INO_TO_AGINO(mp, ino); |
| 389 | 386 | ||
| 390 | again: | 387 | again: |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8cd6e8d8fe9c..6ba7765026f6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -2649,8 +2649,6 @@ xfs_iflush_cluster( | |||
| 2649 | int i; | 2649 | int i; |
| 2650 | 2650 | ||
| 2651 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); | 2651 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); |
| 2652 | ASSERT(pag->pagi_inodeok); | ||
| 2653 | ASSERT(pag->pag_ici_init); | ||
| 2654 | 2652 | ||
| 2655 | inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; | 2653 | inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; |
| 2656 | ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); | 2654 | ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index ef1233b09683..d59f4e8bedcf 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -413,17 +413,6 @@ xfs_mount_validate_sb( | |||
| 413 | return 0; | 413 | return 0; |
| 414 | } | 414 | } |
| 415 | 415 | ||
| 416 | STATIC void | ||
| 417 | xfs_initialize_perag_icache( | ||
| 418 | xfs_perag_t *pag) | ||
| 419 | { | ||
| 420 | if (!pag->pag_ici_init) { | ||
| 421 | rwlock_init(&pag->pag_ici_lock); | ||
| 422 | INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); | ||
| 423 | pag->pag_ici_init = 1; | ||
| 424 | } | ||
| 425 | } | ||
| 426 | |||
| 427 | int | 416 | int |
| 428 | xfs_initialize_perag( | 417 | xfs_initialize_perag( |
| 429 | xfs_mount_t *mp, | 418 | xfs_mount_t *mp, |
| @@ -436,13 +425,8 @@ xfs_initialize_perag( | |||
| 436 | xfs_agino_t agino; | 425 | xfs_agino_t agino; |
| 437 | xfs_ino_t ino; | 426 | xfs_ino_t ino; |
| 438 | xfs_sb_t *sbp = &mp->m_sb; | 427 | xfs_sb_t *sbp = &mp->m_sb; |
| 439 | xfs_ino_t max_inum = XFS_MAXINUMBER_32; | ||
| 440 | int error = -ENOMEM; | 428 | int error = -ENOMEM; |
| 441 | 429 | ||
| 442 | /* Check to see if the filesystem can overflow 32 bit inodes */ | ||
| 443 | agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); | ||
| 444 | ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); | ||
| 445 | |||
| 446 | /* | 430 | /* |
| 447 | * Walk the current per-ag tree so we don't try to initialise AGs | 431 | * Walk the current per-ag tree so we don't try to initialise AGs |
| 448 | * that already exist (growfs case). Allocate and insert all the | 432 | * that already exist (growfs case). Allocate and insert all the |
| @@ -456,11 +440,18 @@ xfs_initialize_perag( | |||
| 456 | } | 440 | } |
| 457 | if (!first_initialised) | 441 | if (!first_initialised) |
| 458 | first_initialised = index; | 442 | first_initialised = index; |
| 443 | |||
| 459 | pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); | 444 | pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); |
| 460 | if (!pag) | 445 | if (!pag) |
| 461 | goto out_unwind; | 446 | goto out_unwind; |
| 447 | pag->pag_agno = index; | ||
| 448 | pag->pag_mount = mp; | ||
| 449 | rwlock_init(&pag->pag_ici_lock); | ||
| 450 | INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); | ||
| 451 | |||
| 462 | if (radix_tree_preload(GFP_NOFS)) | 452 | if (radix_tree_preload(GFP_NOFS)) |
| 463 | goto out_unwind; | 453 | goto out_unwind; |
| 454 | |||
| 464 | spin_lock(&mp->m_perag_lock); | 455 | spin_lock(&mp->m_perag_lock); |
| 465 | if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { | 456 | if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { |
| 466 | BUG(); | 457 | BUG(); |
| @@ -469,25 +460,26 @@ xfs_initialize_perag( | |||
| 469 | error = -EEXIST; | 460 | error = -EEXIST; |
| 470 | goto out_unwind; | 461 | goto out_unwind; |
| 471 | } | 462 | } |
| 472 | pag->pag_agno = index; | ||
| 473 | pag->pag_mount = mp; | ||
| 474 | spin_unlock(&mp->m_perag_lock); | 463 | spin_unlock(&mp->m_perag_lock); |
| 475 | radix_tree_preload_end(); | 464 | radix_tree_preload_end(); |
| 476 | } | 465 | } |
| 477 | 466 | ||
| 478 | /* Clear the mount flag if no inode can overflow 32 bits | 467 | /* |
| 479 | * on this filesystem, or if specifically requested.. | 468 | * If we mount with the inode64 option, or no inode overflows |
| 469 | * the legacy 32-bit address space clear the inode32 option. | ||
| 480 | */ | 470 | */ |
| 481 | if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > max_inum) { | 471 | agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); |
| 472 | ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); | ||
| 473 | |||
| 474 | if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32) | ||
| 482 | mp->m_flags |= XFS_MOUNT_32BITINODES; | 475 | mp->m_flags |= XFS_MOUNT_32BITINODES; |
| 483 | } else { | 476 | else |
| 484 | mp->m_flags &= ~XFS_MOUNT_32BITINODES; | 477 | mp->m_flags &= ~XFS_MOUNT_32BITINODES; |
| 485 | } | ||
| 486 | 478 | ||
| 487 | /* If we can overflow then setup the ag headers accordingly */ | ||
| 488 | if (mp->m_flags & XFS_MOUNT_32BITINODES) { | 479 | if (mp->m_flags & XFS_MOUNT_32BITINODES) { |
| 489 | /* Calculate how much should be reserved for inodes to | 480 | /* |
| 490 | * meet the max inode percentage. | 481 | * Calculate how much should be reserved for inodes to meet |
| 482 | * the max inode percentage. | ||
| 491 | */ | 483 | */ |
| 492 | if (mp->m_maxicount) { | 484 | if (mp->m_maxicount) { |
| 493 | __uint64_t icount; | 485 | __uint64_t icount; |
| @@ -500,30 +492,28 @@ xfs_initialize_perag( | |||
| 500 | } else { | 492 | } else { |
| 501 | max_metadata = agcount; | 493 | max_metadata = agcount; |
| 502 | } | 494 | } |
| 495 | |||
| 503 | for (index = 0; index < agcount; index++) { | 496 | for (index = 0; index < agcount; index++) { |
| 504 | ino = XFS_AGINO_TO_INO(mp, index, agino); | 497 | ino = XFS_AGINO_TO_INO(mp, index, agino); |
| 505 | if (ino > max_inum) { | 498 | if (ino > XFS_MAXINUMBER_32) { |
| 506 | index++; | 499 | index++; |
| 507 | break; | 500 | break; |
| 508 | } | 501 | } |
| 509 | 502 | ||
| 510 | /* This ag is preferred for inodes */ | ||
| 511 | pag = xfs_perag_get(mp, index); | 503 | pag = xfs_perag_get(mp, index); |
| 512 | pag->pagi_inodeok = 1; | 504 | pag->pagi_inodeok = 1; |
| 513 | if (index < max_metadata) | 505 | if (index < max_metadata) |
| 514 | pag->pagf_metadata = 1; | 506 | pag->pagf_metadata = 1; |
| 515 | xfs_initialize_perag_icache(pag); | ||
| 516 | xfs_perag_put(pag); | 507 | xfs_perag_put(pag); |
| 517 | } | 508 | } |
| 518 | } else { | 509 | } else { |
| 519 | /* Setup default behavior for smaller filesystems */ | ||
| 520 | for (index = 0; index < agcount; index++) { | 510 | for (index = 0; index < agcount; index++) { |
| 521 | pag = xfs_perag_get(mp, index); | 511 | pag = xfs_perag_get(mp, index); |
| 522 | pag->pagi_inodeok = 1; | 512 | pag->pagi_inodeok = 1; |
| 523 | xfs_initialize_perag_icache(pag); | ||
| 524 | xfs_perag_put(pag); | 513 | xfs_perag_put(pag); |
| 525 | } | 514 | } |
| 526 | } | 515 | } |
| 516 | |||
| 527 | if (maxagi) | 517 | if (maxagi) |
| 528 | *maxagi = index; | 518 | *maxagi = index; |
| 529 | return 0; | 519 | return 0; |
