Skip to contentSkip to conversation

2.5.54 - quota support

DISCUSSION Lukas Hejtmanek 4 participants 11 messages Jan 6, 2003 – Jan 12, 2003

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

Hello,

Is quota support currently broken?

Under 2.5.54 I got:

# quotaon /
using //aquota.user on /dev/hda1: No such device

/dev/hda1 is ext3 and aquota.user exists on it.

My config is:
CONFIG_QUOTA=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y

Signature · 1 line
Lukáš Hejtmánek
#1 lore raw
Quoted 9 lines · Lukas Hejtmanek

Hello,

Is quota support currently broken?

Under 2.5.54 I got:

# quotaon /
using //aquota.user on /dev/hda1: No such device
Quoted 8 lines

/dev/hda1 is ext3 and aquota.user exists on it.

My config is:
CONFIG_QUOTA=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y

It works for me.

grab-n-build quota-3.08 from http://sourceforge.net/projects/linuxquota

# mke2fs -j /dev/sde5
# mount /dev/sde5 /mnt/sde5 -o quota
# quotacheck -F vfsv0 /dev/sde5
# quotaon /dev/sde5
# cd /mnt/sde5
# tar xfz ~/linux-2.4.19.tar.gz
# repquota /mnt/sde5

*** Report for user quotas on device /dev/sde5
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------

root      --   32828       0       0              3     0     0       
akpm      --  162104       0       0          11370     0     0
#2 lore raw
Quoted 1 line · Andrew Morton

grab-n-build quota-3.08 from http://sourceforge.net/projects/linuxquota

$ dpkg -l quota
ii  quota          3.08-1
Quoted 1 line
# quotacheck -F vfsv0 /dev/sde5

this one works ok. quotacheck -m -F vfsv0 / seems to be working

Quoted 1 line
# quotaon /dev/sde5

quotaon / freezes process if system is up in normal mode. More over any process cannot read nor write to disk after that. sysrq-p shows cpu in idle only.

when init=/bin/sh then it reports no such device.

under 2.5.53 and 2.4.20 quotaon works ok. Under 2.5.53 quotaoff / reports some error - no such device or bad ioctl I cannot remember exactly but process does not freeze.

mounts:
/dev/hda1 on / type ext3 (rw,usrquota) proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/hda3 on /home type ext3 (rw) /dev/hda4 on /opt type xfs (rw,osyncisosync) /dev/hdc2 on /opt/tmp type xfs (rw,osyncisosync) /opt/run/usr on /usr type bind (rw,bind) none on /dev/shm type tmpfs (rw) automount(pid266) on /var/autofs/misc type autofs (rw,fd=5,pgrp=266,minproto=2,maxproto=4) automount(pid271) on /var/autofs/net type autofs (rw,fd=5,pgrp=271,minproto=2,maxproto=4)

Here's my whole config:

CONFIG_X86=y
CONFIG_MMU=y
CONFIG_SWAP=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_OBSOLETE_MODPARM=y
CONFIG_KMOD=y
CONFIG_X86_PC=y
CONFIG_MK7=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_TSC=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_USE_3DNOW=y
CONFIG_PREEMPT=y
CONFIG_EDD=y
CONFIG_NOHIGHMEM=y
CONFIG_MTRR=y
CONFIG_HAVE_DEC_LOCK=y
CONFIG_PCI=y
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_NAMES=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
CONFIG_BLK_DEV_LOOP=m
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDESCSI=y
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_BLK_DEV_GENERIC=y
CONFIG_IDEPCI_SHARE_IRQ=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_BLK_DEV_OFFBOARD=y
CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_BLK_DEV_IDEDMA=y
CONFIG_IDEDMA_PCI_WIP=y
CONFIG_BLK_DEV_ADMA=y
CONFIG_BLK_DEV_PDC202XX_OLD=y
CONFIG_BLK_DEV_VIA82CXXX=y
CONFIG_IDEDMA_AUTO=y
CONFIG_BLK_DEV_PDC202XX=y
CONFIG_BLK_DEV_IDE_MODES=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_NETFILTER=y
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_SYN_COOKIES=y
CONFIG_IP_NF_CONNTRACK=y
CONFIG_IP_NF_FTP=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_NAT_FTP=y
CONFIG_IPV6=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IPV6_SCTP__=y
CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y
CONFIG_NET_PCI=y
CONFIG_E100=y
CONFIG_8139TOO=y
CONFIG_INPUT=y
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_CORE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256
CONFIG_RTC=y
CONFIG_AGP=y
CONFIG_AGP_VIA=y
CONFIG_QUOTA=y
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_AUTOFS4_FS=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_JBD=y
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_TMPFS=y
CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_PROC_FS=y
CONFIG_DEVPTS_FS=y
CONFIG_EXT2_FS=y
CONFIG_UDF_FS=y
CONFIG_XFS_FS=y
CONFIG_SMB_FS=y
CONFIG_SMB_NLS_DEFAULT=y
CONFIG_SMB_NLS_REMOTE="cp850"
CONFIG_FS_MBCACHE=y
CONFIG_MSDOS_PARTITION=y
CONFIG_SMB_NLS=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_UTF8=m
CONFIG_VIDEO_SELECT=y
CONFIG_VGA_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_SOUND=y
CONFIG_SOUND_PRIME=y
CONFIG_SOUND_EMU10K1=y
CONFIG_MIDI_EMU10K1=y
CONFIG_USB=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_STORAGE=y
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_KALLSYMS=y
CONFIG_CRYPTO=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRC32=y
CONFIG_X86_BIOS_REBOOT=y

Signature · 1 line
Lukáš Hejtmánek
reviewer
#3 lore raw

Hello,

Quoted 6 lines · Andrew Morton
Quoted 1 line

grab-n-build quota-3.08 from http://sourceforge.net/projects/linuxquota

$ dpkg -l quota
ii  quota          3.08-1
Quoted 8 lines
Quoted 1 line
# quotacheck -F vfsv0 /dev/sde5

this one works ok. quotacheck -m -F vfsv0 / seems to be working

Quoted 1 line
# quotaon /dev/sde5

quotaon / freezes process if system is up in normal mode. More over any process cannot read nor write to disk after that. sysrq-p shows cpu in idle only.

I seems like quotaon (or better quotactl()) waits on some lock
forever... I'll try to reproduce it but in the mean time can you print list of processes, write down a few addresses from the top of the stack of quotaon and try to match it in the system.map to function in which is process stuck?

Quoted 1 line

when init=/bin/sh then it reports no such device.

Hmm.. This might be helpful. Thanks.

Quoted 3 lines

under 2.5.53 and 2.4.20 quotaon works ok. Under 2.5.53 quotaoff / reports some error - no such device or bad ioctl I cannot remember exactly but process does not freeze.

Thanks for report
Honza

#4 lore raw
Quoted 5 lines · Jan Kara

I seems like quotaon (or better quotactl()) waits on some lock
forever... I'll try to reproduce it but in the mean time can you print list of processes, write down a few addresses from the top of the stack of quotaon and try to match it in the system.map to function in which is process stuck?

according to strace quotaon freezes at
quotactl(0xff800002, "/dev/hda1", 2

call trace is: (sysrq-t)
vfs_permission
__rwsem_do_wake
rwsem_down_read_failed
module_put
dqinit_needed
vfs_quota_off
resolve_dev
d_free
deny_write_access
check_quotactl_valid
d_free
scheduling_functions_start_here
do_quotactl
system_call

Btw, freeze on quotaon is not regular. After some time that system is up, quotaon reports only no such device and terminates.

so looks like
1) freeze on quotactl
2) reports no such device

in both cases not working.

Signature · 1 line
Lukáš Hejtmánek
reviewer
#5 lore raw
Quoted 27 lines · Jan Kara
Quoted 5 lines

I seems like quotaon (or better quotactl()) waits on some lock
forever... I'll try to reproduce it but in the mean time can you print list of processes, write down a few addresses from the top of the stack of quotaon and try to match it in the system.map to function in which is process stuck?

according to strace quotaon freezes at
quotactl(0xff800002, "/dev/hda1", 2

call trace is: (sysrq-t)
vfs_permission
__rwsem_do_wake
rwsem_down_read_failed
module_put
dqinit_needed
vfs_quota_off
resolve_dev
d_free
deny_write_access
check_quotactl_valid
d_free
scheduling_functions_start_here
do_quotactl
system_call

Quoted 8 lines

Btw, freeze on quotaon is not regular. After some time that system is up, quotaon reports only no such device and terminates.

so looks like
1) freeze on quotactl
2) reports no such device

in both cases not working.

Reporting 'No such device' was actually bug which was introduced some
time ago but nobody probably noticed it... It was introduce when quota code was converted from device numbers to 'bdev' structures.
I also fixed one bug in quotaon() call however I'm not sure wheter it
could cause the freeze. Anyway patch is attached, try it and tell me about the changes.

Honza

Signature · 2 lines
Jan Kara <[email protected]>
SuSE CR Labs
fs/dquot.c +7 -4
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54/fs/dquot.c linux-2.5.54-1-lockfix/fs/dquot.c
@@ -1157,6 +1157,7 @@
 	struct quota_info *dqopt = sb_dqopt(sb);
 	struct quota_format_type *fmt = find_quota_format(format_id);
 	int error;
+	unsigned int oldflags;
 
 	if (!fmt)
 		return -ESRCH;
@@ -1181,10 +1182,11 @@
 		error = -EBUSY;
 		goto out_lock;
 	}
+	oldflags = inode->i_flags;
 	dqopt->files[type] = f;
 	error = -EINVAL;
 	if (!fmt->qf_ops->check_quota_file(sb, type))
-		goto out_lock;
+		goto out_file_init;
 	/* We don't want quota on quota files */
 	dquot_drop_nolock(inode);
 	inode->i_flags |= S_NOQUOTA;
@@ -1194,7 +1196,7 @@
 	down(&dqopt->dqio_sem);
 	if ((error = dqopt->ops[type]->read_file_info(sb, type)) < 0) {
 		up(&dqopt->dqio_sem);
-		goto out_lock;
+		goto out_file_init;
 	}
 	up(&dqopt->dqio_sem);
 	set_enable_flags(dqopt, type);
@@ -1204,9 +1206,10 @@
 	up_write(&dqopt->dqoff_sem);
 	return 0;
 
-out_lock:
-	inode->i_flags &= ~S_NOQUOTA;
+out_file_init:
+	inode->i_flags = oldflags;
 	dqopt->files[type] = NULL;
+out_lock:
 	up_write(&dqopt->dqoff_sem);
 out_f:
 	filp_close(f, NULL);
fs/quota.c +5 -1
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54/fs/quota.c linux-2.5.54-1-lockfix/fs/quota.c
@@ -114,7 +114,11 @@
 	ret = user_path_walk(path, &nd);
 	if (ret)
 		goto out;
-
+	ret = bd_acquire(nd.dentry->d_inode);
+	if (ret) {
+		path_release(&nd);
+		goto out;
+	}
 	bdev = nd.dentry->d_inode->i_bdev;
 	mode = nd.dentry->d_inode->i_mode;
 	path_release(&nd);
#6 lore raw
Quoted 6 lines · Jan Kara

Reporting 'No such device' was actually bug which was introduced some
time ago but nobody probably noticed it... It was introduce when quota code was converted from device numbers to 'bdev' structures.
I also fixed one bug in quotaon() call however I'm not sure wheter it
could cause the freeze. Anyway patch is attached, try it and tell me about the changes.

Hmm, quotaon / with init=/bin/sh seems to work OK, quota accounting is made and repquota displays normal info.

However with normal startup quotaon / still freezes :-(

Btw, does anyone know why mount is failing for so long time while using with automount? Process mount is in uninterruptible sleep for more than 10 secs until reports no disc in cdrom. (the same for my usb camera when autofs try to mount it while it is not connected).

Signature · 1 line
Lukáš Hejtmánek
#7 lore raw

In article <[email protected]>,

Quoted 8 lines · Lukas Hejtmanek
Quoted 6 lines · Jan Kara

Reporting 'No such device' was actually bug which was introduced some
time ago but nobody probably noticed it... It was introduce when quota code was converted from device numbers to 'bdev' structures.
I also fixed one bug in quotaon() call however I'm not sure wheter it
could cause the freeze. Anyway patch is attached, try it and tell me about the changes.

Quoted 4 lines

Hmm, quotaon / with init=/bin/sh seems to work OK, quota accounting is made and repquota displays normal info.

However with normal startup quotaon / still freezes :-(

ulimit ?

Mike.

Signature · 2 lines
They all laughed when I said I wanted to build a joke-telling machine.
Well, I showed them! Nobody's laughing *now*! -- [email protected]
reviewer
#8 lore raw
In reply to Lukas Hejtmanek
Quoted 10 lines · Jan Kara
Quoted 6 lines

Reporting 'No such device' was actually bug which was introduced some
time ago but nobody probably noticed it... It was introduce when quota code was converted from device numbers to 'bdev' structures.
I also fixed one bug in quotaon() call however I'm not sure wheter it
could cause the freeze. Anyway patch is attached, try it and tell me about the changes.

Hmm, quotaon / with init=/bin/sh seems to work OK, quota accounting is made and repquota displays normal info.

OK, so one bug fixed.

Quoted 1 line

However with normal startup quotaon / still freezes :-(

:( So I'll search for more bugs...

Quoted 4 lines

Btw, does anyone know why mount is failing for so long time while using with automount? Process mount is in uninterruptible sleep for more than 10 secs until reports no disc in cdrom. (the same for my usb camera when autofs try to mount it while it is not connected).

Honza

Signature · 2 lines
Jan Kara <[email protected]>
SuSE CR Labs
reviewer
#9 lore raw
In reply to Lukas Hejtmanek
Quoted 8 lines · Jan Kara
Quoted 6 lines

Reporting 'No such device' was actually bug which was introduced some
time ago but nobody probably noticed it... It was introduce when quota code was converted from device numbers to 'bdev' structures.
I also fixed one bug in quotaon() call however I'm not sure wheter it
could cause the freeze. Anyway patch is attached, try it and tell me about the changes.

Quoted 4 lines

Hmm, quotaon / with init=/bin/sh seems to work OK, quota accounting is made and repquota displays normal info.

However with normal startup quotaon / still freezes :-(

Ok. So I found the bug. Fix was a bit nontrivial (at one path we tried
to acquire one lock twice) but know it should work. The patch also contain fix in ext2 - at some time ext2_setattr was written and call of DQUOT_TRANSFER was missing so no quota was being transferred.
Please test whether the patch works for you.

Honza

PS: First patch is the one I already sent you.

Signature · 2 lines
Jan Kara <[email protected]>
SuSE CR Labs
fs/dquot.c +7 -4
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54/fs/dquot.c linux-2.5.54-1-lockfix/fs/dquot.c
@@ -1157,6 +1157,7 @@
 	struct quota_info *dqopt = sb_dqopt(sb);
 	struct quota_format_type *fmt = find_quota_format(format_id);
 	int error;
+	unsigned int oldflags;
 
 	if (!fmt)
 		return -ESRCH;
@@ -1181,10 +1182,11 @@
 		error = -EBUSY;
 		goto out_lock;
 	}
+	oldflags = inode->i_flags;
 	dqopt->files[type] = f;
 	error = -EINVAL;
 	if (!fmt->qf_ops->check_quota_file(sb, type))
-		goto out_lock;
+		goto out_file_init;
 	/* We don't want quota on quota files */
 	dquot_drop_nolock(inode);
 	inode->i_flags |= S_NOQUOTA;
@@ -1194,7 +1196,7 @@
 	down(&dqopt->dqio_sem);
 	if ((error = dqopt->ops[type]->read_file_info(sb, type)) < 0) {
 		up(&dqopt->dqio_sem);
-		goto out_lock;
+		goto out_file_init;
 	}
 	up(&dqopt->dqio_sem);
 	set_enable_flags(dqopt, type);
@@ -1204,9 +1206,10 @@
 	up_write(&dqopt->dqoff_sem);
 	return 0;
 
-out_lock:
-	inode->i_flags &= ~S_NOQUOTA;
+out_file_init:
+	inode->i_flags = oldflags;
 	dqopt->files[type] = NULL;
+out_lock:
 	up_write(&dqopt->dqoff_sem);
 out_f:
 	filp_close(f, NULL);
fs/quota.c +5 -1
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54/fs/quota.c linux-2.5.54-1-lockfix/fs/quota.c
@@ -114,7 +114,11 @@
 	ret = user_path_walk(path, &nd);
 	if (ret)
 		goto out;
-
+	ret = bd_acquire(nd.dentry->d_inode);
+	if (ret) {
+		path_release(&nd);
+		goto out;
+	}
 	bdev = nd.dentry->d_inode->i_bdev;
 	mode = nd.dentry->d_inode->i_mode;
 	path_release(&nd);
fs/dquot.c +47 -42

304 lines not on this page · raw message

fs/ext2/inode.c +6 -0
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54-1-lockfix/fs/ext2/inode.c linux-2.5.54-2-offsem/fs/ext2/inode.c
@@ -1238,6 +1238,12 @@
 	error = inode_change_ok(inode, iattr);
 	if (error)
 		return error;
+	if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
+	    (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
+		error = DQUOT_TRANSFER(inode, iattr) ? -EDQUOT : 0;
+		if (error)
+			return error;
+	}
 	inode_setattr(inode, iattr);
 	if (iattr->ia_valid & ATTR_MODE)
 		error = ext2_acl_chmod(inode);
fs/quota.c +3 -3
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54-1-lockfix/fs/quota.c linux-2.5.54-2-offsem/fs/quota.c
@@ -156,13 +156,13 @@
 		case Q_GETFMT: {
 			__u32 fmt;
 
-			down_read(&sb_dqopt(sb)->dqoff_sem);
+			down_read(&sb_dqopt(sb)->dqptr_sem);
 			if (!sb_has_quota_enabled(sb, type)) {
-				up_read(&sb_dqopt(sb)->dqoff_sem);
+				up_read(&sb_dqopt(sb)->dqptr_sem);
 				return -ESRCH;
 			}
 			fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id;
-			up_read(&sb_dqopt(sb)->dqoff_sem);
+			up_read(&sb_dqopt(sb)->dqptr_sem);
 			if (copy_to_user(addr, &fmt, sizeof(fmt)))
 				return -EFAULT;
 			return 0;
fs/super.c +2 -1
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54-1-lockfix/fs/super.c linux-2.5.54-2-offsem/fs/super.c
@@ -71,7 +71,8 @@
 		atomic_set(&s->s_active, 1);
 		sema_init(&s->s_vfs_rename_sem,1);
 		sema_init(&s->s_dquot.dqio_sem, 1);
-		init_rwsem(&s->s_dquot.dqoff_sem);
+		sema_init(&s->s_dquot.dqonoff_sem, 1);
+		init_rwsem(&s->s_dquot.dqptr_sem);
 		s->s_maxbytes = MAX_NON_LFS;
 		s->dq_op = sb_dquot_ops;
 		s->s_qcop = sb_quotactl_ops;
include/linux/quota.h +2 -1
diff -ruNX /home/jack/.kerndiffexclude linux-2.5.54-1-lockfix/include/linux/quota.h linux-2.5.54-2-offsem/include/linux/quota.h
@@ -280,7 +280,8 @@
 struct quota_info {
 	unsigned int flags;			/* Flags for diskquotas on this device */
 	struct semaphore dqio_sem;		/* lock device while I/O in progress */
-	struct rw_semaphore dqoff_sem;		/* serialize quota_off() and quota_on() on device and ops using quota_info struct, pointers from inode to dquots */
+	struct semaphore dqonoff_sem;		/* Serialize quotaon & quotaoff */
+	struct rw_semaphore dqptr_sem;		/* serialize ops using quota_info struct, pointers from inode to dquots */
 	struct file *files[MAXQUOTAS];		/* fp's to quotafiles */
 	struct mem_dqinfo info[MAXQUOTAS];	/* Information for each quota type */
 	struct quota_format_ops *ops[MAXQUOTAS];	/* Operations for each type */
#10 lore raw
Quoted 5 lines · Jan Kara

Ok. So I found the bug. Fix was a bit nontrivial (at one path we tried
to acquire one lock twice) but know it should work. The patch also contain fix in ext2 - at some time ext2_setattr was written and call of DQUOT_TRANSFER was missing so no quota was being transferred.
Please test whether the patch works for you.

Good job. This patch works for me (tested with kernel 2.5.55, successfully patched with no errors). Thanks a lot.

Signature · 1 line
Lukáš Hejtmánek