Subject: Context disk quotas
From: vitalyb <vitalyvb@ukr.net>
Date: Sun, 16 Mar 2008 15:57:40 +0200

Hello,

I have a problem setting up quotas inside of vservers.
Looks like kernel ignores XID while updating /aquota.* files or
quota tools aren't working correctly.

Tested with these setups:
1) Linux 2.6.22.19 + 2.6.22.18-vs2.2.0.6-grsec2.1.11-20080212
2) Linux 2.6.22.19 + 2.6.22.19-vs2.2.0.7

VServer config:

# CONFIG_VSERVER_LEGACY is not set
# CONFIG_VSERVER_LEGACYNET is not set
# CONFIG_VSERVER_REMAP_SADDR is not set
CONFIG_VSERVER_COWBL=y
# CONFIG_VSERVER_VTIME is not set
CONFIG_VSERVER_PROC_SECURE=y
CONFIG_VSERVER_HARDCPU=y
CONFIG_VSERVER_IDLETIME=y
# CONFIG_VSERVER_IDLELIMIT is not set
# CONFIG_TAGGING_NONE is not set
# CONFIG_TAGGING_UID16 is not set
# CONFIG_TAGGING_GID16 is not set
CONFIG_TAGGING_ID24=y
# CONFIG_TAGGING_INTERN is not set
# CONFIG_TAG_NFSD is not set
# CONFIG_PROPAGATE is not set
CONFIG_VSERVER_PRIVACY=y
CONFIG_VSERVER_CONTEXTS=768
CONFIG_VSERVER_WARN=y
# CONFIG_VSERVER_DEBUG is not set
CONFIG_VSERVER=y
CONFIG_VSERVER_SECURITY=y
CONFIG_VSERVER_NGNET=y

Test:
-------------------------------------------------------------------
# ./testfs.sh -l -t -D /dev/loop0 -M /mnt
Linux-VServer FS Test [V0.18] Copyright (C) 2005-2007 H.Poetzl
Linux 2.6.22.19-grsec-vs x86_64/0.30.214
VCI:  0002:0200 236 030007b1 (ID24)
---
testing ext2 filesystem ...
[000]. [001]. [002]. [999].
---
testing ext3 filesystem ...
[000]. [001]. [002]. [999].
---
testing xfs filesystem ...
[000]* (xfs format failed)
---
testing reiser filesystem ...
[000]* (reiserfs format failed)
---
testing jfs filesystem ...
[000]* (jfs format failed)
-------------------------------------------------------------------
# ./testfs.sh -t -D /dev/loop0 -M /mnt/tst/
Linux-VServer FS Test [V0.18] Copyright (C) 2005-2007 H.Poetzl
Linux 2.6.22.19-grsec-vs x86_64/0.30.214
VCI:  0002:0200 236 030007b1 (ID24)
---
testing ext2 filesystem ...
[000]. [001]. [002]. [999].
---
testing ext3 filesystem ...
[000]. [001]. [002]. [999].
---
testing xfs filesystem ...
[000]* (xfs format failed)
---
testing reiser filesystem ...
[000]* (reiserfs format failed)
---
testing jfs filesystem ...
[000]* (jfs format failed)
-------------------------------------------------------------------
# ./testme.sh
Linux-VServer Test [V0.17] Copyright (C) 2003-2006 H.Poetzl
chcontext is working.
chbind is working.
Linux 2.6.22.19-grsec-vs #3 SMP Sat Mar 15 22:46:19 EET 2008 x86_64
Ea 0.30.214 236/glibc (DSa) <v13,net,v21,v22,v23,netv2>
VCI: 0002:0200 236 030007b1 (TbsPHIW)
---
[000]# succeeded.
[001]# succeeded.
[011]# succeeded.
[031]# succeeded.
[101]# succeeded.
[102]# succeeded.
[201]# succeeded.
[202]# succeeded.
-------------------------------------------------------------------


Problem description:

files are tagged with chxid, context 1001
 > host# quota -V
 > Quota utilities version 3.14.
 > Compiled with EXT2_DIRECT
 > host# quotacheck /mnt
 > host# quotaon /mnt
 > host# repquota /mnt
 >
 > *** Report for user quotas on device /dev/mapper/storage-hosting
 > Block grace time: 7days; Inode grace time: 7days
 >                         Block limits                File limits
 > User            used    soft    hard  grace    used  soft  hard  grace
 > ----------------------------------------------------------------------
 > root      --  134224       0       0              5     0     0
 > #50331648 --   15956       0       0             70     0     0
 > #50341673 --      12       0       0              3     0     0
 > #50341706 --      12       0       0              3     0     0
 > #50341739 --      12       0       0              3     0     0
 > ....... etc,etc,etc

User ids are weird because of tagging, I believe, for example,
50331648 = 0x3000000 -> uid 0

Is this the way it supposed to be?


next, let's create some files

 > vs# dd if=/dev/zero bs=1M count=100 of=file1
 > vs# chown 10001 file
 > host# repquota /mnt
 > Block grace time: 7days; Inode grace time: 7days
 >                         Block limits                File limits
 > User            used    soft    hard  grace    used  soft  hard  grace
 > ----------------------------------------------------------------------
 > root      --  134224       0       0              5     0     0
 > #50331648 --   15956       0       0             70     0     0
 > #50341673 --      12       0       0              3     0     0
 > ...
 > #10001    --  102504       0       0              1     0     0
 > ...

using vroot device everything's the same and
 > vs# repquota -n /dev/hd
 > Block grace time: 7days; Inode grace time: 7days
 >                         Block limits                File limits
 > User            used    soft    hard  grace    used  soft  hard  grace
 > ----------------------------------------------------------------------
 > #0        --  134224       0       0              5     0     0
 > #50331648 --   15956       0       0             70     0     0
 > ...
 > #10001    --  102504       0       0              1     0     0
 > ...

next,
 > host# quotaoff /mnt
 > host# quotacheck /mnt
 > host# quotao /mnt
 > host# repquota /mnt
 > root      --  134220       0       0              4     0     0
 > #50331648 --   15960       0       0             71     0     0
 > ...
 > #50341649 --  102532       0       0              8     0     0
 > ...

Compiling quota without EXT2_DIRECT support makes quotacheck produce
real uids without xid part, but, again, quota does not account xid
values and calculate quotas per uid only.

So, what am I missing? Is there a way to make context quotas work
on a shared partition without sharing quota between same uids
on different vservers?

Thanks!

-- 
Regards,
Vitaly