diff options
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_export.c | 11 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 7 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl32.c | 15 | ||||
| -rw-r--r-- | fs/xfs/quota/xfs_qm.c | 18 | ||||
| -rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 27 | ||||
| -rw-r--r-- | fs/xfs/xfs_dfrag.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_ialloc.c | 142 | ||||
| -rw-r--r-- | fs/xfs/xfs_iget.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.h | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_itable.c | 285 | ||||
| -rw-r--r-- | fs/xfs/xfs_itable.h | 17 | ||||
| -rw-r--r-- | fs/xfs/xfs_log_recover.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_mount.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_rtalloc.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_inode.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 2 |
17 files changed, 172 insertions, 388 deletions
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 846b75aeb2ab..e7839ee49e43 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
| @@ -128,13 +128,12 @@ xfs_nfs_get_inode( | |||
| 128 | return ERR_PTR(-ESTALE); | 128 | return ERR_PTR(-ESTALE); |
| 129 | 129 | ||
| 130 | /* | 130 | /* |
| 131 | * The XFS_IGET_BULKSTAT means that an invalid inode number is just | 131 | * The XFS_IGET_UNTRUSTED means that an invalid inode number is just |
| 132 | * fine and not an indication of a corrupted filesystem. Because | 132 | * fine and not an indication of a corrupted filesystem as clients can |
| 133 | * clients can send any kind of invalid file handle, e.g. after | 133 | * send invalid file handles and we have to handle it gracefully.. |
| 134 | * a restore on the server we have to deal with this case gracefully. | ||
| 135 | */ | 134 | */ |
| 136 | error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, | 135 | error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, |
| 137 | XFS_ILOCK_SHARED, &ip, 0); | 136 | XFS_ILOCK_SHARED, &ip); |
| 138 | if (error) { | 137 | if (error) { |
| 139 | /* | 138 | /* |
| 140 | * EINVAL means the inode cluster doesn't exist anymore. | 139 | * EINVAL means the inode cluster doesn't exist anymore. |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 699b60cbab9c..e59a81062830 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -679,10 +679,9 @@ xfs_ioc_bulkstat( | |||
| 679 | error = xfs_bulkstat_single(mp, &inlast, | 679 | error = xfs_bulkstat_single(mp, &inlast, |
| 680 | bulkreq.ubuffer, &done); | 680 | bulkreq.ubuffer, &done); |
| 681 | else /* XFS_IOC_FSBULKSTAT */ | 681 | else /* XFS_IOC_FSBULKSTAT */ |
| 682 | error = xfs_bulkstat(mp, &inlast, &count, | 682 | error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, |
| 683 | (bulkstat_one_pf)xfs_bulkstat_one, NULL, | 683 | sizeof(xfs_bstat_t), bulkreq.ubuffer, |
| 684 | sizeof(xfs_bstat_t), bulkreq.ubuffer, | 684 | &done); |
| 685 | BULKSTAT_FG_QUICK, &done); | ||
| 686 | 685 | ||
| 687 | if (error) | 686 | if (error) |
| 688 | return -error; | 687 | return -error; |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 9287135e9bfc..52ed49e6465c 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
| @@ -237,15 +237,12 @@ xfs_bulkstat_one_compat( | |||
| 237 | xfs_ino_t ino, /* inode number to get data for */ | 237 | xfs_ino_t ino, /* inode number to get data for */ |
| 238 | void __user *buffer, /* buffer to place output in */ | 238 | void __user *buffer, /* buffer to place output in */ |
| 239 | int ubsize, /* size of buffer */ | 239 | int ubsize, /* size of buffer */ |
| 240 | void *private_data, /* my private data */ | ||
| 241 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 242 | int *ubused, /* bytes used by me */ | 240 | int *ubused, /* bytes used by me */ |
| 243 | void *dibuff, /* on-disk inode buffer */ | ||
| 244 | int *stat) /* BULKSTAT_RV_... */ | 241 | int *stat) /* BULKSTAT_RV_... */ |
| 245 | { | 242 | { |
| 246 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, | 243 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, |
| 247 | xfs_bulkstat_one_fmt_compat, bno, | 244 | xfs_bulkstat_one_fmt_compat, |
| 248 | ubused, dibuff, stat); | 245 | ubused, stat); |
| 249 | } | 246 | } |
| 250 | 247 | ||
| 251 | /* copied from xfs_ioctl.c */ | 248 | /* copied from xfs_ioctl.c */ |
| @@ -298,13 +295,11 @@ xfs_compat_ioc_bulkstat( | |||
| 298 | int res; | 295 | int res; |
| 299 | 296 | ||
| 300 | error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, | 297 | error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, |
| 301 | sizeof(compat_xfs_bstat_t), | 298 | sizeof(compat_xfs_bstat_t), 0, &res); |
| 302 | NULL, 0, NULL, NULL, &res); | ||
| 303 | } else if (cmd == XFS_IOC_FSBULKSTAT_32) { | 299 | } else if (cmd == XFS_IOC_FSBULKSTAT_32) { |
| 304 | error = xfs_bulkstat(mp, &inlast, &count, | 300 | error = xfs_bulkstat(mp, &inlast, &count, |
| 305 | xfs_bulkstat_one_compat, NULL, | 301 | xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), |
| 306 | sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, | 302 | bulkreq.ubuffer, &done); |
| 307 | BULKSTAT_FG_QUICK, &done); | ||
| 308 | } else | 303 | } else |
| 309 | error = XFS_ERROR(EINVAL); | 304 | error = XFS_ERROR(EINVAL); |
| 310 | if (error) | 305 | if (error) |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 2d8b7bc792c9..8c117ff2e3ab 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
| @@ -1632,10 +1632,7 @@ xfs_qm_dqusage_adjust( | |||
| 1632 | xfs_ino_t ino, /* inode number to get data for */ | 1632 | xfs_ino_t ino, /* inode number to get data for */ |
| 1633 | void __user *buffer, /* not used */ | 1633 | void __user *buffer, /* not used */ |
| 1634 | int ubsize, /* not used */ | 1634 | int ubsize, /* not used */ |
| 1635 | void *private_data, /* not used */ | ||
| 1636 | xfs_daddr_t bno, /* starting block of inode cluster */ | ||
| 1637 | int *ubused, /* not used */ | 1635 | int *ubused, /* not used */ |
| 1638 | void *dip, /* on-disk inode pointer (not used) */ | ||
| 1639 | int *res) /* result code value */ | 1636 | int *res) /* result code value */ |
| 1640 | { | 1637 | { |
| 1641 | xfs_inode_t *ip; | 1638 | xfs_inode_t *ip; |
| @@ -1660,7 +1657,7 @@ xfs_qm_dqusage_adjust( | |||
| 1660 | * the case in all other instances. It's OK that we do this because | 1657 | * the case in all other instances. It's OK that we do this because |
| 1661 | * quotacheck is done only at mount time. | 1658 | * quotacheck is done only at mount time. |
| 1662 | */ | 1659 | */ |
| 1663 | if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) { | 1660 | if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip))) { |
| 1664 | *res = BULKSTAT_RV_NOTHING; | 1661 | *res = BULKSTAT_RV_NOTHING; |
| 1665 | return error; | 1662 | return error; |
| 1666 | } | 1663 | } |
| @@ -1796,12 +1793,13 @@ xfs_qm_quotacheck( | |||
| 1796 | * Iterate thru all the inodes in the file system, | 1793 | * Iterate thru all the inodes in the file system, |
| 1797 | * adjusting the corresponding dquot counters in core. | 1794 | * adjusting the corresponding dquot counters in core. |
| 1798 | */ | 1795 | */ |
| 1799 | if ((error = xfs_bulkstat(mp, &lastino, &count, | 1796 | error = xfs_bulkstat(mp, &lastino, &count, |
| 1800 | xfs_qm_dqusage_adjust, NULL, | 1797 | xfs_qm_dqusage_adjust, |
| 1801 | structsz, NULL, BULKSTAT_FG_IGET, &done))) | 1798 | structsz, NULL, &done); |
| 1799 | if (error) | ||
| 1802 | break; | 1800 | break; |
| 1803 | 1801 | ||
| 1804 | } while (! done); | 1802 | } while (!done); |
| 1805 | 1803 | ||
| 1806 | /* | 1804 | /* |
| 1807 | * We've made all the changes that we need to make incore. | 1805 | * We've made all the changes that we need to make incore. |
| @@ -1889,14 +1887,14 @@ xfs_qm_init_quotainos( | |||
| 1889 | mp->m_sb.sb_uquotino != NULLFSINO) { | 1887 | mp->m_sb.sb_uquotino != NULLFSINO) { |
| 1890 | ASSERT(mp->m_sb.sb_uquotino > 0); | 1888 | ASSERT(mp->m_sb.sb_uquotino > 0); |
| 1891 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 1889 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 1892 | 0, 0, &uip, 0))) | 1890 | 0, 0, &uip))) |
| 1893 | return XFS_ERROR(error); | 1891 | return XFS_ERROR(error); |
| 1894 | } | 1892 | } |
| 1895 | if (XFS_IS_OQUOTA_ON(mp) && | 1893 | if (XFS_IS_OQUOTA_ON(mp) && |
| 1896 | mp->m_sb.sb_gquotino != NULLFSINO) { | 1894 | mp->m_sb.sb_gquotino != NULLFSINO) { |
| 1897 | ASSERT(mp->m_sb.sb_gquotino > 0); | 1895 | ASSERT(mp->m_sb.sb_gquotino > 0); |
| 1898 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, | 1896 | if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, |
| 1899 | 0, 0, &gip, 0))) { | 1897 | 0, 0, &gip))) { |
| 1900 | if (uip) | 1898 | if (uip) |
| 1901 | IRELE(uip); | 1899 | IRELE(uip); |
| 1902 | return XFS_ERROR(error); | 1900 | return XFS_ERROR(error); |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 92b002f1805f..b4487764e923 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
| @@ -262,7 +262,7 @@ xfs_qm_scall_trunc_qfiles( | |||
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { | 264 | if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 265 | error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip, 0); | 265 | error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip); |
| 266 | if (!error) { | 266 | if (!error) { |
| 267 | error = xfs_truncate_file(mp, qip); | 267 | error = xfs_truncate_file(mp, qip); |
| 268 | IRELE(qip); | 268 | IRELE(qip); |
| @@ -271,7 +271,7 @@ xfs_qm_scall_trunc_qfiles( | |||
| 271 | 271 | ||
| 272 | if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && | 272 | if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && |
| 273 | mp->m_sb.sb_gquotino != NULLFSINO) { | 273 | mp->m_sb.sb_gquotino != NULLFSINO) { |
| 274 | error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0); | 274 | error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip); |
| 275 | if (!error2) { | 275 | if (!error2) { |
| 276 | error2 = xfs_truncate_file(mp, qip); | 276 | error2 = xfs_truncate_file(mp, qip); |
| 277 | IRELE(qip); | 277 | IRELE(qip); |
| @@ -417,12 +417,12 @@ xfs_qm_scall_getqstat( | |||
| 417 | } | 417 | } |
| 418 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { | 418 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 419 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 419 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 420 | 0, 0, &uip, 0) == 0) | 420 | 0, 0, &uip) == 0) |
| 421 | tempuqip = B_TRUE; | 421 | tempuqip = B_TRUE; |
| 422 | } | 422 | } |
| 423 | if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { | 423 | if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { |
| 424 | if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, | 424 | if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, |
| 425 | 0, 0, &gip, 0) == 0) | 425 | 0, 0, &gip) == 0) |
| 426 | tempgqip = B_TRUE; | 426 | tempgqip = B_TRUE; |
| 427 | } | 427 | } |
| 428 | if (uip) { | 428 | if (uip) { |
| @@ -1109,10 +1109,7 @@ xfs_qm_internalqcheck_adjust( | |||
| 1109 | xfs_ino_t ino, /* inode number to get data for */ | 1109 | xfs_ino_t ino, /* inode number to get data for */ |
| 1110 | void __user *buffer, /* not used */ | 1110 | void __user *buffer, /* not used */ |
| 1111 | int ubsize, /* not used */ | 1111 | int ubsize, /* not used */ |
| 1112 | void *private_data, /* not used */ | ||
| 1113 | xfs_daddr_t bno, /* starting block of inode cluster */ | ||
| 1114 | int *ubused, /* not used */ | 1112 | int *ubused, /* not used */ |
| 1115 | void *dip, /* not used */ | ||
| 1116 | int *res) /* bulkstat result code */ | 1113 | int *res) /* bulkstat result code */ |
| 1117 | { | 1114 | { |
| 1118 | xfs_inode_t *ip; | 1115 | xfs_inode_t *ip; |
| @@ -1134,7 +1131,7 @@ xfs_qm_internalqcheck_adjust( | |||
| 1134 | ipreleased = B_FALSE; | 1131 | ipreleased = B_FALSE; |
| 1135 | again: | 1132 | again: |
| 1136 | lock_flags = XFS_ILOCK_SHARED; | 1133 | lock_flags = XFS_ILOCK_SHARED; |
| 1137 | if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip, bno))) { | 1134 | if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip))) { |
| 1138 | *res = BULKSTAT_RV_NOTHING; | 1135 | *res = BULKSTAT_RV_NOTHING; |
| 1139 | return (error); | 1136 | return (error); |
| 1140 | } | 1137 | } |
| @@ -1205,15 +1202,15 @@ xfs_qm_internalqcheck( | |||
| 1205 | * Iterate thru all the inodes in the file system, | 1202 | * Iterate thru all the inodes in the file system, |
| 1206 | * adjusting the corresponding dquot counters | 1203 | * adjusting the corresponding dquot counters |
| 1207 | */ | 1204 | */ |
| 1208 | if ((error = xfs_bulkstat(mp, &lastino, &count, | 1205 | error = xfs_bulkstat(mp, &lastino, &count, |
| 1209 | xfs_qm_internalqcheck_adjust, NULL, | 1206 | xfs_qm_internalqcheck_adjust, |
| 1210 | 0, NULL, BULKSTAT_FG_IGET, &done))) { | 1207 | 0, NULL, &done); |
| 1208 | if (error) { | ||
| 1209 | cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); | ||
| 1211 | break; | 1210 | break; |
| 1212 | } | 1211 | } |
| 1213 | } while (! done); | 1212 | } while (!done); |
| 1214 | if (error) { | 1213 | |
| 1215 | cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); | ||
| 1216 | } | ||
| 1217 | cmn_err(CE_DEBUG, "Checking results against system dquots"); | 1214 | cmn_err(CE_DEBUG, "Checking results against system dquots"); |
| 1218 | for (i = 0; i < qmtest_hashmask; i++) { | 1215 | for (i = 0; i < qmtest_hashmask; i++) { |
| 1219 | xfs_dqtest_t *d, *n; | 1216 | xfs_dqtest_t *d, *n; |
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 5bba29a07812..7f159d2a429a 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -69,7 +69,9 @@ xfs_swapext( | |||
| 69 | goto out; | 69 | goto out; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) { | 72 | if (!(file->f_mode & FMODE_WRITE) || |
| 73 | !(file->f_mode & FMODE_READ) || | ||
| 74 | (file->f_flags & O_APPEND)) { | ||
| 73 | error = XFS_ERROR(EBADF); | 75 | error = XFS_ERROR(EBADF); |
| 74 | goto out_put_file; | 76 | goto out_put_file; |
| 75 | } | 77 | } |
| @@ -81,6 +83,7 @@ xfs_swapext( | |||
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | if (!(tmp_file->f_mode & FMODE_WRITE) || | 85 | if (!(tmp_file->f_mode & FMODE_WRITE) || |
| 86 | !(tmp_file->f_mode & FMODE_READ) || | ||
| 84 | (tmp_file->f_flags & O_APPEND)) { | 87 | (tmp_file->f_flags & O_APPEND)) { |
| 85 | error = XFS_ERROR(EBADF); | 88 | error = XFS_ERROR(EBADF); |
| 86 | goto out_put_tmp_file; | 89 | goto out_put_tmp_file; |
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 9d884c127bb9..c7142a064c48 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
| @@ -1203,6 +1203,63 @@ error0: | |||
| 1203 | return error; | 1203 | return error; |
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | STATIC int | ||
| 1207 | xfs_imap_lookup( | ||
| 1208 | struct xfs_mount *mp, | ||
| 1209 | struct xfs_trans *tp, | ||
| 1210 | xfs_agnumber_t agno, | ||
| 1211 | xfs_agino_t agino, | ||
| 1212 | xfs_agblock_t agbno, | ||
| 1213 | xfs_agblock_t *chunk_agbno, | ||
| 1214 | xfs_agblock_t *offset_agbno, | ||
| 1215 | int flags) | ||
| 1216 | { | ||
| 1217 | struct xfs_inobt_rec_incore rec; | ||
| 1218 | struct xfs_btree_cur *cur; | ||
| 1219 | struct xfs_buf *agbp; | ||
| 1220 | xfs_agino_t startino; | ||
| 1221 | int error; | ||
| 1222 | int i; | ||
| 1223 | |||
| 1224 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | ||
| 1225 | if (error) { | ||
| 1226 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1227 | "xfs_ialloc_read_agi() returned " | ||
| 1228 | "error %d, agno %d", | ||
| 1229 | error, agno); | ||
| 1230 | return error; | ||
| 1231 | } | ||
| 1232 | |||
| 1233 | /* | ||
| 1234 | * derive and lookup the exact inode record for the given agino. If the | ||
| 1235 | * record cannot be found, then it's an invalid inode number and we | ||
| 1236 | * should abort. | ||
| 1237 | */ | ||
| 1238 | cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); | ||
| 1239 | startino = agino & ~(XFS_IALLOC_INODES(mp) - 1); | ||
| 1240 | error = xfs_inobt_lookup(cur, startino, XFS_LOOKUP_EQ, &i); | ||
| 1241 | if (!error) { | ||
| 1242 | if (i) | ||
| 1243 | error = xfs_inobt_get_rec(cur, &rec, &i); | ||
| 1244 | if (!error && i == 0) | ||
| 1245 | error = EINVAL; | ||
| 1246 | } | ||
| 1247 | |||
| 1248 | xfs_trans_brelse(tp, agbp); | ||
| 1249 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); | ||
| 1250 | if (error) | ||
| 1251 | return error; | ||
| 1252 | |||
| 1253 | /* for untrusted inodes check it is allocated first */ | ||
| 1254 | if ((flags & XFS_IGET_UNTRUSTED) && | ||
| 1255 | (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) | ||
| 1256 | return EINVAL; | ||
| 1257 | |||
| 1258 | *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); | ||
| 1259 | *offset_agbno = agbno - *chunk_agbno; | ||
| 1260 | return 0; | ||
| 1261 | } | ||
| 1262 | |||
| 1206 | /* | 1263 | /* |
| 1207 | * Return the location of the inode in imap, for mapping it into a buffer. | 1264 | * Return the location of the inode in imap, for mapping it into a buffer. |
| 1208 | */ | 1265 | */ |
| @@ -1235,8 +1292,11 @@ xfs_imap( | |||
| 1235 | if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || | 1292 | if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || |
| 1236 | ino != XFS_AGINO_TO_INO(mp, agno, agino)) { | 1293 | ino != XFS_AGINO_TO_INO(mp, agno, agino)) { |
| 1237 | #ifdef DEBUG | 1294 | #ifdef DEBUG |
| 1238 | /* no diagnostics for bulkstat, ino comes from userspace */ | 1295 | /* |
| 1239 | if (flags & XFS_IGET_BULKSTAT) | 1296 | * Don't output diagnostic information for untrusted inodes |
| 1297 | * as they can be invalid without implying corruption. | ||
| 1298 | */ | ||
| 1299 | if (flags & XFS_IGET_UNTRUSTED) | ||
| 1240 | return XFS_ERROR(EINVAL); | 1300 | return XFS_ERROR(EINVAL); |
| 1241 | if (agno >= mp->m_sb.sb_agcount) { | 1301 | if (agno >= mp->m_sb.sb_agcount) { |
| 1242 | xfs_fs_cmn_err(CE_ALERT, mp, | 1302 | xfs_fs_cmn_err(CE_ALERT, mp, |
| @@ -1263,6 +1323,23 @@ xfs_imap( | |||
| 1263 | return XFS_ERROR(EINVAL); | 1323 | return XFS_ERROR(EINVAL); |
| 1264 | } | 1324 | } |
| 1265 | 1325 | ||
| 1326 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; | ||
| 1327 | |||
| 1328 | /* | ||
| 1329 | * For bulkstat and handle lookups, we have an untrusted inode number | ||
| 1330 | * that we have to verify is valid. We cannot do this just by reading | ||
| 1331 | * the inode buffer as it may have been unlinked and removed leaving | ||
| 1332 | * inodes in stale state on disk. Hence we have to do a btree lookup | ||
| 1333 | * in all cases where an untrusted inode number is passed. | ||
| 1334 | */ | ||
| 1335 | if (flags & XFS_IGET_UNTRUSTED) { | ||
| 1336 | error = xfs_imap_lookup(mp, tp, agno, agino, agbno, | ||
| 1337 | &chunk_agbno, &offset_agbno, flags); | ||
| 1338 | if (error) | ||
| 1339 | return error; | ||
| 1340 | goto out_map; | ||
| 1341 | } | ||
| 1342 | |||
| 1266 | /* | 1343 | /* |
| 1267 | * If the inode cluster size is the same as the blocksize or | 1344 | * If the inode cluster size is the same as the blocksize or |
| 1268 | * smaller we get to the buffer by simple arithmetics. | 1345 | * smaller we get to the buffer by simple arithmetics. |
| @@ -1277,24 +1354,6 @@ xfs_imap( | |||
| 1277 | return 0; | 1354 | return 0; |
| 1278 | } | 1355 | } |
| 1279 | 1356 | ||
| 1280 | blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; | ||
| 1281 | |||
| 1282 | /* | ||
| 1283 | * If we get a block number passed from bulkstat we can use it to | ||
| 1284 | * find the buffer easily. | ||
| 1285 | */ | ||
| 1286 | if (imap->im_blkno) { | ||
| 1287 | offset = XFS_INO_TO_OFFSET(mp, ino); | ||
| 1288 | ASSERT(offset < mp->m_sb.sb_inopblock); | ||
| 1289 | |||
| 1290 | cluster_agbno = xfs_daddr_to_agbno(mp, imap->im_blkno); | ||
| 1291 | offset += (agbno - cluster_agbno) * mp->m_sb.sb_inopblock; | ||
| 1292 | |||
| 1293 | imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); | ||
| 1294 | imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); | ||
| 1295 | return 0; | ||
| 1296 | } | ||
| 1297 | |||
| 1298 | /* | 1357 | /* |
| 1299 | * If the inode chunks are aligned then use simple maths to | 1358 | * If the inode chunks are aligned then use simple maths to |
| 1300 | * find the location. Otherwise we have to do a btree | 1359 | * find the location. Otherwise we have to do a btree |
| @@ -1304,50 +1363,13 @@ xfs_imap( | |||
| 1304 | offset_agbno = agbno & mp->m_inoalign_mask; | 1363 | offset_agbno = agbno & mp->m_inoalign_mask; |
| 1305 | chunk_agbno = agbno - offset_agbno; | 1364 | chunk_agbno = agbno - offset_agbno; |
| 1306 | } else { | 1365 | } else { |
| 1307 | xfs_btree_cur_t *cur; /* inode btree cursor */ | 1366 | error = xfs_imap_lookup(mp, tp, agno, agino, agbno, |
| 1308 | xfs_inobt_rec_incore_t chunk_rec; | 1367 | &chunk_agbno, &offset_agbno, flags); |
| 1309 | xfs_buf_t *agbp; /* agi buffer */ | ||
| 1310 | int i; /* temp state */ | ||
| 1311 | |||
| 1312 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | ||
| 1313 | if (error) { | ||
| 1314 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1315 | "xfs_ialloc_read_agi() returned " | ||
| 1316 | "error %d, agno %d", | ||
| 1317 | error, agno); | ||
| 1318 | return error; | ||
| 1319 | } | ||
| 1320 | |||
| 1321 | cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); | ||
| 1322 | error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); | ||
| 1323 | if (error) { | ||
| 1324 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1325 | "xfs_inobt_lookup() failed"); | ||
| 1326 | goto error0; | ||
| 1327 | } | ||
| 1328 | |||
| 1329 | error = xfs_inobt_get_rec(cur, &chunk_rec, &i); | ||
| 1330 | if (error) { | ||
| 1331 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1332 | "xfs_inobt_get_rec() failed"); | ||
| 1333 | goto error0; | ||
| 1334 | } | ||
| 1335 | if (i == 0) { | ||
| 1336 | #ifdef DEBUG | ||
| 1337 | xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " | ||
| 1338 | "xfs_inobt_get_rec() failed"); | ||
| 1339 | #endif /* DEBUG */ | ||
| 1340 | error = XFS_ERROR(EINVAL); | ||
| 1341 | } | ||
| 1342 | error0: | ||
| 1343 | xfs_trans_brelse(tp, agbp); | ||
| 1344 | xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); | ||
| 1345 | if (error) | 1368 | if (error) |
| 1346 | return error; | 1369 | return error; |
| 1347 | chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_rec.ir_startino); | ||
| 1348 | offset_agbno = agbno - chunk_agbno; | ||
| 1349 | } | 1370 | } |
| 1350 | 1371 | ||
| 1372 | out_map: | ||
| 1351 | ASSERT(agbno >= chunk_agbno); | 1373 | ASSERT(agbno >= chunk_agbno); |
| 1352 | cluster_agbno = chunk_agbno + | 1374 | cluster_agbno = chunk_agbno + |
| 1353 | ((offset_agbno / blks_per_cluster) * blks_per_cluster); | 1375 | ((offset_agbno / blks_per_cluster) * blks_per_cluster); |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 75df75f43d48..8f8b91be2c99 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -259,7 +259,6 @@ xfs_iget_cache_miss( | |||
| 259 | xfs_trans_t *tp, | 259 | xfs_trans_t *tp, |
| 260 | xfs_ino_t ino, | 260 | xfs_ino_t ino, |
| 261 | struct xfs_inode **ipp, | 261 | struct xfs_inode **ipp, |
| 262 | xfs_daddr_t bno, | ||
| 263 | int flags, | 262 | int flags, |
| 264 | int lock_flags) | 263 | int lock_flags) |
| 265 | { | 264 | { |
| @@ -272,7 +271,7 @@ xfs_iget_cache_miss( | |||
| 272 | if (!ip) | 271 | if (!ip) |
| 273 | return ENOMEM; | 272 | return ENOMEM; |
| 274 | 273 | ||
| 275 | error = xfs_iread(mp, tp, ip, bno, flags); | 274 | error = xfs_iread(mp, tp, ip, flags); |
| 276 | if (error) | 275 | if (error) |
| 277 | goto out_destroy; | 276 | goto out_destroy; |
| 278 | 277 | ||
| @@ -358,8 +357,6 @@ out_destroy: | |||
| 358 | * within the file system for the inode being requested. | 357 | * within the file system for the inode being requested. |
| 359 | * lock_flags -- flags indicating how to lock the inode. See the comment | 358 | * lock_flags -- flags indicating how to lock the inode. See the comment |
| 360 | * for xfs_ilock() for a list of valid values. | 359 | * for xfs_ilock() for a list of valid values. |
| 361 | * bno -- the block number starting the buffer containing the inode, | ||
| 362 | * if known (as by bulkstat), else 0. | ||
| 363 | */ | 360 | */ |
| 364 | int | 361 | int |
| 365 | xfs_iget( | 362 | xfs_iget( |
| @@ -368,8 +365,7 @@ xfs_iget( | |||
| 368 | xfs_ino_t ino, | 365 | xfs_ino_t ino, |
| 369 | uint flags, | 366 | uint flags, |
| 370 | uint lock_flags, | 367 | uint lock_flags, |
| 371 | xfs_inode_t **ipp, | 368 | xfs_inode_t **ipp) |
| 372 | xfs_daddr_t bno) | ||
| 373 | { | 369 | { |
| 374 | xfs_inode_t *ip; | 370 | xfs_inode_t *ip; |
| 375 | int error; | 371 | int error; |
| @@ -397,7 +393,7 @@ again: | |||
| 397 | read_unlock(&pag->pag_ici_lock); | 393 | read_unlock(&pag->pag_ici_lock); |
| 398 | XFS_STATS_INC(xs_ig_missed); | 394 | XFS_STATS_INC(xs_ig_missed); |
| 399 | 395 | ||
| 400 | error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, bno, | 396 | error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, |
| 401 | flags, lock_flags); | 397 | flags, lock_flags); |
| 402 | if (error) | 398 | if (error) |
| 403 | goto out_error_or_again; | 399 | goto out_error_or_again; |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d53c39de7d05..b76a829d7e20 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -177,7 +177,7 @@ xfs_imap_to_bp( | |||
| 177 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, | 177 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, |
| 178 | XFS_ERRTAG_ITOBP_INOTOBP, | 178 | XFS_ERRTAG_ITOBP_INOTOBP, |
| 179 | XFS_RANDOM_ITOBP_INOTOBP))) { | 179 | XFS_RANDOM_ITOBP_INOTOBP))) { |
| 180 | if (iget_flags & XFS_IGET_BULKSTAT) { | 180 | if (iget_flags & XFS_IGET_UNTRUSTED) { |
| 181 | xfs_trans_brelse(tp, bp); | 181 | xfs_trans_brelse(tp, bp); |
| 182 | return XFS_ERROR(EINVAL); | 182 | return XFS_ERROR(EINVAL); |
| 183 | } | 183 | } |
| @@ -787,7 +787,6 @@ xfs_iread( | |||
| 787 | xfs_mount_t *mp, | 787 | xfs_mount_t *mp, |
| 788 | xfs_trans_t *tp, | 788 | xfs_trans_t *tp, |
| 789 | xfs_inode_t *ip, | 789 | xfs_inode_t *ip, |
| 790 | xfs_daddr_t bno, | ||
| 791 | uint iget_flags) | 790 | uint iget_flags) |
| 792 | { | 791 | { |
| 793 | xfs_buf_t *bp; | 792 | xfs_buf_t *bp; |
| @@ -797,11 +796,9 @@ xfs_iread( | |||
| 797 | /* | 796 | /* |
| 798 | * Fill in the location information in the in-core inode. | 797 | * Fill in the location information in the in-core inode. |
| 799 | */ | 798 | */ |
| 800 | ip->i_imap.im_blkno = bno; | ||
| 801 | error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); | 799 | error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); |
| 802 | if (error) | 800 | if (error) |
| 803 | return error; | 801 | return error; |
| 804 | ASSERT(bno == 0 || bno == ip->i_imap.im_blkno); | ||
| 805 | 802 | ||
| 806 | /* | 803 | /* |
| 807 | * Get pointers to the on-disk inode and the buffer containing it. | 804 | * Get pointers to the on-disk inode and the buffer containing it. |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9965e40a4615..78550df13cd6 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -442,7 +442,7 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) | |||
| 442 | * xfs_iget.c prototypes. | 442 | * xfs_iget.c prototypes. |
| 443 | */ | 443 | */ |
| 444 | int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, | 444 | int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, |
| 445 | uint, uint, xfs_inode_t **, xfs_daddr_t); | 445 | uint, uint, xfs_inode_t **); |
| 446 | void xfs_iput(xfs_inode_t *, uint); | 446 | void xfs_iput(xfs_inode_t *, uint); |
| 447 | void xfs_iput_new(xfs_inode_t *, uint); | 447 | void xfs_iput_new(xfs_inode_t *, uint); |
| 448 | void xfs_ilock(xfs_inode_t *, uint); | 448 | void xfs_ilock(xfs_inode_t *, uint); |
| @@ -500,7 +500,7 @@ do { \ | |||
| 500 | * Flags for xfs_iget() | 500 | * Flags for xfs_iget() |
| 501 | */ | 501 | */ |
| 502 | #define XFS_IGET_CREATE 0x1 | 502 | #define XFS_IGET_CREATE 0x1 |
| 503 | #define XFS_IGET_BULKSTAT 0x2 | 503 | #define XFS_IGET_UNTRUSTED 0x2 |
| 504 | 504 | ||
| 505 | int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, | 505 | int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, |
| 506 | xfs_ino_t, struct xfs_dinode **, | 506 | xfs_ino_t, struct xfs_dinode **, |
| @@ -509,7 +509,7 @@ int xfs_itobp(struct xfs_mount *, struct xfs_trans *, | |||
| 509 | struct xfs_inode *, struct xfs_dinode **, | 509 | struct xfs_inode *, struct xfs_dinode **, |
| 510 | struct xfs_buf **, uint); | 510 | struct xfs_buf **, uint); |
| 511 | int xfs_iread(struct xfs_mount *, struct xfs_trans *, | 511 | int xfs_iread(struct xfs_mount *, struct xfs_trans *, |
| 512 | struct xfs_inode *, xfs_daddr_t, uint); | 512 | struct xfs_inode *, uint); |
| 513 | void xfs_dinode_to_disk(struct xfs_dinode *, | 513 | void xfs_dinode_to_disk(struct xfs_dinode *, |
| 514 | struct xfs_icdinode *); | 514 | struct xfs_icdinode *); |
| 515 | void xfs_idestroy_fork(struct xfs_inode *, int); | 515 | void xfs_idestroy_fork(struct xfs_inode *, int); |
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b1b801e4a28e..2b86f8610512 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
| @@ -49,24 +49,40 @@ xfs_internal_inum( | |||
| 49 | (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); | 49 | (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | STATIC int | 52 | /* |
| 53 | xfs_bulkstat_one_iget( | 53 | * Return stat information for one inode. |
| 54 | xfs_mount_t *mp, /* mount point for filesystem */ | 54 | * Return 0 if ok, else errno. |
| 55 | xfs_ino_t ino, /* inode number to get data for */ | 55 | */ |
| 56 | xfs_daddr_t bno, /* starting bno of inode cluster */ | 56 | int |
| 57 | xfs_bstat_t *buf, /* return buffer */ | 57 | xfs_bulkstat_one_int( |
| 58 | int *stat) /* BULKSTAT_RV_... */ | 58 | struct xfs_mount *mp, /* mount point for filesystem */ |
| 59 | xfs_ino_t ino, /* inode to get data for */ | ||
| 60 | void __user *buffer, /* buffer to place output in */ | ||
| 61 | int ubsize, /* size of buffer */ | ||
| 62 | bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ | ||
| 63 | int *ubused, /* bytes used by me */ | ||
| 64 | int *stat) /* BULKSTAT_RV_... */ | ||
| 59 | { | 65 | { |
| 60 | xfs_icdinode_t *dic; /* dinode core info pointer */ | 66 | struct xfs_icdinode *dic; /* dinode core info pointer */ |
| 61 | xfs_inode_t *ip; /* incore inode pointer */ | 67 | struct xfs_inode *ip; /* incore inode pointer */ |
| 62 | struct inode *inode; | 68 | struct inode *inode; |
| 63 | int error; | 69 | struct xfs_bstat *buf; /* return buffer */ |
| 70 | int error = 0; /* error value */ | ||
| 71 | |||
| 72 | *stat = BULKSTAT_RV_NOTHING; | ||
| 73 | |||
| 74 | if (!buffer || xfs_internal_inum(mp, ino)) | ||
| 75 | return XFS_ERROR(EINVAL); | ||
| 76 | |||
| 77 | buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); | ||
| 78 | if (!buf) | ||
| 79 | return XFS_ERROR(ENOMEM); | ||
| 64 | 80 | ||
| 65 | error = xfs_iget(mp, NULL, ino, | 81 | error = xfs_iget(mp, NULL, ino, |
| 66 | XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); | 82 | XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip); |
| 67 | if (error) { | 83 | if (error) { |
| 68 | *stat = BULKSTAT_RV_NOTHING; | 84 | *stat = BULKSTAT_RV_NOTHING; |
| 69 | return error; | 85 | goto out_free; |
| 70 | } | 86 | } |
| 71 | 87 | ||
| 72 | ASSERT(ip != NULL); | 88 | ASSERT(ip != NULL); |
| @@ -127,77 +143,16 @@ xfs_bulkstat_one_iget( | |||
| 127 | buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; | 143 | buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; |
| 128 | break; | 144 | break; |
| 129 | } | 145 | } |
| 130 | |||
| 131 | xfs_iput(ip, XFS_ILOCK_SHARED); | 146 | xfs_iput(ip, XFS_ILOCK_SHARED); |
| 132 | return error; | ||
| 133 | } | ||
| 134 | 147 | ||
| 135 | STATIC void | 148 | error = formatter(buffer, ubsize, ubused, buf); |
| 136 | xfs_bulkstat_one_dinode( | ||
| 137 | xfs_mount_t *mp, /* mount point for filesystem */ | ||
| 138 | xfs_ino_t ino, /* inode number to get data for */ | ||
| 139 | xfs_dinode_t *dic, /* dinode inode pointer */ | ||
| 140 | xfs_bstat_t *buf) /* return buffer */ | ||
| 141 | { | ||
| 142 | /* | ||
| 143 | * The inode format changed when we moved the link count and | ||
| 144 | * made it 32 bits long. If this is an old format inode, | ||
| 145 | * convert it in memory to look like a new one. If it gets | ||
| 146 | * flushed to disk we will convert back before flushing or | ||
| 147 | * logging it. We zero out the new projid field and the old link | ||
| 148 | * count field. We'll handle clearing the pad field (the remains | ||
| 149 | * of the old uuid field) when we actually convert the inode to | ||
| 150 | * the new format. We don't change the version number so that we | ||
| 151 | * can distinguish this from a real new format inode. | ||
| 152 | */ | ||
| 153 | if (dic->di_version == 1) { | ||
| 154 | buf->bs_nlink = be16_to_cpu(dic->di_onlink); | ||
| 155 | buf->bs_projid = 0; | ||
| 156 | } else { | ||
| 157 | buf->bs_nlink = be32_to_cpu(dic->di_nlink); | ||
| 158 | buf->bs_projid = be16_to_cpu(dic->di_projid); | ||
| 159 | } | ||
| 160 | 149 | ||
| 161 | buf->bs_ino = ino; | 150 | if (!error) |
| 162 | buf->bs_mode = be16_to_cpu(dic->di_mode); | 151 | *stat = BULKSTAT_RV_DIDONE; |
| 163 | buf->bs_uid = be32_to_cpu(dic->di_uid); | ||
| 164 | buf->bs_gid = be32_to_cpu(dic->di_gid); | ||
| 165 | buf->bs_size = be64_to_cpu(dic->di_size); | ||
| 166 | buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); | ||
| 167 | buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); | ||
| 168 | buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); | ||
| 169 | buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); | ||
| 170 | buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); | ||
| 171 | buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); | ||
| 172 | buf->bs_xflags = xfs_dic2xflags(dic); | ||
| 173 | buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; | ||
| 174 | buf->bs_extents = be32_to_cpu(dic->di_nextents); | ||
| 175 | buf->bs_gen = be32_to_cpu(dic->di_gen); | ||
| 176 | memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); | ||
| 177 | buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); | ||
| 178 | buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); | ||
| 179 | buf->bs_aextents = be16_to_cpu(dic->di_anextents); | ||
| 180 | buf->bs_forkoff = XFS_DFORK_BOFF(dic); | ||
| 181 | 152 | ||
| 182 | switch (dic->di_format) { | 153 | out_free: |
| 183 | case XFS_DINODE_FMT_DEV: | 154 | kmem_free(buf); |
| 184 | buf->bs_rdev = xfs_dinode_get_rdev(dic); | 155 | return error; |
| 185 | buf->bs_blksize = BLKDEV_IOSIZE; | ||
| 186 | buf->bs_blocks = 0; | ||
| 187 | break; | ||
| 188 | case XFS_DINODE_FMT_LOCAL: | ||
| 189 | case XFS_DINODE_FMT_UUID: | ||
| 190 | buf->bs_rdev = 0; | ||
| 191 | buf->bs_blksize = mp->m_sb.sb_blocksize; | ||
| 192 | buf->bs_blocks = 0; | ||
| 193 | break; | ||
| 194 | case XFS_DINODE_FMT_EXTENTS: | ||
| 195 | case XFS_DINODE_FMT_BTREE: | ||
| 196 | buf->bs_rdev = 0; | ||
| 197 | buf->bs_blksize = mp->m_sb.sb_blocksize; | ||
| 198 | buf->bs_blocks = be64_to_cpu(dic->di_nblocks); | ||
| 199 | break; | ||
| 200 | } | ||
| 201 | } | 156 | } |
| 202 | 157 | ||
| 203 | /* Return 0 on success or positive error */ | 158 | /* Return 0 on success or positive error */ |
| @@ -217,118 +172,17 @@ xfs_bulkstat_one_fmt( | |||
| 217 | return 0; | 172 | return 0; |
| 218 | } | 173 | } |
| 219 | 174 | ||
| 220 | /* | ||
| 221 | * Return stat information for one inode. | ||
| 222 | * Return 0 if ok, else errno. | ||
| 223 | */ | ||
| 224 | int /* error status */ | ||
| 225 | xfs_bulkstat_one_int( | ||
| 226 | xfs_mount_t *mp, /* mount point for filesystem */ | ||
| 227 | xfs_ino_t ino, /* inode number to get data for */ | ||
| 228 | void __user *buffer, /* buffer to place output in */ | ||
| 229 | int ubsize, /* size of buffer */ | ||
| 230 | bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ | ||
| 231 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 232 | int *ubused, /* bytes used by me */ | ||
| 233 | void *dibuff, /* on-disk inode buffer */ | ||
| 234 | int *stat) /* BULKSTAT_RV_... */ | ||
| 235 | { | ||
| 236 | xfs_bstat_t *buf; /* return buffer */ | ||
| 237 | int error = 0; /* error value */ | ||
| 238 | xfs_dinode_t *dip; /* dinode inode pointer */ | ||
| 239 | |||
| 240 | dip = (xfs_dinode_t *)dibuff; | ||
| 241 | *stat = BULKSTAT_RV_NOTHING; | ||
| 242 | |||
| 243 | if (!buffer || xfs_internal_inum(mp, ino)) | ||
| 244 | return XFS_ERROR(EINVAL); | ||
| 245 | |||
| 246 | buf = kmem_alloc(sizeof(*buf), KM_SLEEP); | ||
| 247 | |||
| 248 | if (dip == NULL) { | ||
| 249 | /* We're not being passed a pointer to a dinode. This happens | ||
| 250 | * if BULKSTAT_FG_IGET is selected. Do the iget. | ||
| 251 | */ | ||
| 252 | error = xfs_bulkstat_one_iget(mp, ino, bno, buf, stat); | ||
| 253 | if (error) | ||
| 254 | goto out_free; | ||
| 255 | } else { | ||
| 256 | xfs_bulkstat_one_dinode(mp, ino, dip, buf); | ||
| 257 | } | ||
| 258 | |||
| 259 | error = formatter(buffer, ubsize, ubused, buf); | ||
| 260 | if (error) | ||
| 261 | goto out_free; | ||
| 262 | |||
| 263 | *stat = BULKSTAT_RV_DIDONE; | ||
| 264 | |||
| 265 | out_free: | ||
| 266 | kmem_free(buf); | ||
| 267 | return error; | ||
| 268 | } | ||
| 269 | |||
| 270 | int | 175 | int |
| 271 | xfs_bulkstat_one( | 176 | xfs_bulkstat_one( |
| 272 | xfs_mount_t *mp, /* mount point for filesystem */ | 177 | xfs_mount_t *mp, /* mount point for filesystem */ |
| 273 | xfs_ino_t ino, /* inode number to get data for */ | 178 | xfs_ino_t ino, /* inode number to get data for */ |
| 274 | void __user *buffer, /* buffer to place output in */ | 179 | void __user *buffer, /* buffer to place output in */ |
| 275 | int ubsize, /* size of buffer */ | 180 | int ubsize, /* size of buffer */ |
| 276 | void *private_data, /* my private data */ | ||
| 277 | xfs_daddr_t bno, /* starting bno of inode cluster */ | ||
| 278 | int *ubused, /* bytes used by me */ | 181 | int *ubused, /* bytes used by me */ |
| 279 | void *dibuff, /* on-disk inode buffer */ | ||
| 280 | int *stat) /* BULKSTAT_RV_... */ | 182 | int *stat) /* BULKSTAT_RV_... */ |
| 281 | { | 183 | { |
| 282 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, | 184 | return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, |
| 283 | xfs_bulkstat_one_fmt, bno, | 185 | xfs_bulkstat_one_fmt, ubused, stat); |
| 284 | ubused, dibuff, stat); | ||
| 285 | } | ||
| 286 | |||
| 287 | /* | ||
| 288 | * Test to see whether we can use the ondisk inode directly, based | ||
| 289 | * on the given bulkstat flags, filling in dipp accordingly. | ||
| 290 | * Returns zero if the inode is dodgey. | ||
| 291 | */ | ||
| 292 | STATIC int | ||
| 293 | xfs_bulkstat_use_dinode( | ||
| 294 | xfs_mount_t *mp, | ||
| 295 | int flags, | ||
| 296 | xfs_buf_t *bp, | ||
| 297 | int clustidx, | ||
| 298 | xfs_dinode_t **dipp) | ||
| 299 | { | ||
| 300 | xfs_dinode_t *dip; | ||
| 301 | unsigned int aformat; | ||
| 302 | |||
| 303 | *dipp = NULL; | ||
| 304 | if (!bp || (flags & BULKSTAT_FG_IGET)) | ||
| 305 | return 1; | ||
| 306 | dip = (xfs_dinode_t *) | ||
| 307 | xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); | ||
| 308 | /* | ||
| 309 | * Check the buffer containing the on-disk inode for di_mode == 0. | ||
| 310 | * This is to prevent xfs_bulkstat from picking up just reclaimed | ||
| 311 | * inodes that have their in-core state initialized but not flushed | ||
| 312 | * to disk yet. This is a temporary hack that would require a proper | ||
| 313 | * fix in the future. | ||
| 314 | */ | ||
| 315 | if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC || | ||
| 316 | !XFS_DINODE_GOOD_VERSION(dip->di_version) || | ||
| 317 | !dip->di_mode) | ||
| 318 | return 0; | ||
| 319 | if (flags & BULKSTAT_FG_QUICK) { | ||
| 320 | *dipp = dip; | ||
| 321 | return 1; | ||
| 322 | } | ||
| 323 | /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ | ||
| 324 | aformat = dip->di_aformat; | ||
| 325 | if ((XFS_DFORK_Q(dip) == 0) || | ||
| 326 | (aformat == XFS_DINODE_FMT_LOCAL) || | ||
| 327 | (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_anextents)) { | ||
| 328 | *dipp = dip; | ||
| 329 | return 1; | ||
| 330 | } | ||
| 331 | return 1; | ||
| 332 | } | 186 | } |
| 333 | 187 | ||
| 334 | #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) | 188 | #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) |
| @@ -342,10 +196,8 @@ xfs_bulkstat( | |||
| 342 | xfs_ino_t *lastinop, /* last inode returned */ | 196 | xfs_ino_t *lastinop, /* last inode returned */ |
| 343 | int *ubcountp, /* size of buffer/count returned */ | 197 | int *ubcountp, /* size of buffer/count returned */ |
| 344 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ | 198 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ |
| 345 | void *private_data,/* private data for formatter */ | ||
| 346 | size_t statstruct_size, /* sizeof struct filling */ | 199 | size_t statstruct_size, /* sizeof struct filling */ |
| 347 | char __user *ubuffer, /* buffer with inode stats */ | 200 | char __user *ubuffer, /* buffer with inode stats */ |
| 348 | int flags, /* defined in xfs_itable.h */ | ||
| 349 | int *done) /* 1 if there are more stats to get */ | 201 | int *done) /* 1 if there are more stats to get */ |
| 350 | { | 202 | { |
| 351 | xfs_agblock_t agbno=0;/* allocation group block number */ | 203 | xfs_agblock_t agbno=0;/* allocation group block number */ |
| @@ -380,14 +232,12 @@ xfs_bulkstat( | |||
| 380 | int ubelem; /* spaces used in user's buffer */ | 232 | int ubelem; /* spaces used in user's buffer */ |
| 381 | int ubused; /* bytes used by formatter */ | 233 | int ubused; /* bytes used by formatter */ |
| 382 | xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ | 234 | xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ |
| 383 | xfs_dinode_t *dip; /* ptr into bp for specific inode */ | ||
| 384 | 235 | ||
| 385 | /* | 236 | /* |
| 386 | * Get the last inode value, see if there's nothing to do. | 237 | * Get the last inode value, see if there's nothing to do. |
| 387 | */ | 238 | */ |
| 388 | ino = (xfs_ino_t)*lastinop; | 239 | ino = (xfs_ino_t)*lastinop; |
| 389 | lastino = ino; | 240 | lastino = ino; |
| 390 | dip = NULL; | ||
| 391 | agno = XFS_INO_TO_AGNO(mp, ino); | 241 | agno = XFS_INO_TO_AGNO(mp, ino); |
| 392 | agino = XFS_INO_TO_AGINO(mp, ino); | 242 | agino = XFS_INO_TO_AGINO(mp, ino); |
| 393 | if (agno >= mp->m_sb.sb_agcount || | 243 | if (agno >= mp->m_sb.sb_agcount || |
| @@ -612,37 +462,6 @@ xfs_bulkstat( | |||
| 612 | irbp->ir_startino) + | 462 | irbp->ir_startino) + |
| 613 | ((chunkidx & nimask) >> | 463 | ((chunkidx & nimask) >> |
| 614 | mp->m_sb.sb_inopblog); | 464 | mp->m_sb.sb_inopblog); |
| 615 | |||
| 616 | if (flags & (BULKSTAT_FG_QUICK | | ||
| 617 | BULKSTAT_FG_INLINE)) { | ||
| 618 | int offset; | ||
| 619 | |||
| 620 | ino = XFS_AGINO_TO_INO(mp, agno, | ||
| 621 | agino); | ||
| 622 | bno = XFS_AGB_TO_DADDR(mp, agno, | ||
| 623 | agbno); | ||
| 624 | |||
| 625 | /* | ||
| 626 | * Get the inode cluster buffer | ||
| 627 | */ | ||
| 628 | if (bp) | ||
| 629 | xfs_buf_relse(bp); | ||
| 630 | |||
| 631 | error = xfs_inotobp(mp, NULL, ino, &dip, | ||
| 632 | &bp, &offset, | ||
| 633 | XFS_IGET_BULKSTAT); | ||
| 634 | |||
| 635 | if (!error) | ||
| 636 | clustidx = offset / mp->m_sb.sb_inodesize; | ||
| 637 | if (XFS_TEST_ERROR(error != 0, | ||
| 638 | mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK, | ||
| 639 | XFS_RANDOM_BULKSTAT_READ_CHUNK)) { | ||
| 640 | bp = NULL; | ||
| 641 | ubleft = 0; | ||
| 642 | rval = error; | ||
| 643 | break; | ||
| 644 | } | ||
| 645 | } | ||
| 646 | } | 465 | } |
| 647 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | 466 | ino = XFS_AGINO_TO_INO(mp, agno, agino); |
| 648 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); | 467 | bno = XFS_AGB_TO_DADDR(mp, agno, agbno); |
| @@ -658,35 +477,13 @@ xfs_bulkstat( | |||
| 658 | * when the chunk is used up. | 477 | * when the chunk is used up. |
| 659 | */ | 478 | */ |
| 660 | irbp->ir_freecount++; | 479 | irbp->ir_freecount++; |
| 661 | if (!xfs_bulkstat_use_dinode(mp, flags, bp, | ||
| 662 | clustidx, &dip)) { | ||
| 663 | lastino = ino; | ||
| 664 | continue; | ||
| 665 | } | ||
| 666 | /* | ||
| 667 | * If we need to do an iget, cannot hold bp. | ||
| 668 | * Drop it, until starting the next cluster. | ||
| 669 | */ | ||
| 670 | if ((flags & BULKSTAT_FG_INLINE) && !dip) { | ||
| 671 | if (bp) | ||
| 672 | xfs_buf_relse(bp); | ||
| 673 | bp = NULL; | ||
| 674 | } | ||
| 675 | 480 | ||
| 676 | /* | 481 | /* |
| 677 | * Get the inode and fill in a single buffer. | 482 | * Get the inode and fill in a single buffer. |
| 678 | * BULKSTAT_FG_QUICK uses dip to fill it in. | ||
| 679 | * BULKSTAT_FG_IGET uses igets. | ||
| 680 | * BULKSTAT_FG_INLINE uses dip if we have an | ||
| 681 | * inline attr fork, else igets. | ||
| 682 | * See: xfs_bulkstat_one & xfs_dm_bulkstat_one. | ||
| 683 | * This is also used to count inodes/blks, etc | ||
| 684 | * in xfs_qm_quotacheck. | ||
| 685 | */ | 483 | */ |
| 686 | ubused = statstruct_size; | 484 | ubused = statstruct_size; |
| 687 | error = formatter(mp, ino, ubufp, | 485 | error = formatter(mp, ino, ubufp, ubleft, |
| 688 | ubleft, private_data, | 486 | &ubused, &fmterror); |
| 689 | bno, &ubused, dip, &fmterror); | ||
| 690 | if (fmterror == BULKSTAT_RV_NOTHING) { | 487 | if (fmterror == BULKSTAT_RV_NOTHING) { |
| 691 | if (error && error != ENOENT && | 488 | if (error && error != ENOENT && |
| 692 | error != EINVAL) { | 489 | error != EINVAL) { |
| @@ -778,8 +575,7 @@ xfs_bulkstat_single( | |||
| 778 | */ | 575 | */ |
| 779 | 576 | ||
| 780 | ino = (xfs_ino_t)*lastinop; | 577 | ino = (xfs_ino_t)*lastinop; |
| 781 | error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), | 578 | error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); |
| 782 | NULL, 0, NULL, NULL, &res); | ||
| 783 | if (error) { | 579 | if (error) { |
| 784 | /* | 580 | /* |
| 785 | * Special case way failed, do it the "long" way | 581 | * Special case way failed, do it the "long" way |
| @@ -788,8 +584,7 @@ xfs_bulkstat_single( | |||
| 788 | (*lastinop)--; | 584 | (*lastinop)--; |
| 789 | count = 1; | 585 | count = 1; |
| 790 | if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, | 586 | if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, |
| 791 | NULL, sizeof(xfs_bstat_t), buffer, | 587 | sizeof(xfs_bstat_t), buffer, done)) |
| 792 | BULKSTAT_FG_IGET, done)) | ||
| 793 | return error; | 588 | return error; |
| 794 | if (count == 0 || (xfs_ino_t)*lastinop != ino) | 589 | if (count == 0 || (xfs_ino_t)*lastinop != ino) |
| 795 | return error == EFSCORRUPTED ? | 590 | return error == EFSCORRUPTED ? |
diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 20792bf45946..97295d91d170 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h | |||
| @@ -27,10 +27,7 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, | |||
| 27 | xfs_ino_t ino, | 27 | xfs_ino_t ino, |
| 28 | void __user *buffer, | 28 | void __user *buffer, |
| 29 | int ubsize, | 29 | int ubsize, |
| 30 | void *private_data, | ||
| 31 | xfs_daddr_t bno, | ||
| 32 | int *ubused, | 30 | int *ubused, |
| 33 | void *dip, | ||
| 34 | int *stat); | 31 | int *stat); |
| 35 | 32 | ||
| 36 | /* | 33 | /* |
| @@ -41,13 +38,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, | |||
| 41 | #define BULKSTAT_RV_GIVEUP 2 | 38 | #define BULKSTAT_RV_GIVEUP 2 |
| 42 | 39 | ||
| 43 | /* | 40 | /* |
| 44 | * Values for bulkstat flag argument. | ||
| 45 | */ | ||
| 46 | #define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ | ||
| 47 | #define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ | ||
| 48 | #define BULKSTAT_FG_INLINE 0x4 /* No iget if inline attrs */ | ||
| 49 | |||
| 50 | /* | ||
| 51 | * Return stat information in bulk (by-inode) for the filesystem. | 41 | * Return stat information in bulk (by-inode) for the filesystem. |
| 52 | */ | 42 | */ |
| 53 | int /* error status */ | 43 | int /* error status */ |
| @@ -56,10 +46,8 @@ xfs_bulkstat( | |||
| 56 | xfs_ino_t *lastino, /* last inode returned */ | 46 | xfs_ino_t *lastino, /* last inode returned */ |
| 57 | int *count, /* size of buffer/count returned */ | 47 | int *count, /* size of buffer/count returned */ |
| 58 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ | 48 | bulkstat_one_pf formatter, /* func that'd fill a single buf */ |
| 59 | void *private_data, /* private data for formatter */ | ||
| 60 | size_t statstruct_size,/* sizeof struct that we're filling */ | 49 | size_t statstruct_size,/* sizeof struct that we're filling */ |
| 61 | char __user *ubuffer,/* buffer with inode stats */ | 50 | char __user *ubuffer,/* buffer with inode stats */ |
| 62 | int flags, /* flag to control access method */ | ||
| 63 | int *done); /* 1 if there are more stats to get */ | 51 | int *done); /* 1 if there are more stats to get */ |
| 64 | 52 | ||
| 65 | int | 53 | int |
| @@ -82,9 +70,7 @@ xfs_bulkstat_one_int( | |||
| 82 | void __user *buffer, | 70 | void __user *buffer, |
| 83 | int ubsize, | 71 | int ubsize, |
| 84 | bulkstat_one_fmt_pf formatter, | 72 | bulkstat_one_fmt_pf formatter, |
| 85 | xfs_daddr_t bno, | ||
| 86 | int *ubused, | 73 | int *ubused, |
| 87 | void *dibuff, | ||
| 88 | int *stat); | 74 | int *stat); |
| 89 | 75 | ||
| 90 | int | 76 | int |
| @@ -93,10 +79,7 @@ xfs_bulkstat_one( | |||
| 93 | xfs_ino_t ino, | 79 | xfs_ino_t ino, |
| 94 | void __user *buffer, | 80 | void __user *buffer, |
| 95 | int ubsize, | 81 | int ubsize, |
| 96 | void *private_data, | ||
| 97 | xfs_daddr_t bno, | ||
| 98 | int *ubused, | 82 | int *ubused, |
| 99 | void *dibuff, | ||
| 100 | int *stat); | 83 | int *stat); |
| 101 | 84 | ||
| 102 | typedef int (*inumbers_fmt_pf)( | 85 | typedef int (*inumbers_fmt_pf)( |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ed0684cc50ee..9ac5cfab27b9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -3198,7 +3198,7 @@ xlog_recover_process_one_iunlink( | |||
| 3198 | int error; | 3198 | int error; |
| 3199 | 3199 | ||
| 3200 | ino = XFS_AGINO_TO_INO(mp, agno, agino); | 3200 | ino = XFS_AGINO_TO_INO(mp, agno, agino); |
| 3201 | error = xfs_iget(mp, NULL, ino, 0, 0, &ip, 0); | 3201 | error = xfs_iget(mp, NULL, ino, 0, 0, &ip); |
| 3202 | if (error) | 3202 | if (error) |
| 3203 | goto fail; | 3203 | goto fail; |
| 3204 | 3204 | ||
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d59f4e8bedcf..69f62d8b2816 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -1300,7 +1300,7 @@ xfs_mountfs( | |||
| 1300 | * Get and sanity-check the root inode. | 1300 | * Get and sanity-check the root inode. |
| 1301 | * Save the pointer to it in the mount structure. | 1301 | * Save the pointer to it in the mount structure. |
| 1302 | */ | 1302 | */ |
| 1303 | error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0); | 1303 | error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip); |
| 1304 | if (error) { | 1304 | if (error) { |
| 1305 | cmn_err(CE_WARN, "XFS: failed to read root inode"); | 1305 | cmn_err(CE_WARN, "XFS: failed to read root inode"); |
| 1306 | goto out_log_dealloc; | 1306 | goto out_log_dealloc; |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 16445518506d..a2d32ce335aa 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
| @@ -2277,12 +2277,12 @@ xfs_rtmount_inodes( | |||
| 2277 | sbp = &mp->m_sb; | 2277 | sbp = &mp->m_sb; |
| 2278 | if (sbp->sb_rbmino == NULLFSINO) | 2278 | if (sbp->sb_rbmino == NULLFSINO) |
| 2279 | return 0; | 2279 | return 0; |
| 2280 | error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip, 0); | 2280 | error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); |
| 2281 | if (error) | 2281 | if (error) |
| 2282 | return error; | 2282 | return error; |
| 2283 | ASSERT(mp->m_rbmip != NULL); | 2283 | ASSERT(mp->m_rbmip != NULL); |
| 2284 | ASSERT(sbp->sb_rsumino != NULLFSINO); | 2284 | ASSERT(sbp->sb_rsumino != NULLFSINO); |
| 2285 | error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip, 0); | 2285 | error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); |
| 2286 | if (error) { | 2286 | if (error) { |
| 2287 | IRELE(mp->m_rbmip); | 2287 | IRELE(mp->m_rbmip); |
| 2288 | return error; | 2288 | return error; |
diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 785ff101da0a..2559dfec946b 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c | |||
| @@ -62,7 +62,7 @@ xfs_trans_iget( | |||
| 62 | { | 62 | { |
| 63 | int error; | 63 | int error; |
| 64 | 64 | ||
| 65 | error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp, 0); | 65 | error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp); |
| 66 | if (!error && tp) | 66 | if (!error && tp) |
| 67 | xfs_trans_ijoin(tp, *ipp, lock_flags); | 67 | xfs_trans_ijoin(tp, *ipp, lock_flags); |
| 68 | return error; | 68 | return error; |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index a06bd62504fc..c1646838898f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -1269,7 +1269,7 @@ xfs_lookup( | |||
| 1269 | if (error) | 1269 | if (error) |
| 1270 | goto out; | 1270 | goto out; |
| 1271 | 1271 | ||
| 1272 | error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); | 1272 | error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); |
| 1273 | if (error) | 1273 | if (error) |
| 1274 | goto out_free_name; | 1274 | goto out_free_name; |
| 1275 | 1275 | ||
