2004-01-19 14:50:53

by Jan Kara

[permalink] [raw]
Subject: [PATCH] Fix i_blocks bug in 2.6.1

Hi,

I'm sending you a patch which fixes a problem that i_blocks are not
updated for quota files (when quota turned on) in 2.6.1. The patch
also fixes possible unlock of not locked spin_lock. Please apply.

Honza

diff -ruX ../kerndiffexclude linux-2.6.0-test11-um/fs/dquot.c linux-2.6.0-test11-um-1-noqfix/fs/dquot.c
--- linux-2.6.0/fs/dquot.c Mon Dec 1 12:31:28 2003
+++ linux-2.6.0-1-noqfix/fs/dquot.c Fri Jan 16 10:10:25 2004
@@ -884,11 +884,9 @@
warntype[cnt] = NOWARN;

down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode)) {
- up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- return QUOTA_OK;
- }
spin_lock(&dq_data_lock);
+ if (IS_NOQUOTA(inode))
+ goto add_bytes;
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
if (inode->i_dquot[cnt] == NODQUOT)
continue;
@@ -900,6 +898,7 @@
continue;
dquot_incr_space(inode->i_dquot[cnt], number);
}
+add_bytes:
inode_add_bytes(inode, number);
ret = QUOTA_OK;
warn_put_all:
@@ -953,16 +952,15 @@
unsigned int cnt;

down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode)) {
- up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
- return;
- }
spin_lock(&dq_data_lock);
+ if (IS_NOQUOTA(inode))
+ goto sub_bytes;
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
if (inode->i_dquot[cnt] == NODQUOT)
continue;
dquot_decr_space(inode->i_dquot[cnt], number);
}
+sub_bytes:
inode_sub_bytes(inode, number);
spin_unlock(&dq_data_lock);
up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
@@ -1010,8 +1008,10 @@
warntype[cnt] = NOWARN;
}
down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
- if (IS_NOQUOTA(inode)) /* File without quota accounting? */
- goto warn_put_all;
+ if (IS_NOQUOTA(inode)) { /* File without quota accounting? */
+ up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
+ return QUOTA_OK;
+ }
/* First build the transfer_to list - here we can block on reading of dquots... */
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
switch (cnt) {