X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fquota_v2.c;h=679d31aca091c26ce257872dff145d3d7c418ae9;hb=8924cb29b44d7e7bc69a58f6d196470a5bcd9385;hp=e5098413a1b43e917a90cf5505854b8b5adfd80b;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/fs/quota_v2.c b/fs/quota_v2.c index e5098413a..679d31aca 100644 --- a/fs/quota_v2.c +++ b/fs/quota_v2.c @@ -135,7 +135,7 @@ static void mem2diskdqb(struct v2_disk_dqblk *d, struct mem_dqblk *m, qid_t id) static dqbuf_t getdqbuf(void) { - dqbuf_t buf = kmalloc(V2_DQBLKSIZE, GFP_KERNEL); + dqbuf_t buf = kmalloc(V2_DQBLKSIZE, GFP_NOFS); if (!buf) printk(KERN_WARNING "VFS: Not enough memory for quota buffers.\n"); return buf; @@ -420,7 +420,7 @@ static int v2_write_dquot(struct dquot *dquot) mm_segment_t fs; loff_t offset; ssize_t ret; - struct v2_disk_dqblk ddquot; + struct v2_disk_dqblk ddquot, empty; /* dq_off is guarded by dqio_sem */ if (!dquot->dq_off) @@ -432,6 +432,12 @@ static int v2_write_dquot(struct dquot *dquot) offset = dquot->dq_off; spin_lock(&dq_data_lock); mem2diskdqb(&ddquot, &dquot->dq_dqb, dquot->dq_id); + /* Argh... We may need to write structure full of zeroes but that would be + * treated as an empty place by the rest of the code. Format change would + * be definitely cleaner but the problems probably are not worth it */ + memset(&empty, 0, sizeof(struct v2_disk_dqblk)); + if (!memcmp(&empty, &ddquot, sizeof(struct v2_disk_dqblk))) + ddquot.dqb_itime = cpu_to_le64(1); spin_unlock(&dq_data_lock); fs = get_fs(); set_fs(KERNEL_DS); @@ -622,7 +628,7 @@ static int v2_read_dquot(struct dquot *dquot) struct file *filp; mm_segment_t fs; loff_t offset; - struct v2_disk_dqblk ddquot; + struct v2_disk_dqblk ddquot, empty; int ret = 0; filp = sb_dqopt(dquot->dq_sb)->files[type]; @@ -652,8 +658,14 @@ static int v2_read_dquot(struct dquot *dquot) printk(KERN_ERR "VFS: Error while reading quota structure for id %u.\n", dquot->dq_id); memset(&ddquot, 0, sizeof(struct v2_disk_dqblk)); } - else + else { ret = 0; + /* We need to escape back all-zero structure */ + memset(&empty, 0, sizeof(struct v2_disk_dqblk)); + empty.dqb_itime = cpu_to_le64(1); + if (!memcmp(&empty, &ddquot, sizeof(struct v2_disk_dqblk))) + ddquot.dqb_itime = 0; + } set_fs(fs); disk2memdqb(&dquot->dq_dqb, &ddquot); if (!dquot->dq_dqb.dqb_bhardlimit &&