Commit 6ea9786e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'xfs-for-linus-v3.13-rc1-2' of git://oss.sgi.com/xfs/xfs

Pull second xfs update from Ben Myers:
 "There are a couple of patches that I wasn't quite sure about in time
  for our initial 3.13 pull request, a bugfix, and an update to add Dave
  to MAINTAINERS:

  Here we have a performance fix for inode iversion, increased inode
  cluster size for v5 superblock filesystems, a fix for error handling
  in xfs_bmap_add_attrfork, and a MAINTAINERS update to add Dave"

* tag 'xfs-for-linus-v3.13-rc1-2' of git://oss.sgi.com/xfs/xfs:
  xfs: open code inc_inode_iversion when logging an inode
  xfs: increase inode cluster size for v5 filesystems
  xfs: fix unlock in xfs_bmap_add_attrfork
  xfs: update maintainers
parents 24f971ab 2fe8c1c0
...@@ -9525,8 +9525,8 @@ F: drivers/xen/*swiotlb* ...@@ -9525,8 +9525,8 @@ F: drivers/xen/*swiotlb*
XFS FILESYSTEM XFS FILESYSTEM
P: Silicon Graphics Inc P: Silicon Graphics Inc
M: Dave Chinner <dchinner@fromorbit.com>
M: Ben Myers <bpm@sgi.com> M: Ben Myers <bpm@sgi.com>
M: Alex Elder <elder@kernel.org>
M: xfs@oss.sgi.com M: xfs@oss.sgi.com
L: xfs@oss.sgi.com L: xfs@oss.sgi.com
W: http://oss.sgi.com/projects/xfs W: http://oss.sgi.com/projects/xfs
......
...@@ -1137,6 +1137,7 @@ xfs_bmap_add_attrfork( ...@@ -1137,6 +1137,7 @@ xfs_bmap_add_attrfork(
int committed; /* xaction was committed */ int committed; /* xaction was committed */
int logflags; /* logging flags */ int logflags; /* logging flags */
int error; /* error return value */ int error; /* error return value */
int cancel_flags = 0;
ASSERT(XFS_IFORK_Q(ip) == 0); ASSERT(XFS_IFORK_Q(ip) == 0);
...@@ -1147,19 +1148,20 @@ xfs_bmap_add_attrfork( ...@@ -1147,19 +1148,20 @@ xfs_bmap_add_attrfork(
if (rsvd) if (rsvd)
tp->t_flags |= XFS_TRANS_RESERVE; tp->t_flags |= XFS_TRANS_RESERVE;
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_addafork, blks, 0); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_addafork, blks, 0);
if (error) if (error) {
goto error0; xfs_trans_cancel(tp, 0);
return error;
}
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_ilock(ip, XFS_ILOCK_EXCL);
error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
XFS_QMOPT_RES_REGBLKS); XFS_QMOPT_RES_REGBLKS);
if (error) { if (error)
xfs_iunlock(ip, XFS_ILOCK_EXCL); goto trans_cancel;
xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); cancel_flags |= XFS_TRANS_ABORT;
return error;
}
if (XFS_IFORK_Q(ip)) if (XFS_IFORK_Q(ip))
goto error1; goto trans_cancel;
if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS) { if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS) {
/* /*
* For inodes coming from pre-6.2 filesystems. * For inodes coming from pre-6.2 filesystems.
...@@ -1169,7 +1171,7 @@ xfs_bmap_add_attrfork( ...@@ -1169,7 +1171,7 @@ xfs_bmap_add_attrfork(
} }
ASSERT(ip->i_d.di_anextents == 0); ASSERT(ip->i_d.di_anextents == 0);
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0);
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
switch (ip->i_d.di_format) { switch (ip->i_d.di_format) {
...@@ -1191,7 +1193,7 @@ xfs_bmap_add_attrfork( ...@@ -1191,7 +1193,7 @@ xfs_bmap_add_attrfork(
default: default:
ASSERT(0); ASSERT(0);
error = XFS_ERROR(EINVAL); error = XFS_ERROR(EINVAL);
goto error1; goto trans_cancel;
} }
ASSERT(ip->i_afp == NULL); ASSERT(ip->i_afp == NULL);
...@@ -1219,7 +1221,7 @@ xfs_bmap_add_attrfork( ...@@ -1219,7 +1221,7 @@ xfs_bmap_add_attrfork(
if (logflags) if (logflags)
xfs_trans_log_inode(tp, ip, logflags); xfs_trans_log_inode(tp, ip, logflags);
if (error) if (error)
goto error2; goto bmap_cancel;
if (!xfs_sb_version_hasattr(&mp->m_sb) || if (!xfs_sb_version_hasattr(&mp->m_sb) ||
(!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) {
__int64_t sbfields = 0; __int64_t sbfields = 0;
...@@ -1242,14 +1244,16 @@ xfs_bmap_add_attrfork( ...@@ -1242,14 +1244,16 @@ xfs_bmap_add_attrfork(
error = xfs_bmap_finish(&tp, &flist, &committed); error = xfs_bmap_finish(&tp, &flist, &committed);
if (error) if (error)
goto error2; goto bmap_cancel;
return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
error2: xfs_iunlock(ip, XFS_ILOCK_EXCL);
return error;
bmap_cancel:
xfs_bmap_cancel(&flist); xfs_bmap_cancel(&flist);
error1: trans_cancel:
xfs_trans_cancel(tp, cancel_flags);
xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_iunlock(ip, XFS_ILOCK_EXCL);
error0:
xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
return error; return error;
} }
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "xfs_fsops.h" #include "xfs_fsops.h"
#include "xfs_trace.h" #include "xfs_trace.h"
#include "xfs_icache.h" #include "xfs_icache.h"
#include "xfs_dinode.h"
#ifdef HAVE_PERCPU_SB #ifdef HAVE_PERCPU_SB
...@@ -718,8 +719,22 @@ xfs_mountfs( ...@@ -718,8 +719,22 @@ xfs_mountfs(
* Set the inode cluster size. * Set the inode cluster size.
* This may still be overridden by the file system * This may still be overridden by the file system
* block size if it is larger than the chosen cluster size. * block size if it is larger than the chosen cluster size.
*
* For v5 filesystems, scale the cluster size with the inode size to
* keep a constant ratio of inode per cluster buffer, but only if mkfs
* has set the inode alignment value appropriately for larger cluster
* sizes.
*/ */
mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE;
if (xfs_sb_version_hascrc(&mp->m_sb)) {
int new_size = mp->m_inode_cluster_size;
new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size))
mp->m_inode_cluster_size = new_size;
xfs_info(mp, "Using inode cluster size of %d bytes",
mp->m_inode_cluster_size);
}
/* /*
* Set inode alignment fields * Set inode alignment fields
......
...@@ -112,7 +112,7 @@ typedef struct xfs_mount { ...@@ -112,7 +112,7 @@ typedef struct xfs_mount {
__uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */
__uint8_t m_agno_log; /* log #ag's */ __uint8_t m_agno_log; /* log #ag's */
__uint8_t m_agino_log; /* #bits for agino in inum */ __uint8_t m_agino_log; /* #bits for agino in inum */
__uint16_t m_inode_cluster_size;/* min inode buf size */ uint m_inode_cluster_size;/* min inode buf size */
uint m_blockmask; /* sb_blocksize-1 */ uint m_blockmask; /* sb_blocksize-1 */
uint m_blockwsize; /* sb_blocksize in words */ uint m_blockwsize; /* sb_blocksize in words */
uint m_blockwmask; /* blockwsize-1 */ uint m_blockwmask; /* blockwsize-1 */
......
...@@ -111,12 +111,14 @@ xfs_trans_log_inode( ...@@ -111,12 +111,14 @@ xfs_trans_log_inode(
/* /*
* First time we log the inode in a transaction, bump the inode change * First time we log the inode in a transaction, bump the inode change
* counter if it is configured for this to occur. * counter if it is configured for this to occur. We don't use
* inode_inc_version() because there is no need for extra locking around
* i_version as we already hold the inode locked exclusively for
* metadata modification.
*/ */
if (!(ip->i_itemp->ili_item.li_desc->lid_flags & XFS_LID_DIRTY) && if (!(ip->i_itemp->ili_item.li_desc->lid_flags & XFS_LID_DIRTY) &&
IS_I_VERSION(VFS_I(ip))) { IS_I_VERSION(VFS_I(ip))) {
inode_inc_iversion(VFS_I(ip)); ip->i_d.di_changecount = ++VFS_I(ip)->i_version;
ip->i_d.di_changecount = VFS_I(ip)->i_version;
flags |= XFS_ILOG_CORE; flags |= XFS_ILOG_CORE;
} }
......
...@@ -385,8 +385,7 @@ xfs_calc_ifree_reservation( ...@@ -385,8 +385,7 @@ xfs_calc_ifree_reservation(
xfs_calc_inode_res(mp, 1) + xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) +
MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), max_t(uint, XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) +
XFS_INODE_CLUSTER_SIZE(mp)) +
xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(1, 0) +
xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) +
mp->m_in_maxlevels, 0) + mp->m_in_maxlevels, 0) +
......
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