Re: [PATCH] xfs: don't fill statvfs with project quota for a directory if it was not enabled.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/05/2012 01:16 PM, Jeff Liu wrote:

> Hi Chandra, 
> On 04/05/2012 12:48 AM, Chandra Seetharaman wrote:
> 
>> I tried the steps in latest xfs tree and on mainline 3.3.0. Unable to
>> reproduce the problem.
>>
>> Jeff, how big was the FS and how full was it ?


It is irrelevant to the FS space status, looks this is an old issue since I can reproduce it on kernel-2.6.39 too:

Apr  5 13:50:36 pibroch kernel: [  144.667978] XFS: Assertion failed: XFS_IS_QUOTA_RUNNING(mp), file: fs/xfs/quota/xfs_dquot.c, line: 819
Apr  5 13:50:36 pibroch kernel: [  144.668119] ------------[ cut here ]------------
Apr  5 13:50:36 pibroch kernel: [  144.668208] kernel BUG at fs/xfs/linux-2.6/xfs_message.c:119!
Apr  5 13:50:37 pibroch kernel: [  144.668298] invalid opcode: 0000 [#1] SMP
Apr  5 13:50:37 pibroch kernel: [  144.668383] last sysfs file: /sys/devices/virtual/block/loop0/queue/rotational
Apr  5 13:50:37 pibroch kernel: [  144.668492] Modules linked in: xfs cryptd ...
Apr  5 13:50:37 pibroch kernel: [  144.670132]
Apr  5 13:50:37 pibroch kernel: [  144.670164] Pid: 2711, comm: du Not tainted 2.6.39 #1 LENOVO 7661D43/7661D43
Apr  5 13:50:37 pibroch kernel: [  144.670293] EIP: 0060:[<fa8b9b57>] EFLAGS: 00010246 CPU: 0
Apr  5 13:50:37 pibroch kernel: [  144.670444] EIP is at assfail+0x47/0x60 [xfs]
Apr  5 13:50:37 pibroch kernel: [  144.670512] EAX: 00000070 EBX: f29a6800 ECX: f1a65960 EDX: 00000000
Apr  5 13:50:37 pibroch kernel: [  144.670605] ESI: 00000000 EDI: ffffffff EBP: f233de80 ESP: f233de6c
Apr  5 13:50:37 pibroch kernel: [  144.670701]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Apr  5 13:50:37 pibroch kernel: [  144.670787] Process du (pid: 2711, ti=f233c000 task=f1a65960 task.ti=f233c000)
Apr  5 13:50:37 pibroch kernel: [  144.670894] Stack:
Apr  5 13:50:37 pibroch kernel: [  144.670929]  00000000 fa8da474 fa8dcc2e fa8dcad4 00000333 f233dec8 fa7d677f f233df58
Apr  5 13:50:37 pibroch kernel: [  144.671100]  f233dec8 c1431e4b 00000246 00000000 00000002 00000000 00000000 fa8b9d81
Apr  5 13:50:37 pibroch kernel: [  144.671271]  00000001 00000246 00000000 00000246 f233df58 f233df58 ffffffff f233dee4
Apr  5 13:50:37 pibroch kernel: [  144.671443] Call Trace:
Apr  5 13:50:37 pibroch kernel: [  144.671542]  [<fa7d677f>] xfs_qm_dqget+0x4f/0xa20 [xfs]
Apr  5 13:50:37 pibroch kernel: [  144.671632]  [<c1431e4b>] ? do_raw_spin_lock+0x5b/0x230
Apr  5 13:50:37 pibroch kernel: [  144.671777]  [<fa8b9d81>] ? xfs_fs_statfs+0x91/0x2d0 [xfs]
Apr  5 13:50:37 pibroch kernel: [  144.671915]  [<fa7de68e>] xfs_qm_statvfs+0x4e/0xb0 [xfs]
Apr  5 13:50:37 pibroch kernel: [  144.672003]  [<c196f66c>] ? _raw_spin_unlock+0x4c/0x60
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<fa8b9f5a>] xfs_fs_statfs+0x26a/0x2d0 [xfs]
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<c12b6a1b>] statfs_by_dentry+0x8b/0xf0
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<c12b6aa4>] vfs_statfs+0x24/0x140
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<c12b6cbc>] fd_statfs+0x5c/0xa0
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<c12b6e9a>] sys_fstatfs64+0x2a/0x90
Apr  5 13:50:37 pibroch kernel: [  144.672020]  [<c19703a4>] syscall_call+0x7/0xb
Apr  5 13:50:37 pibroch kernel: [  144.672020] Code: 10 89 54 24 0c 89 44 24 08 c7 44 24 04 74 a4 8d fa c7 04 24 00 00 00 00 ...
Apr  5 13:50:37 pibroch kernel: [  144.672020] EIP: [<fa8b9b57>] assfail+0x47/0x60 [xfs] SS:ESP 0068:f233de6c
Apr  5 13:50:37 pibroch kernel: [  144.801094] ---[ end trace ae19ce1ca9446f05 ]---

At xfs_ioctl_setattr(), xfs_set_diflags() enabled the XFS_DIFLAG_PROJINHERIT flag of an inode if the given mask has FSX_XFLAGS no matter "PQUOTA is RUNNING or ON".
if (mask & FSX_XFLAGS) {
        xfs_set_diflags(ip, fa->fsx_xflags);
        xfs_diflags_to_linux(ip);
}

In this case, the following condition became always true at xfs_fs_statfs():
if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
     ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
                       (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
     xfs_qm_statvfs(ip, statp);

Hence xfs_qm_statvfs()->xfs_qm_dqget()->ASSERT(XFS_IS_QUOTA_RUNNING(mp)) will failed, that's why I proposed to check
if XFS_IS_QUOTA_RUNNING(mp) or not before doing it.

Thanks,
-Jeff

> 
> Sorry, I have missed one major step to reproduce this issue previously.
> Could you try to create a file under the project directory before setting it up?
> 
> Steps:
> 1. echo "1:/xfs" > /etc/projects; echo "project1:1" > /etc/projid
> 2. echo "test" > /xfs/testme
> 3. xfs_quota -x -c 'project -s project1' /xfs
> 4. du -sh /xfs
> 
> I have posted a test to xfstest at below link, it can help reproducing this issue.
> http://www.spinics.net/lists/xfs/msg10744.html
> 
> Thanks,
> -Jeff
> 
>>
>> Christoph, BTW, 3.3.0 does not have my changes. Ben pushed it for
>> 3.4-rc1
>>
>> Here is my results with 3.3.0
>> -------------------
>> -bash-4.1$ uname -r
>> 3.3.0 
>> bash-4.1$  mount | grep xfs
>> /dev/sdb1 on /xfs type xfs (rw)
>> bash-4.1$ cat /etc/projects
>> 1:/xfs
>> bash-4.1$ cat /etc/projid
>> project1:1
>> bash-4.1$ sudo xfs_quota -x -c 'project -s project1' /xfs
>> [sudo] password for chandra: 
>> Setting up project project1 (path /xfs)...
>> Processed 1 (/etc/projects and cmdline) paths for project project1 with
>> recursion depth infinite (-1).
>> bash-4.1$ du -sh /xfs
>> 0       /xfs
>> bash-4.1$ exit
>> ------------------
>>
>> Chandra
>>
>> On Mon, 2012-04-02 at 12:39 -0400, Christoph Hellwig wrote:
>>> On Sun, Apr 01, 2012 at 12:55:55PM +0800, Jeff Liu wrote:
>>>> Hello,
>>>>
>>>> I can trigger a BUG() at fs/xfs/xfs_dquot.c on vanilla kernel 3.3.0 by the following steps:
>>>>
>>>> 1. mount a XFS partition without 'pquota' option.
>>>>    /dev/sda7 on /xfs type xfs (rw)
>>>>
>>>> 2. setup project1 on it.
>>>>    $ cat /etc/projects 
>>>>    1:/xfs
>>>>    $ cat /etc/projid
>>>>    project1:1
>>>>    $ sudo xfs_quota -x -c 'project -s project1' /xfs
>>>>
>>>> 3. du -sh /xfs
>>>
>>> Can you wire this up as a test case for xfstests?
>>>
>>>> +		    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
>>>> +		     (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD)) {
>>>
>>> This check is supposed to return false.  I guess Chandras separate
>>> project quota inode preparations somehow broke it.
>>>
>>> Chandra, can you look into this issue?
>>>
>>
>>
> 
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs


_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux