Commit 159099dc authored by Linus Torvalds's avatar Linus Torvalds

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.
parents 16585e76 41ff715a
...@@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *); ...@@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *);
#define BUF_BUSY XBF_DONT_BLOCK #define BUF_BUSY XBF_DONT_BLOCK
#define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags)
#define XFS_BUF_ZEROFLAGS(bp) \ #define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \
((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI)) ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED))
#define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE)
#define XFS_BUF_UNSTALE(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) ...@@ -314,6 +314,13 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp)
return; 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); error = xfs_barrier_test(mp);
if (error) { if (error) {
xfs_fs_cmn_err(CE_NOTE, mp, xfs_fs_cmn_err(CE_NOTE, mp,
......
...@@ -217,17 +217,24 @@ xfs_qm_statvfs( ...@@ -217,17 +217,24 @@ xfs_qm_statvfs(
return 0; return 0;
dp = &dqp->q_core; 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) { if (limit && statp->f_blocks > limit) {
statp->f_blocks = limit; statp->f_blocks = limit;
statp->f_bfree = (statp->f_blocks > dp->d_bcount) ? statp->f_bfree =
(statp->f_blocks - dp->d_bcount) : 0; (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) { if (limit && statp->f_files > limit) {
statp->f_files = limit; statp->f_files = limit;
statp->f_ffree = (statp->f_files > dp->d_icount) ? statp->f_ffree =
(statp->f_ffree - dp->d_icount) : 0; (statp->f_files > be64_to_cpu(dp->d_icount)) ?
(statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0;
} }
xfs_qm_dqput(dqp); xfs_qm_dqput(dqp);
......
...@@ -334,10 +334,9 @@ xfs_itobp( ...@@ -334,10 +334,9 @@ xfs_itobp(
#if !defined(__KERNEL__) #if !defined(__KERNEL__)
ni = 0; ni = 0;
#elif defined(DEBUG) #elif defined(DEBUG)
ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog;
(BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog);
#else /* usual case */ #else /* usual case */
ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1; ni = 1;
#endif #endif
for (i = 0; i < ni; i++) { for (i = 0; i < ni; i++) {
...@@ -348,10 +347,14 @@ xfs_itobp( ...@@ -348,10 +347,14 @@ xfs_itobp(
(i << mp->m_sb.sb_inodelog)); (i << mp->m_sb.sb_inodelog));
di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && 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)); 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, if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
XFS_ERRTAG_ITOBP_INOTOBP,
XFS_RANDOM_ITOBP_INOTOBP))) { XFS_RANDOM_ITOBP_INOTOBP))) {
if (imap_flags & XFS_IMAP_BULKSTAT) {
xfs_trans_brelse(tp, bp);
return XFS_ERROR(EINVAL);
}
#ifdef DEBUG #ifdef DEBUG
if (!(imap_flags & XFS_IMAP_BULKSTAT))
cmn_err(CE_ALERT, cmn_err(CE_ALERT,
"Device %s - bad inode magic/vsn " "Device %s - bad inode magic/vsn "
"daddr %lld #%d (magic=%x)", "daddr %lld #%d (magic=%x)",
......
...@@ -1430,15 +1430,14 @@ xlog_sync(xlog_t *log, ...@@ -1430,15 +1430,14 @@ xlog_sync(xlog_t *log,
} }
XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count);
XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */
XFS_BUF_ZEROFLAGS(bp);
XFS_BUF_BUSY(bp); XFS_BUF_BUSY(bp);
XFS_BUF_ASYNC(bp); XFS_BUF_ASYNC(bp);
/* /*
* Do an ordered write for the log block. * Do an ordered write for the log block.
* * Its unnecessary to flush the first split block in the log wrap case.
* It may not be needed to flush the first split block in the log wrap
* case, but do it anyways to be safe -AK
*/ */
if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER))
XFS_BUF_ORDERED(bp); XFS_BUF_ORDERED(bp);
ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
...@@ -1468,6 +1467,7 @@ xlog_sync(xlog_t *log, ...@@ -1468,6 +1467,7 @@ xlog_sync(xlog_t *log,
XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+
(__psint_t)count), split); (__psint_t)count), split);
XFS_BUF_SET_FSPRIVATE(bp, iclog); XFS_BUF_SET_FSPRIVATE(bp, iclog);
XFS_BUF_ZEROFLAGS(bp);
XFS_BUF_BUSY(bp); XFS_BUF_BUSY(bp);
XFS_BUF_ASYNC(bp); XFS_BUF_ASYNC(bp);
if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
......
...@@ -515,7 +515,7 @@ xfs_mount( ...@@ -515,7 +515,7 @@ xfs_mount(
if (error) if (error)
goto error2; 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); xfs_mountfs_check_barriers(mp);
error = XFS_IOINIT(vfsp, args, flags); error = XFS_IOINIT(vfsp, args, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment