quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units
authorJan Kara <jack@suse.cz>
Thu, 9 Oct 2014 14:03:13 +0000 (16:03 +0200)
committerJan Kara <jack@suse.cz>
Wed, 28 Jan 2015 08:01:40 +0000 (09:01 +0100)
commit14bf61ffe6ac54afcd1e888a4407fe16054483db
treeb5af94fc8771e82735064a82a7df4ec4de66744e
parentb07ef35244424cbeda9844198607c7077099c82c
quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units

Currently ->get_dqblk() and ->set_dqblk() use struct fs_disk_quota which
tracks space limits and usage in 512-byte blocks. However VFS quotas
track usage in bytes (as some filesystems require that) and we need to
somehow pass this information. Upto now it wasn't a problem because we
didn't do any unit conversion (thus VFS quota routines happily stuck
number of bytes into d_bcount field of struct fd_disk_quota). Only if
you tried to use Q_XGETQUOTA or Q_XSETQLIM for VFS quotas (or Q_GETQUOTA
/ Q_SETQUOTA for XFS quotas), you got bogus results. Hardly anyone
tried this but reportedly some Samba users hit the problem in practice.
So when we want interfaces compatible we need to fix this.

We bite the bullet and define another quota structure used for passing
information from/to ->get_dqblk()/->set_dqblk. It's somewhat sad we have
to have more conversion routines in fs/quota/quota.c and another copying
of quota structure slows down getting of quota information by about 2%
but it seems cleaner than overloading e.g. units of d_bcount to bytes.

CC: stable@vger.kernel.org
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/gfs2/quota.c
fs/quota/dquot.c
fs/quota/quota.c
fs/xfs/xfs_qm.h
fs/xfs/xfs_qm_syscalls.c
fs/xfs/xfs_quotaops.c
include/linux/quota.h
include/linux/quotaops.h