diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 12:04:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 12:04:11 -0400 |
commit | 347c53dca73fca317d57781f510f5ff4f6c0d0d7 (patch) | |
tree | cdc405ac049751da4d76085ce58750b6b2a22326 /fs/xfs/xfs_itable.c | |
parent | 5c8e191e8437616a498a8e1cc0af3dd0d32bbff2 (diff) | |
parent | 7f015072348a14f16d548be557ee58c5c55df0aa (diff) |
Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6
* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6: (59 commits)
[XFS] eagerly remove vmap mappings to avoid upsetting Xen
[XFS] simplify validata_fields
[XFS] no longer using io_vnode, as was remaining from 23 cherrypick
[XFS] Remove STATIC which was missing from prior manual merge
[XFS] Put back the QUEUE_ORDERED_NONE test in the barrier check.
[XFS] Turn off XBF_ASYNC flag before re-reading superblock.
[XFS] avoid race in sync_inodes() that can fail to write out all dirty data
[XFS] This fix prevents bulkstat from spinning in an infinite loop.
[XFS] simplify xfs_create/mknod/symlink prototype
[XFS] avoid xfs_getattr in XFS_IOC_FSGETXATTR ioctl
[XFS] get_bulkall() could return incorrect inode state
[XFS] Kill unused IOMAP_EOF flag
[XFS] fix when DMAPI mount option processing happens
[XFS] ensure file size is logged on synchronous writes
[XFS] growlock should be a mutex
[XFS] replace some large xfs_log_priv.h macros by proper functions
[XFS] kill struct bhv_vfs
[XFS] move syncing related members from struct bhv_vfs to struct xfs_mount
[XFS] kill the vfs_flags member in struct bhv_vfs
[XFS] kill the vfs_fsid and vfs_altfsid members in struct bhv_vfs
...
Diffstat (limited to 'fs/xfs/xfs_itable.c')
-rw-r--r-- | fs/xfs/xfs_itable.c | 78 |
1 files changed, 44 insertions, 34 deletions
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 4c2454bcc714..9972992fd3c3 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
@@ -57,7 +57,7 @@ xfs_bulkstat_one_iget( | |||
57 | xfs_bstat_t *buf, /* return buffer */ | 57 | xfs_bstat_t *buf, /* return buffer */ |
58 | int *stat) /* BULKSTAT_RV_... */ | 58 | int *stat) /* BULKSTAT_RV_... */ |
59 | { | 59 | { |
60 | xfs_dinode_core_t *dic; /* dinode core info pointer */ | 60 | xfs_icdinode_t *dic; /* dinode core info pointer */ |
61 | xfs_inode_t *ip; /* incore inode pointer */ | 61 | xfs_inode_t *ip; /* incore inode pointer */ |
62 | bhv_vnode_t *vp; | 62 | bhv_vnode_t *vp; |
63 | int error; | 63 | int error; |
@@ -151,37 +151,37 @@ xfs_bulkstat_one_dinode( | |||
151 | * the new format. We don't change the version number so that we | 151 | * the new format. We don't change the version number so that we |
152 | * can distinguish this from a real new format inode. | 152 | * can distinguish this from a real new format inode. |
153 | */ | 153 | */ |
154 | if (INT_GET(dic->di_version, ARCH_CONVERT) == XFS_DINODE_VERSION_1) { | 154 | if (dic->di_version == XFS_DINODE_VERSION_1) { |
155 | buf->bs_nlink = INT_GET(dic->di_onlink, ARCH_CONVERT); | 155 | buf->bs_nlink = be16_to_cpu(dic->di_onlink); |
156 | buf->bs_projid = 0; | 156 | buf->bs_projid = 0; |
157 | } else { | 157 | } else { |
158 | buf->bs_nlink = INT_GET(dic->di_nlink, ARCH_CONVERT); | 158 | buf->bs_nlink = be32_to_cpu(dic->di_nlink); |
159 | buf->bs_projid = INT_GET(dic->di_projid, ARCH_CONVERT); | 159 | buf->bs_projid = be16_to_cpu(dic->di_projid); |
160 | } | 160 | } |
161 | 161 | ||
162 | buf->bs_ino = ino; | 162 | buf->bs_ino = ino; |
163 | buf->bs_mode = INT_GET(dic->di_mode, ARCH_CONVERT); | 163 | buf->bs_mode = be16_to_cpu(dic->di_mode); |
164 | buf->bs_uid = INT_GET(dic->di_uid, ARCH_CONVERT); | 164 | buf->bs_uid = be32_to_cpu(dic->di_uid); |
165 | buf->bs_gid = INT_GET(dic->di_gid, ARCH_CONVERT); | 165 | buf->bs_gid = be32_to_cpu(dic->di_gid); |
166 | buf->bs_size = INT_GET(dic->di_size, ARCH_CONVERT); | 166 | buf->bs_size = be64_to_cpu(dic->di_size); |
167 | buf->bs_atime.tv_sec = INT_GET(dic->di_atime.t_sec, ARCH_CONVERT); | 167 | buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); |
168 | buf->bs_atime.tv_nsec = INT_GET(dic->di_atime.t_nsec, ARCH_CONVERT); | 168 | buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); |
169 | buf->bs_mtime.tv_sec = INT_GET(dic->di_mtime.t_sec, ARCH_CONVERT); | 169 | buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); |
170 | buf->bs_mtime.tv_nsec = INT_GET(dic->di_mtime.t_nsec, ARCH_CONVERT); | 170 | buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); |
171 | buf->bs_ctime.tv_sec = INT_GET(dic->di_ctime.t_sec, ARCH_CONVERT); | 171 | buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); |
172 | buf->bs_ctime.tv_nsec = INT_GET(dic->di_ctime.t_nsec, ARCH_CONVERT); | 172 | buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); |
173 | buf->bs_xflags = xfs_dic2xflags(dic); | 173 | buf->bs_xflags = xfs_dic2xflags(dic); |
174 | buf->bs_extsize = INT_GET(dic->di_extsize, ARCH_CONVERT) << mp->m_sb.sb_blocklog; | 174 | buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; |
175 | buf->bs_extents = INT_GET(dic->di_nextents, ARCH_CONVERT); | 175 | buf->bs_extents = be32_to_cpu(dic->di_nextents); |
176 | buf->bs_gen = INT_GET(dic->di_gen, ARCH_CONVERT); | 176 | buf->bs_gen = be32_to_cpu(dic->di_gen); |
177 | memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); | 177 | memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); |
178 | buf->bs_dmevmask = INT_GET(dic->di_dmevmask, ARCH_CONVERT); | 178 | buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); |
179 | buf->bs_dmstate = INT_GET(dic->di_dmstate, ARCH_CONVERT); | 179 | buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); |
180 | buf->bs_aextents = INT_GET(dic->di_anextents, ARCH_CONVERT); | 180 | buf->bs_aextents = be16_to_cpu(dic->di_anextents); |
181 | 181 | ||
182 | switch (INT_GET(dic->di_format, ARCH_CONVERT)) { | 182 | switch (dic->di_format) { |
183 | case XFS_DINODE_FMT_DEV: | 183 | case XFS_DINODE_FMT_DEV: |
184 | buf->bs_rdev = INT_GET(dip->di_u.di_dev, ARCH_CONVERT); | 184 | buf->bs_rdev = be32_to_cpu(dip->di_u.di_dev); |
185 | buf->bs_blksize = BLKDEV_IOSIZE; | 185 | buf->bs_blksize = BLKDEV_IOSIZE; |
186 | buf->bs_blocks = 0; | 186 | buf->bs_blocks = 0; |
187 | break; | 187 | break; |
@@ -195,7 +195,7 @@ xfs_bulkstat_one_dinode( | |||
195 | case XFS_DINODE_FMT_BTREE: | 195 | case XFS_DINODE_FMT_BTREE: |
196 | buf->bs_rdev = 0; | 196 | buf->bs_rdev = 0; |
197 | buf->bs_blksize = mp->m_sb.sb_blocksize; | 197 | buf->bs_blksize = mp->m_sb.sb_blocksize; |
198 | buf->bs_blocks = INT_GET(dic->di_nblocks, ARCH_CONVERT); | 198 | buf->bs_blocks = be64_to_cpu(dic->di_nblocks); |
199 | break; | 199 | break; |
200 | } | 200 | } |
201 | 201 | ||
@@ -290,16 +290,23 @@ xfs_bulkstat_use_dinode( | |||
290 | return 1; | 290 | return 1; |
291 | dip = (xfs_dinode_t *) | 291 | dip = (xfs_dinode_t *) |
292 | xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); | 292 | xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); |
293 | if (INT_GET(dip->di_core.di_magic, ARCH_CONVERT) != XFS_DINODE_MAGIC || | 293 | /* |
294 | !XFS_DINODE_GOOD_VERSION( | 294 | * Check the buffer containing the on-disk inode for di_nlink == 0. |
295 | INT_GET(dip->di_core.di_version, ARCH_CONVERT))) | 295 | * This is to prevent xfs_bulkstat from picking up just reclaimed |
296 | * inodes that have their in-core state initialized but not flushed | ||
297 | * to disk yet. This is a temporary hack that would require a proper | ||
298 | * fix in the future. | ||
299 | */ | ||
300 | if (be16_to_cpu(dip->di_core.di_magic) != XFS_DINODE_MAGIC || | ||
301 | !XFS_DINODE_GOOD_VERSION(dip->di_core.di_version) || | ||
302 | !dip->di_core.di_nlink) | ||
296 | return 0; | 303 | return 0; |
297 | if (flags & BULKSTAT_FG_QUICK) { | 304 | if (flags & BULKSTAT_FG_QUICK) { |
298 | *dipp = dip; | 305 | *dipp = dip; |
299 | return 1; | 306 | return 1; |
300 | } | 307 | } |
301 | /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ | 308 | /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ |
302 | aformat = INT_GET(dip->di_core.di_aformat, ARCH_CONVERT); | 309 | aformat = dip->di_core.di_aformat; |
303 | if ((XFS_CFORK_Q(&dip->di_core) == 0) || | 310 | if ((XFS_CFORK_Q(&dip->di_core) == 0) || |
304 | (aformat == XFS_DINODE_FMT_LOCAL) || | 311 | (aformat == XFS_DINODE_FMT_LOCAL) || |
305 | (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_core.di_anextents)) { | 312 | (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_core.di_anextents)) { |
@@ -612,21 +619,25 @@ xfs_bulkstat( | |||
612 | } | 619 | } |
613 | } | 620 | } |
614 | } | 621 | } |
622 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | ||
623 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); | ||
615 | /* | 624 | /* |
616 | * Skip if this inode is free. | 625 | * Skip if this inode is free. |
617 | */ | 626 | */ |
618 | if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) | 627 | if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { |
628 | lastino = ino; | ||
619 | continue; | 629 | continue; |
630 | } | ||
620 | /* | 631 | /* |
621 | * Count used inodes as free so we can tell | 632 | * Count used inodes as free so we can tell |
622 | * when the chunk is used up. | 633 | * when the chunk is used up. |
623 | */ | 634 | */ |
624 | irbp->ir_freecount++; | 635 | irbp->ir_freecount++; |
625 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | ||
626 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); | ||
627 | if (!xfs_bulkstat_use_dinode(mp, flags, bp, | 636 | if (!xfs_bulkstat_use_dinode(mp, flags, bp, |
628 | clustidx, &dip)) | 637 | clustidx, &dip)) { |
638 | lastino = ino; | ||
629 | continue; | 639 | continue; |
640 | } | ||
630 | /* | 641 | /* |
631 | * If we need to do an iget, cannot hold bp. | 642 | * If we need to do an iget, cannot hold bp. |
632 | * Drop it, until starting the next cluster. | 643 | * Drop it, until starting the next cluster. |
@@ -687,8 +698,7 @@ xfs_bulkstat( | |||
687 | if (end_of_ag) { | 698 | if (end_of_ag) { |
688 | agno++; | 699 | agno++; |
689 | agino = 0; | 700 | agino = 0; |
690 | } else | 701 | } |
691 | agino = XFS_INO_TO_AGINO(mp, lastino); | ||
692 | } else | 702 | } else |
693 | break; | 703 | break; |
694 | } | 704 | } |