xfs
[Top] [All Lists]

a deadlock at xfs_growfs

To: nathans@xxxxxxx
Subject: a deadlock at xfs_growfs
From: ASANO Masahiro <masano@xxxxxxxxxxxxxx>
Date: Wed, 25 Aug 2004 14:04:54 +0900 (JST)
Cc: linux-xfs@xxxxxxxxxxx
In-reply-to: <20040825053035.GB9823@frodo>
References: <20040825.125949.424242868.masano@xxxxxxxxxxxxxx> <20040825053035.GB9823@frodo>
Sender: linux-xfs-bounce@xxxxxxxxxxx
Hi Nathan,

From: Nathan Scott <nathans@xxxxxxx>
Subject: Re: force shutdown at xfs_growfs
Date: Wed, 25 Aug 2004 15:30:35 +1000

> Thank you; your fix looks simple & is clearly correct, I'll check
> it in shortly.

Thank you for your quick response.
But I have another problem report for xfs_growfs. :-p

Growing a filesystem in heavy dinode allocate/deallocate situation may
cause a deadlock.
It looks that (a)a process which hold m_peraglock as reading is
waiting for a pagebuf(AGI), and (b)another process which hold the
pagebuf(AGI) is waiting for down_read m_peraglock, while (c)xfs_growfs
is waiting for down_write m_peraglock.

The following is a kernel backtrace. Its kernel version was 2.4.25,
but I guess that the recent kernel also has the same problem. What do
you think of it?


(a) PID = 3879 (tar)
 c76efa7c  c01176f9  schedule+2b9 ()
[c76efabc] c0105ff2  __down+82 (c1f23594,c1f235c8,0)
[c76efae0] c010618c  __down_failed+8 ()
[c76efaf0] c0240bc0  [.text.lock.xfs_buf+8a]
[c76efaf0] c023ee04  pagebuf_lock+24 (c1f23594ds,2ee00400,0,cbf7cac0)
[c76efafc] c023e6e3  _pagebuf_find+1b3 (c97ca67c,177002,0,200)
[c76efb30] c023e7f7  pagebuf_get+77 (c97ca67c,177002,0,1)
[c76efb60] c0227df4  xfs_trans_read_buf+184 (c38a1400,cbc495b4,c97ca67c,177002)
[c76efb88] c0208c7e  xfs_ialloc_read_agi+8e (c38a1400,cbc495b4,6,c76efbf0)
[c76efbc8] c0207434  xfs_ialloc_ag_select+244 (cbc495b4,3007d7,0,81a4)
[c76efc04] c020802f  xfs_dialloc+b4f (cbc495b4,3007d7,0,81a4)
[c76efcb4] c020ee74  xfs_ialloc+64 (cbc495b4,c239cbc4,81a4,1)
[c76efcf8] c022928b  xfs_dir_ialloc+8b (c76efdc8,c239cbc4,81a4,1)
[c76efd5c] c022efe7  xfs_create+3b7 (c239cbe4,cb746824,c76efe88,c76efe14)
[c76efdfc] c0239821  linvfs_mknod+181 (cb312634,cb746824,81a4,0)
[c76eff08] c02398a7  linvfs_create+27 (cb312634,cb746824,81a4,c76ee000)
[c76eff1c] c014e62d  vfs_create+10d (cb312634,cb746824,1a4,c76eff8c)
[c76eff40] c014ed45  open_namei+645 (c6ba2000,80c2,1a4,c76eff84)
[c76eff70] c0140623  filp_open+43 (c6ba2000,80c1,1a4,c76ee000)
[c76effa8] c0140a23  sys_open+53 (8072190,80c1,1a4,80c1)
[c76effc0] c010761f  system_call+33 ()

(b) PID = 3946 (rm)
 c3d91d8c  c01176f9  schedule+2b9 ()
[c3d91dcc] c039082c  rwsem_down_failed_common+5c 
(c38a15d4,c3d91df0,fffeffff,c5c71e0c)
[c3d91de0] c0390679  rwsem_down_read_failed+29 (c38a1400,c38a1400)
[c3d91e04] c0208fb1  .text.lock.xfs_ialloc+d7 (?c6173d50,a4,a7)
[c3d91e14] c0208169  xfs_difree+129 ()
[c3d91e90] c021057e  xfs_ifree+5e (c008ef38,c81e2964,c3d91ee8,0)
[c3d91ec0] c022e8a6  xfs_inactive+276 (c81e2984,0,c2a78e1c,0)
[c3d91f08] c023dab1  vn_rele+b1 (c2a78e1c,c2a78e3c,c015a4b2,c2a78e3c)
[c3d91f20] c023c088  linvfs_clear_inode+18 (c2a78e3c,c2a78e3c,c015af78,c2a78e3c)
[c3d91f2c] c015a4b2  clear_inode+102 (c2a78e3c,c04c1300,c5229750,c6a26898)
[c3d91f38] c015af78  iput+b8 (c2a78e3c,0,0,c5229750)
[c3d91f54] c0158bd2  d_delete+a2 (c6a26898,c6a26898,c689a000,c6a26898)
[c3d91f68] c014faf5  vfs_unlink+185 (c5229750,c6a26898,c5c858ec,cbff9214)
[c3d91f84] c014fd69  sys_unlink+119 (805313b,2,bffffac0,8053128)
[c3d91fc0] c010761f  system_call+33 ()

(c) PID = 3947 (xfs_growfs)
 c33f9d90  c01176f9  schedule+2b9 ()
[c33f9dd0] c039082c  rwsem_down_failed_common+5c 
(c38a15d4,c33f9df4,ffffffff,c1225978)
[c33f9de4] c03906b9  rwsem_down_write_failed+29 (c272c704)
[c33f9e08] c0206a4c  .text.lock.xfs_fsops+6 (?0,c057d118,c1232cc4,44)
[c33f9e08] c0206306  xfs_growfs_data_private+7 ()
[c33f9eb0] c02064c0  xfs_growfs_data+50 (c38a1400,c33f9f14,c,c767278c)
[c33f9ec4] c02383c1  xfs_ioctl+261 (c1718c84,c7e31200,c3b88cb4,0)
[c33f9f74] c023706b  linvfs_ioctl+3b (c7e31200,c3b88cb4,400c586e,bffff8b0)
[c33f9f94] c0152b75  sys_ioctl+f5 (3,400c586e,bffff8b0,7e6000)
[c33f9fc0] c010761f  system_call+33 ()


<Prev in Thread] Current Thread [Next in Thread>