View Incident:
http://co-op.engr.sgi.com/BugWorks/code/bwxquery.cgi?search=Search&wlong=1&view_type=Bug&wi=803625
Submitter : ajag Submitter Domain : melbourne
Assigned Engineer : ananth Assigned Domain : engr
Assigned Group : xfs-linux Category : software
Customer Reported : F Priority : 2
Project : xfs-linux Status : open
Description :
The growfs QA test creates a 16Mb filesystem with one allocation group and
sucessively grows its size to 17, 33, 35 and 48 megabyte (3 ags) with four
calls to
xfs_growfs. The first growfs appears to succeed, however, subsequents calls fail
on a call to xfs_read_buf (line 336 xfs_fsops.c) while writing out the redundant
superblocks for the filesystem. The call sequence looks like:
xfs_growfs_data_private
xfs_read_buf (function)
xfs_buf_read (macro)
pagebuf_get (function call at line 747 page_buf.c)
_pagebuf_get_lockable_buffer (function) page_buf_locking.c
>>> _pagebuf_find_lockable_buffer (f) returns EBUSY at line 426
(note my line numbers may be off by a couple as I've stuffed a few printks
in...)
It appears that the pagebuf allocated in the first call to growfs is hanging
around
in the kernel not being correctly freed up - or at least there is some delay
which
is being hit because these growfs's are happening in quick succession.
When the xfs_read_buf call fails, xfs_growfs simply gives up trying to write out
the redundant superblocks, and (I think) this is what then triggers the ASSERT
in the third growfs below.
The following is a sequence which shows most of the calls, and in particular
where
pagebufs are being created for regions of the disk, the problem first appears
when a
region of the disk is touched twice (ie the superblock at 32768 basic blocks).
Finally, note that I haven't yet tried to reproduce these errors on a test8
kernel.
*** xfs_ioctl: cmd is 1074550894
*** copy from user... done
*** call xfs_growfs_data...
*** xfs_growfs_data
*** acquire lock... done
*** xfs_growfs_data_private:
old: agcount: 1; blocks: 4096
new: 1; nb_mod: 256; nagcount: 2
*** xfs_growfs_data_private: agno is 1, writing AGF at:
32769 basic blocks; length: 1
*** xfs_growfs_data_private: agno is 1, writing AGI at:
32770 basic blocks; length: 1
*** xfs_growfs_data_private: agno is 1, writing BNO btree at:
32776 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 1, writing CNT btree at:
32784 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 1, writing INO btree at:
32792 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 1, writing superblock at:
32768 basic blocks; length: 8
done
Start mounting filesystem: ide0(3,9)
Ending clean XFS mount for filesystem: ide0(3,9)
*** xfs_ioctl: cmd is 1074550894
*** copy from user... done
*** call xfs_growfs_data...
*** xfs_growfs_data
*** acquire lock... done
*** xfs_growfs_data_private:
old: agcount: 2; blocks: 4096
new: 2; nb_mod: 256; nagcount: 3
*** xfs_growfs_data_private: agno is 2, writing AGF at:
65537 basic blocks; length: 1
*** xfs_growfs_data_private: agno is 2, writing AGI at:
65538 basic blocks; length: 1
*** xfs_growfs_data_private: agno is 2, writing BNO btree at:
65544 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 2, writing CNT btree at:
65552 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 2, writing INO btree at:
65560 basic blocks; length: 8
*** xfs_growfs_data_private: agno is 1, writing superblock at:
32768 basic blocks; length: 8:
*** _pagebuf_find_lockable_buffer: letting go of the buffer...
[ Returns EBUSY at line 426 in page_buf_locking.c ]
*** _pagebuf_get_lockable_buffer returning status: -16
[ Return at line 454 in page_buf_locking.c ]
*** pagebuf_get: Error: _pagebuf_get_lockable_buffer failed
[ Returns at 757 ]
cmn_err level 4 Filesystem "ide0(3,9)": error 5 reading secondary
superblock for ag 1
done
Start mounting filesystem: ide0(3,9)
Ending clean XFS mount for filesystem: ide0(3,9)
*** xfs_ioctl: cmd is 1074550894
*** copy from user... done
*** call xfs_growfs_data...
*** xfs_growfs_data
*** acquire lock... done
*** xfs_growfs_data_private:
old: agcount: 3; blocks: 4096
new: 2; nb_mod: 768; nagcount: 3
XFS assertion failed: agno < mp->m_sb.sb_agcount - 1 ||
INT_GET(agi->agi_length, ARCH_CONVERT) == mp->m_sb.sb_agblocks,
file: xfs_fsops.c, line: 336
kernel BUG at xfs_debug.c:45!
Entering kdb (current=0xc5e68000, pid 3298) Panic: invalid operand
due to panic @ 0xc01c7409
eax = 0x0000001e ebx = 0x00000000 ecx = 0xc030a8cc edx = 0x00000000
esi = 0xc534f400 edi = 0xc64a7000 esp = 0xc5e69b38 eip = 0xc01c7409
ebp = 0xc5e69b44 ss = 0x00000018 cs = 0x00000010 eflags = 0x00010246
ds = 0x00000018 es = 0x00000018 origeax = 0xffffffff ®s = 0xc5e69b04
kdb>
|