diff options
Diffstat (limited to 'fs/xfs/xfs_iget.c')
-rw-r--r-- | fs/xfs/xfs_iget.c | 53 |
1 files changed, 1 insertions, 52 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 9e86f2116aa8..eba5ae61d362 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -91,7 +91,7 @@ xfs_inode_alloc( | |||
91 | return ip; | 91 | return ip; |
92 | } | 92 | } |
93 | 93 | ||
94 | STATIC void | 94 | void |
95 | xfs_inode_free( | 95 | xfs_inode_free( |
96 | struct xfs_inode *ip) | 96 | struct xfs_inode *ip) |
97 | { | 97 | { |
@@ -418,57 +418,6 @@ out_error_or_again: | |||
418 | } | 418 | } |
419 | 419 | ||
420 | /* | 420 | /* |
421 | * This is called free all the memory associated with an inode. | ||
422 | * It must free the inode itself and any buffers allocated for | ||
423 | * if_extents/if_data and if_broot. It must also free the lock | ||
424 | * associated with the inode. | ||
425 | * | ||
426 | * Note: because we don't initialise everything on reallocation out | ||
427 | * of the zone, we must ensure we nullify everything correctly before | ||
428 | * freeing the structure. | ||
429 | */ | ||
430 | void | ||
431 | xfs_ireclaim( | ||
432 | struct xfs_inode *ip) | ||
433 | { | ||
434 | struct xfs_mount *mp = ip->i_mount; | ||
435 | struct xfs_perag *pag; | ||
436 | xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); | ||
437 | |||
438 | XFS_STATS_INC(xs_ig_reclaims); | ||
439 | |||
440 | /* | ||
441 | * Remove the inode from the per-AG radix tree. | ||
442 | * | ||
443 | * Because radix_tree_delete won't complain even if the item was never | ||
444 | * added to the tree assert that it's been there before to catch | ||
445 | * problems with the inode life time early on. | ||
446 | */ | ||
447 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); | ||
448 | write_lock(&pag->pag_ici_lock); | ||
449 | if (!radix_tree_delete(&pag->pag_ici_root, agino)) | ||
450 | ASSERT(0); | ||
451 | write_unlock(&pag->pag_ici_lock); | ||
452 | xfs_perag_put(pag); | ||
453 | |||
454 | /* | ||
455 | * Here we do an (almost) spurious inode lock in order to coordinate | ||
456 | * with inode cache radix tree lookups. This is because the lookup | ||
457 | * can reference the inodes in the cache without taking references. | ||
458 | * | ||
459 | * We make that OK here by ensuring that we wait until the inode is | ||
460 | * unlocked after the lookup before we go ahead and free it. We get | ||
461 | * both the ilock and the iolock because the code may need to drop the | ||
462 | * ilock one but will still hold the iolock. | ||
463 | */ | ||
464 | xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
465 | xfs_qm_dqdetach(ip); | ||
466 | xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
467 | |||
468 | xfs_inode_free(ip); | ||
469 | } | ||
470 | |||
471 | /* | ||
472 | * This is a wrapper routine around the xfs_ilock() routine | 421 | * This is a wrapper routine around the xfs_ilock() routine |
473 | * used to centralize some grungy code. It is used in places | 422 | * used to centralize some grungy code. It is used in places |
474 | * that wish to lock the inode solely for reading the extents. | 423 | * that wish to lock the inode solely for reading the extents. |