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.
This commit is contained in:
commit
159099dc3d
6 changed files with 39 additions and 22 deletions
|
@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *);
|
|||
#define BUF_BUSY XBF_DONT_BLOCK
|
||||
|
||||
#define XFS_BUF_BFLAGS(bp) ((bp)->b_flags)
|
||||
#define XFS_BUF_ZEROFLAGS(bp) \
|
||||
((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI))
|
||||
#define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \
|
||||
~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED))
|
||||
|
||||
#define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE)
|
||||
#define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE)
|
||||
|
|
|
@ -314,6 +314,13 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp)
|
|||
return;
|
||||
}
|
||||
|
||||
if (xfs_readonly_buftarg(mp->m_ddev_targp)) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
"Disabling barriers, underlying device is readonly");
|
||||
mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
return;
|
||||
}
|
||||
|
||||
error = xfs_barrier_test(mp);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
|
|
|
@ -217,17 +217,24 @@ xfs_qm_statvfs(
|
|||
return 0;
|
||||
dp = &dqp->q_core;
|
||||
|
||||
limit = dp->d_blk_softlimit ? dp->d_blk_softlimit : dp->d_blk_hardlimit;
|
||||
limit = dp->d_blk_softlimit ?
|
||||
be64_to_cpu(dp->d_blk_softlimit) :
|
||||
be64_to_cpu(dp->d_blk_hardlimit);
|
||||
if (limit && statp->f_blocks > limit) {
|
||||
statp->f_blocks = limit;
|
||||
statp->f_bfree = (statp->f_blocks > dp->d_bcount) ?
|
||||
(statp->f_blocks - dp->d_bcount) : 0;
|
||||
statp->f_bfree =
|
||||
(statp->f_blocks > be64_to_cpu(dp->d_bcount)) ?
|
||||
(statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0;
|
||||
}
|
||||
limit = dp->d_ino_softlimit ? dp->d_ino_softlimit : dp->d_ino_hardlimit;
|
||||
|
||||
limit = dp->d_ino_softlimit ?
|
||||
be64_to_cpu(dp->d_ino_softlimit) :
|
||||
be64_to_cpu(dp->d_ino_hardlimit);
|
||||
if (limit && statp->f_files > limit) {
|
||||
statp->f_files = limit;
|
||||
statp->f_ffree = (statp->f_files > dp->d_icount) ?
|
||||
(statp->f_ffree - dp->d_icount) : 0;
|
||||
statp->f_ffree =
|
||||
(statp->f_files > be64_to_cpu(dp->d_icount)) ?
|
||||
(statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0;
|
||||
}
|
||||
|
||||
xfs_qm_dqput(dqp);
|
||||
|
|
|
@ -334,10 +334,9 @@ xfs_itobp(
|
|||
#if !defined(__KERNEL__)
|
||||
ni = 0;
|
||||
#elif defined(DEBUG)
|
||||
ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 :
|
||||
(BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog);
|
||||
ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog;
|
||||
#else /* usual case */
|
||||
ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1;
|
||||
ni = 1;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < ni; i++) {
|
||||
|
@ -348,11 +347,15 @@ xfs_itobp(
|
|||
(i << mp->m_sb.sb_inodelog));
|
||||
di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC &&
|
||||
XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT));
|
||||
if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP,
|
||||
XFS_RANDOM_ITOBP_INOTOBP))) {
|
||||
if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
|
||||
XFS_ERRTAG_ITOBP_INOTOBP,
|
||||
XFS_RANDOM_ITOBP_INOTOBP))) {
|
||||
if (imap_flags & XFS_IMAP_BULKSTAT) {
|
||||
xfs_trans_brelse(tp, bp);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if (!(imap_flags & XFS_IMAP_BULKSTAT))
|
||||
cmn_err(CE_ALERT,
|
||||
cmn_err(CE_ALERT,
|
||||
"Device %s - bad inode magic/vsn "
|
||||
"daddr %lld #%d (magic=%x)",
|
||||
XFS_BUFTARG_NAME(mp->m_ddev_targp),
|
||||
|
|
|
@ -1413,7 +1413,7 @@ xlog_sync(xlog_t *log,
|
|||
ops = iclog->ic_header.h_num_logops;
|
||||
INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops);
|
||||
|
||||
bp = iclog->ic_bp;
|
||||
bp = iclog->ic_bp;
|
||||
ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1);
|
||||
XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
|
||||
XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)));
|
||||
|
@ -1430,15 +1430,14 @@ xlog_sync(xlog_t *log,
|
|||
}
|
||||
XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count);
|
||||
XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */
|
||||
XFS_BUF_ZEROFLAGS(bp);
|
||||
XFS_BUF_BUSY(bp);
|
||||
XFS_BUF_ASYNC(bp);
|
||||
/*
|
||||
* Do an ordered write for the log block.
|
||||
*
|
||||
* It may not be needed to flush the first split block in the log wrap
|
||||
* case, but do it anyways to be safe -AK
|
||||
* Its unnecessary to flush the first split block in the log wrap case.
|
||||
*/
|
||||
if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
|
||||
if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER))
|
||||
XFS_BUF_ORDERED(bp);
|
||||
|
||||
ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
|
||||
|
@ -1460,7 +1459,7 @@ xlog_sync(xlog_t *log,
|
|||
return error;
|
||||
}
|
||||
if (split) {
|
||||
bp = iclog->ic_log->l_xbuf;
|
||||
bp = iclog->ic_log->l_xbuf;
|
||||
ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) ==
|
||||
(unsigned long)1);
|
||||
XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
|
||||
|
@ -1468,6 +1467,7 @@ xlog_sync(xlog_t *log,
|
|||
XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+
|
||||
(__psint_t)count), split);
|
||||
XFS_BUF_SET_FSPRIVATE(bp, iclog);
|
||||
XFS_BUF_ZEROFLAGS(bp);
|
||||
XFS_BUF_BUSY(bp);
|
||||
XFS_BUF_ASYNC(bp);
|
||||
if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
|
||||
|
|
|
@ -515,7 +515,7 @@ xfs_mount(
|
|||
if (error)
|
||||
goto error2;
|
||||
|
||||
if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY))
|
||||
if (mp->m_flags & XFS_MOUNT_BARRIER)
|
||||
xfs_mountfs_check_barriers(mp);
|
||||
|
||||
error = XFS_IOINIT(vfsp, args, flags);
|
||||
|
|
Loading…
Reference in a new issue