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

+41 -19
+1 -1
fs/xfs/linux-2.6/xfs_buf.c
··· 770 770 bp->b_pages = NULL; 771 771 bp->b_addr = mem; 772 772 773 - rval = _xfs_buf_get_pages(bp, page_count, 0); 773 + rval = _xfs_buf_get_pages(bp, page_count, XBF_DONT_BLOCK); 774 774 if (rval) 775 775 return rval; 776 776
+5 -3
fs/xfs/xfs_attr.c
··· 2010 2010 dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); 2011 2011 blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); 2012 2012 error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, 2013 - blkcnt, XFS_BUF_LOCK, &bp); 2013 + blkcnt, 2014 + XFS_BUF_LOCK | XBF_DONT_BLOCK, 2015 + &bp); 2014 2016 if (error) 2015 2017 return(error); 2016 2018 ··· 2143 2141 dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), 2144 2142 blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); 2145 2143 2146 - bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, 2147 - blkcnt, XFS_BUF_LOCK); 2144 + bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, blkcnt, 2145 + XFS_BUF_LOCK | XBF_DONT_BLOCK); 2148 2146 ASSERT(bp); 2149 2147 ASSERT(!XFS_BUF_GETERROR(bp)); 2150 2148
+1 -1
fs/xfs/xfs_bmap.c
··· 6009 6009 */ 6010 6010 error = ENOMEM; 6011 6011 subnex = 16; 6012 - map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL); 6012 + map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL | KM_NOFS); 6013 6013 if (!map) 6014 6014 goto out_unlock_ilock; 6015 6015
+2 -2
fs/xfs/xfs_btree.c
··· 120 120 XFS_RANDOM_BTREE_CHECK_SBLOCK))) { 121 121 if (bp) 122 122 xfs_buftrace("SBTREE ERROR", bp); 123 - XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW, 124 - cur->bc_mp); 123 + XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", 124 + XFS_ERRLEVEL_LOW, cur->bc_mp, block); 125 125 return XFS_ERROR(EFSCORRUPTED); 126 126 } 127 127 return 0;
+3 -3
fs/xfs/xfs_da_btree.c
··· 2201 2201 xfs_da_state_t * 2202 2202 xfs_da_state_alloc(void) 2203 2203 { 2204 - return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP); 2204 + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); 2205 2205 } 2206 2206 2207 2207 /* ··· 2261 2261 int off; 2262 2262 2263 2263 if (nbuf == 1) 2264 - dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP); 2264 + dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); 2265 2265 else 2266 - dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP); 2266 + dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); 2267 2267 dabuf->dirty = 0; 2268 2268 #ifdef XFS_DABUF_DEBUG 2269 2269 dabuf->ra = ra;
+1 -1
fs/xfs/xfs_dir2.c
··· 256 256 !(args->op_flags & XFS_DA_OP_CILOOKUP)) 257 257 return EEXIST; 258 258 259 - args->value = kmem_alloc(len, KM_MAYFAIL); 259 + args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL); 260 260 if (!args->value) 261 261 return ENOMEM; 262 262
+14 -6
fs/xfs/xfs_fsops.c
··· 167 167 new = nb - mp->m_sb.sb_dblocks; 168 168 oagcount = mp->m_sb.sb_agcount; 169 169 if (nagcount > oagcount) { 170 + void *new_perag, *old_perag; 171 + 170 172 xfs_filestream_flush(mp); 173 + 174 + new_perag = kmem_zalloc(sizeof(xfs_perag_t) * nagcount, 175 + KM_MAYFAIL); 176 + if (!new_perag) 177 + return XFS_ERROR(ENOMEM); 178 + 171 179 down_write(&mp->m_peraglock); 172 - mp->m_perag = kmem_realloc(mp->m_perag, 173 - sizeof(xfs_perag_t) * nagcount, 174 - sizeof(xfs_perag_t) * oagcount, 175 - KM_SLEEP); 176 - memset(&mp->m_perag[oagcount], 0, 177 - (nagcount - oagcount) * sizeof(xfs_perag_t)); 180 + memcpy(new_perag, mp->m_perag, sizeof(xfs_perag_t) * oagcount); 181 + old_perag = mp->m_perag; 182 + mp->m_perag = new_perag; 183 + 178 184 mp->m_flags |= XFS_MOUNT_32BITINODES; 179 185 nagimax = xfs_initialize_perag(mp, nagcount); 180 186 up_write(&mp->m_peraglock); 187 + 188 + kmem_free(old_perag); 181 189 } 182 190 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS); 183 191 tp->t_flags |= XFS_TRANS_RESERVE;
+10
fs/xfs/xfs_inode.c
··· 343 343 return XFS_ERROR(EFSCORRUPTED); 344 344 } 345 345 346 + if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && 347 + !ip->i_mount->m_rtdev_targp)) { 348 + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, 349 + "corrupt dinode %Lu, has realtime flag set.", 350 + ip->i_ino); 351 + XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", 352 + XFS_ERRLEVEL_LOW, ip->i_mount, dip); 353 + return XFS_ERROR(EFSCORRUPTED); 354 + } 355 + 346 356 switch (ip->i_d.di_mode & S_IFMT) { 347 357 case S_IFIFO: 348 358 case S_IFCHR:
+1 -1
fs/xfs/xfs_log.c
··· 3180 3180 STATIC void 3181 3181 xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog) 3182 3182 { 3183 - ASSERT(spin_is_locked(&log->l_icloglock)); 3183 + assert_spin_locked(&log->l_icloglock); 3184 3184 3185 3185 if (iclog->ic_state == XLOG_STATE_ACTIVE) { 3186 3186 xlog_state_switch_iclogs(log, iclog, 0);
+3 -1
fs/xfs/xfs_vnodeops.c
··· 538 538 d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); 539 539 byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); 540 540 541 - bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0); 541 + bp = xfs_buf_read_flags(mp->m_ddev_targp, d, BTOBB(byte_cnt), 542 + XBF_LOCK | XBF_MAPPED | 543 + XBF_DONT_BLOCK); 542 544 error = XFS_BUF_GETERROR(bp); 543 545 if (error) { 544 546 xfs_ioerror_alert("xfs_readlink",