Merge git://oss.sgi.com:8090/nathans/xfs-rc-2.6

* git://oss.sgi.com:8090/nathans/xfs-rc-2.6:
[XFS] Ensure bulkstat from an invalid inode number gets caught always with
[XFS] Fix a barrier related forced shutdown on mounts with quota enabled.
[XFS] Fix remount vs no/barrier options by ensuring we clear unwanted
[XFS] All xfs_disk_dquot_t values are (as the name says) disk endian.

+39 -22
+2 -2
fs/xfs/linux-2.6/xfs_buf.h
··· 246 #define BUF_BUSY XBF_DONT_BLOCK 247 248 #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) 249 - #define XFS_BUF_ZEROFLAGS(bp) \ 250 - ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI)) 251 252 #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) 253 #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE)
··· 246 #define BUF_BUSY XBF_DONT_BLOCK 247 248 #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) 249 + #define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \ 250 + ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED)) 251 252 #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) 253 #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE)
+7
fs/xfs/linux-2.6/xfs_super.c
··· 314 return; 315 } 316 317 error = xfs_barrier_test(mp); 318 if (error) { 319 xfs_fs_cmn_err(CE_NOTE, mp,
··· 314 return; 315 } 316 317 + if (xfs_readonly_buftarg(mp->m_ddev_targp)) { 318 + xfs_fs_cmn_err(CE_NOTE, mp, 319 + "Disabling barriers, underlying device is readonly"); 320 + mp->m_flags &= ~XFS_MOUNT_BARRIER; 321 + return; 322 + } 323 + 324 error = xfs_barrier_test(mp); 325 if (error) { 326 xfs_fs_cmn_err(CE_NOTE, mp,
+13 -6
fs/xfs/quota/xfs_qm_bhv.c
··· 217 return 0; 218 dp = &dqp->q_core; 219 220 - limit = dp->d_blk_softlimit ? dp->d_blk_softlimit : dp->d_blk_hardlimit; 221 if (limit && statp->f_blocks > limit) { 222 statp->f_blocks = limit; 223 - statp->f_bfree = (statp->f_blocks > dp->d_bcount) ? 224 - (statp->f_blocks - dp->d_bcount) : 0; 225 } 226 - limit = dp->d_ino_softlimit ? dp->d_ino_softlimit : dp->d_ino_hardlimit; 227 if (limit && statp->f_files > limit) { 228 statp->f_files = limit; 229 - statp->f_ffree = (statp->f_files > dp->d_icount) ? 230 - (statp->f_ffree - dp->d_icount) : 0; 231 } 232 233 xfs_qm_dqput(dqp);
··· 217 return 0; 218 dp = &dqp->q_core; 219 220 + limit = dp->d_blk_softlimit ? 221 + be64_to_cpu(dp->d_blk_softlimit) : 222 + be64_to_cpu(dp->d_blk_hardlimit); 223 if (limit && statp->f_blocks > limit) { 224 statp->f_blocks = limit; 225 + statp->f_bfree = 226 + (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ? 227 + (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0; 228 } 229 + 230 + limit = dp->d_ino_softlimit ? 231 + be64_to_cpu(dp->d_ino_softlimit) : 232 + be64_to_cpu(dp->d_ino_hardlimit); 233 if (limit && statp->f_files > limit) { 234 statp->f_files = limit; 235 + statp->f_ffree = 236 + (statp->f_files > be64_to_cpu(dp->d_icount)) ? 237 + (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0; 238 } 239 240 xfs_qm_dqput(dqp);
+10 -7
fs/xfs/xfs_inode.c
··· 334 #if !defined(__KERNEL__) 335 ni = 0; 336 #elif defined(DEBUG) 337 - ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 338 - (BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog); 339 #else /* usual case */ 340 - ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1; 341 #endif 342 343 for (i = 0; i < ni; i++) { ··· 347 (i << mp->m_sb.sb_inodelog)); 348 di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && 349 XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); 350 - if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, 351 - XFS_RANDOM_ITOBP_INOTOBP))) { 352 #ifdef DEBUG 353 - if (!(imap_flags & XFS_IMAP_BULKSTAT)) 354 - cmn_err(CE_ALERT, 355 "Device %s - bad inode magic/vsn " 356 "daddr %lld #%d (magic=%x)", 357 XFS_BUFTARG_NAME(mp->m_ddev_targp),
··· 334 #if !defined(__KERNEL__) 335 ni = 0; 336 #elif defined(DEBUG) 337 + ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog; 338 #else /* usual case */ 339 + ni = 1; 340 #endif 341 342 for (i = 0; i < ni; i++) { ··· 348 (i << mp->m_sb.sb_inodelog)); 349 di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && 350 XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); 351 + if (unlikely(XFS_TEST_ERROR(!di_ok, mp, 352 + XFS_ERRTAG_ITOBP_INOTOBP, 353 + XFS_RANDOM_ITOBP_INOTOBP))) { 354 + if (imap_flags & XFS_IMAP_BULKSTAT) { 355 + xfs_trans_brelse(tp, bp); 356 + return XFS_ERROR(EINVAL); 357 + } 358 #ifdef DEBUG 359 + cmn_err(CE_ALERT, 360 "Device %s - bad inode magic/vsn " 361 "daddr %lld #%d (magic=%x)", 362 XFS_BUFTARG_NAME(mp->m_ddev_targp),
+6 -6
fs/xfs/xfs_log.c
··· 1413 ops = iclog->ic_header.h_num_logops; 1414 INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); 1415 1416 - bp = iclog->ic_bp; 1417 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); 1418 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); 1419 XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); ··· 1430 } 1431 XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); 1432 XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ 1433 XFS_BUF_BUSY(bp); 1434 XFS_BUF_ASYNC(bp); 1435 /* 1436 * Do an ordered write for the log block. 1437 - * 1438 - * It may not be needed to flush the first split block in the log wrap 1439 - * case, but do it anyways to be safe -AK 1440 */ 1441 - if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) 1442 XFS_BUF_ORDERED(bp); 1443 1444 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); ··· 1459 return error; 1460 } 1461 if (split) { 1462 - bp = iclog->ic_log->l_xbuf; 1463 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == 1464 (unsigned long)1); 1465 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); ··· 1467 XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ 1468 (__psint_t)count), split); 1469 XFS_BUF_SET_FSPRIVATE(bp, iclog); 1470 XFS_BUF_BUSY(bp); 1471 XFS_BUF_ASYNC(bp); 1472 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
··· 1413 ops = iclog->ic_header.h_num_logops; 1414 INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); 1415 1416 + bp = iclog->ic_bp; 1417 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); 1418 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); 1419 XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); ··· 1430 } 1431 XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); 1432 XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ 1433 + XFS_BUF_ZEROFLAGS(bp); 1434 XFS_BUF_BUSY(bp); 1435 XFS_BUF_ASYNC(bp); 1436 /* 1437 * Do an ordered write for the log block. 1438 + * Its unnecessary to flush the first split block in the log wrap case. 1439 */ 1440 + if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) 1441 XFS_BUF_ORDERED(bp); 1442 1443 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); ··· 1460 return error; 1461 } 1462 if (split) { 1463 + bp = iclog->ic_log->l_xbuf; 1464 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == 1465 (unsigned long)1); 1466 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); ··· 1468 XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ 1469 (__psint_t)count), split); 1470 XFS_BUF_SET_FSPRIVATE(bp, iclog); 1471 + XFS_BUF_ZEROFLAGS(bp); 1472 XFS_BUF_BUSY(bp); 1473 XFS_BUF_ASYNC(bp); 1474 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
+1 -1
fs/xfs/xfs_vfsops.c
··· 515 if (error) 516 goto error2; 517 518 - if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY)) 519 xfs_mountfs_check_barriers(mp); 520 521 error = XFS_IOINIT(vfsp, args, flags);
··· 515 if (error) 516 goto error2; 517 518 + if (mp->m_flags & XFS_MOUNT_BARRIER) 519 xfs_mountfs_check_barriers(mp); 520 521 error = XFS_IOINIT(vfsp, args, flags);