Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: fix spin_is_locked assert on uni-processor builds xfs: check for dinode realtime flag corruption use XFS_CORRUPTION_ERROR in xfs_btree_check_sblock xfs: switch to NOFS allocation under i_lock in xfs_attr_rmtval_get xfs: switch to NOFS allocation under i_lock in xfs_readlink_bmap xfs: switch to NOFS allocation under i_lock in xfs_attr_rmtval_set xfs: switch to NOFS allocation under i_lock in xfs_buf_associate_memory xfs: switch to NOFS allocation under i_lock in xfs_dir_cilookup_result xfs: switch to NOFS allocation under i_lock in xfs_da_buf_make xfs: switch to NOFS allocation under i_lock in xfs_da_state_alloc xfs: switch to NOFS allocation under i_lock in xfs_getbmap xfs: avoid memory allocation under m_peraglock in growfs code
This commit is contained in:
commit
78efd1ddd9
10 changed files with 41 additions and 19 deletions
|
@ -770,7 +770,7 @@ xfs_buf_associate_memory(
|
|||
bp->b_pages = NULL;
|
||||
bp->b_addr = mem;
|
||||
|
||||
rval = _xfs_buf_get_pages(bp, page_count, 0);
|
||||
rval = _xfs_buf_get_pages(bp, page_count, XBF_DONT_BLOCK);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
|
|
|
@ -2010,7 +2010,9 @@ xfs_attr_rmtval_get(xfs_da_args_t *args)
|
|||
dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock);
|
||||
blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount);
|
||||
error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno,
|
||||
blkcnt, XFS_BUF_LOCK, &bp);
|
||||
blkcnt,
|
||||
XFS_BUF_LOCK | XBF_DONT_BLOCK,
|
||||
&bp);
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
|
@ -2141,8 +2143,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
|
|||
dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock),
|
||||
blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount);
|
||||
|
||||
bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno,
|
||||
blkcnt, XFS_BUF_LOCK);
|
||||
bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, blkcnt,
|
||||
XFS_BUF_LOCK | XBF_DONT_BLOCK);
|
||||
ASSERT(bp);
|
||||
ASSERT(!XFS_BUF_GETERROR(bp));
|
||||
|
||||
|
|
|
@ -6009,7 +6009,7 @@ xfs_getbmap(
|
|||
*/
|
||||
error = ENOMEM;
|
||||
subnex = 16;
|
||||
map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL);
|
||||
map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL | KM_NOFS);
|
||||
if (!map)
|
||||
goto out_unlock_ilock;
|
||||
|
||||
|
|
|
@ -120,8 +120,8 @@ xfs_btree_check_sblock(
|
|||
XFS_RANDOM_BTREE_CHECK_SBLOCK))) {
|
||||
if (bp)
|
||||
xfs_buftrace("SBTREE ERROR", bp);
|
||||
XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW,
|
||||
cur->bc_mp);
|
||||
XFS_CORRUPTION_ERROR("xfs_btree_check_sblock",
|
||||
XFS_ERRLEVEL_LOW, cur->bc_mp, block);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -2201,7 +2201,7 @@ kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */
|
|||
xfs_da_state_t *
|
||||
xfs_da_state_alloc(void)
|
||||
{
|
||||
return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP);
|
||||
return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2261,9 +2261,9 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra)
|
|||
int off;
|
||||
|
||||
if (nbuf == 1)
|
||||
dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP);
|
||||
dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS);
|
||||
else
|
||||
dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP);
|
||||
dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS);
|
||||
dabuf->dirty = 0;
|
||||
#ifdef XFS_DABUF_DEBUG
|
||||
dabuf->ra = ra;
|
||||
|
|
|
@ -256,7 +256,7 @@ xfs_dir_cilookup_result(
|
|||
!(args->op_flags & XFS_DA_OP_CILOOKUP))
|
||||
return EEXIST;
|
||||
|
||||
args->value = kmem_alloc(len, KM_MAYFAIL);
|
||||
args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL);
|
||||
if (!args->value)
|
||||
return ENOMEM;
|
||||
|
||||
|
|
|
@ -167,17 +167,25 @@ xfs_growfs_data_private(
|
|||
new = nb - mp->m_sb.sb_dblocks;
|
||||
oagcount = mp->m_sb.sb_agcount;
|
||||
if (nagcount > oagcount) {
|
||||
void *new_perag, *old_perag;
|
||||
|
||||
xfs_filestream_flush(mp);
|
||||
|
||||
new_perag = kmem_zalloc(sizeof(xfs_perag_t) * nagcount,
|
||||
KM_MAYFAIL);
|
||||
if (!new_perag)
|
||||
return XFS_ERROR(ENOMEM);
|
||||
|
||||
down_write(&mp->m_peraglock);
|
||||
mp->m_perag = kmem_realloc(mp->m_perag,
|
||||
sizeof(xfs_perag_t) * nagcount,
|
||||
sizeof(xfs_perag_t) * oagcount,
|
||||
KM_SLEEP);
|
||||
memset(&mp->m_perag[oagcount], 0,
|
||||
(nagcount - oagcount) * sizeof(xfs_perag_t));
|
||||
memcpy(new_perag, mp->m_perag, sizeof(xfs_perag_t) * oagcount);
|
||||
old_perag = mp->m_perag;
|
||||
mp->m_perag = new_perag;
|
||||
|
||||
mp->m_flags |= XFS_MOUNT_32BITINODES;
|
||||
nagimax = xfs_initialize_perag(mp, nagcount);
|
||||
up_write(&mp->m_peraglock);
|
||||
|
||||
kmem_free(old_perag);
|
||||
}
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
|
||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||
|
|
|
@ -343,6 +343,16 @@ xfs_iformat(
|
|||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) &&
|
||||
!ip->i_mount->m_rtdev_targp)) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt dinode %Lu, has realtime flag set.",
|
||||
ip->i_ino);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(realtime)",
|
||||
XFS_ERRLEVEL_LOW, ip->i_mount, dip);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
switch (ip->i_d.di_mode & S_IFMT) {
|
||||
case S_IFIFO:
|
||||
case S_IFCHR:
|
||||
|
|
|
@ -3180,7 +3180,7 @@ try_again:
|
|||
STATIC void
|
||||
xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog)
|
||||
{
|
||||
ASSERT(spin_is_locked(&log->l_icloglock));
|
||||
assert_spin_locked(&log->l_icloglock);
|
||||
|
||||
if (iclog->ic_state == XLOG_STATE_ACTIVE) {
|
||||
xlog_state_switch_iclogs(log, iclog, 0);
|
||||
|
|
|
@ -538,7 +538,9 @@ xfs_readlink_bmap(
|
|||
d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock);
|
||||
byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount);
|
||||
|
||||
bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0);
|
||||
bp = xfs_buf_read_flags(mp->m_ddev_targp, d, BTOBB(byte_cnt),
|
||||
XBF_LOCK | XBF_MAPPED |
|
||||
XBF_DONT_BLOCK);
|
||||
error = XFS_BUF_GETERROR(bp);
|
||||
if (error) {
|
||||
xfs_ioerror_alert("xfs_readlink",
|
||||
|
|
Loading…
Reference in a new issue