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;
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)
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);
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];
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 &&