quota: Split off quota tree handling into a separate file
Jan Kara
reviewerPATCH 1/1 quota: Split off quota tree handling into a separate file
There is going to be a new version of quota format having 64-bit quota limits and a new quota format for OCFS2. They are both going to use the same tree structure as VFSv0 quota format. So split out tree handling into a separate file and make size of leaf blocks and structures contained in them configurable so that the code can be shared.
Signed-off-by Jan Kara <[email protected]>
--- fs/Kconfig | 5 + fs/Makefile | 1 + fs/quota_tree.c | 642 +++++++++++++++++++++++++++++++++++++++++++ fs/quota_tree.h | 25 ++ fs/quota_v2.c | 594 ++++------------------------------------ fs/quotaio_v2.h | 33 +-- include/linux/dqblk_qtree.h | 49 ++++ include/linux/dqblk_v2.h | 19 +- 8 files changed, 787 insertions(+), 581 deletions(-) create mode 100644 fs/quota_tree.c create mode 100644 fs/quota_tree.h create mode 100644 include/linux/dqblk_qtree.h
fs/Kconfig +5 -0
@@ -569,6 +569,10 @@ config PRINT_QUOTA_WARNING Note that this behavior is currently deprecated and may go away in future. Please use notification via netlink socket instead. +# Generic support for tree structured quota files. Seleted when needed. +config QUOTA_TREE + tristate + config QFMT_V1 tristate "Old quota format support" depends on QUOTA
@@ -580,6 +584,7 @@ config QFMT_V1 config QFMT_V2 tristate "Quota format v2 support" depends on QUOTA + select QUOTA_TREE help This quota format allows using quotas with 32-bit UIDs/GIDs. If you need this functionality say Y here.
fs/Makefile +1 -0
@@ -53,6 +53,7 @@ obj-$(CONFIG_GENERIC_ACL) += generic_acl.o obj-$(CONFIG_QUOTA) += dquot.o obj-$(CONFIG_QFMT_V1) += quota_v1.o obj-$(CONFIG_QFMT_V2) += quota_v2.o +obj-$(CONFIG_QUOTA_TREE) += quota_tree.o obj-$(CONFIG_QUOTACTL) += quota.o obj-$(CONFIG_DNOTIFY) += dnotify.o
fs/quota_tree.c new file +642 -0
642 lines not on this page · raw message
fs/quota_tree.h new file +25 -0
@@ -0,0 +1,25 @@ +/* +* Definitions of structures for vfsv0 quota format +*/ + +#ifndef _LINUX_QUOTA_TREE_H +#define _LINUX_QUOTA_TREE_H + +#include <linux/types.h> +#include <linux/quota.h> + +/* +* Structure of header of block with quota structures. It is padded to 16 bytes so +* there will be space for exactly 21 quota-entries in a block +*/ +struct qt_disk_dqdbheader { +__le32 dqdh_next_free;/* Number of next block with free entry */ +__le32 dqdh_prev_free;/* Number of previous block with free entry */ +__le16 dqdh_entries;/* Number of valid entries in block */ +__le16 dqdh_pad1; +__le32 dqdh_pad2; +}; + +#define QT_TREEOFF 1/* Offset of tree in file in blocks */ + +#endif /* _LINUX_QUOTAIO_TREE_H */
fs/quota_v2.c +50 -544
669 lines not on this page · raw message
fs/quotaio_v2.h +7 -26
@@ -21,6 +21,12 @@ 0 /* GRPQUOTA */\ } +/* First generic header */ +struct v2_disk_dqheader { +__le32 dqh_magic;/* Magic number identifying file */ +__le32 dqh_version;/* File version */ +}; +/* * The following structure defines the format of the disk quota file * (as it appears on disk) - the file is a radix tree whose leaves point
@@ -38,15 +44,6 @@ struct v2_disk_dqblk {__le64 dqb_itime;/* time limit for excessive inode use */ }; -/* -* Here are header structures as written on disk and their in-memory copies -*/ -/* First generic header */ -struct v2_disk_dqheader { -__le32 dqh_magic;/* Magic number identifying file */ -__le32 dqh_version;/* File version */ -}; -/* Header with type and version specific information */ struct v2_disk_dqinfo {__le32 dqi_bgrace;/* Time before block soft limit becomes hard limit */
@@ -57,23 +54,7 @@ struct v2_disk_dqinfo { __le32 dqi_free_entry; /* Number of block with at least one free entry */ }; -/* -* Structure of header of block with quota structures. It is padded to 16 bytes so -* there will be space for exactly 21 quota-entries in a block -*/ -struct v2_disk_dqdbheader { -__le32 dqdh_next_free;/* Number of next block with free entry */ -__le32 dqdh_prev_free;/* Number of previous block with free entry */ -__le16 dqdh_entries;/* Number of valid entries in block */ -__le16 dqdh_pad1; -__le32 dqdh_pad2; -}; -#define V2_DQINFOOFF sizeof(struct v2_disk_dqheader)/* Offset of info header in file */ -#define V2_DQBLKSIZE_BITS 10 -#define V2_DQBLKSIZE (1 << V2_DQBLKSIZE_BITS)/* Size of block with quota structures */ -#define V2_DQTREEOFF 1/* Offset of tree in file in blocks */ -#define V2_DQTREEDEPTH 4/* Depth of quota tree */ -#define V2_DQSTRINBLK ((V2_DQBLKSIZE - sizeof(struct v2_disk_dqdbheader)) / sizeof(struct v2_disk_dqblk))/* Number of entries in one blocks */ +#define V2_DQBLKSIZE_BITS 10/* Size of leaf block in tree */ #endif /* _LINUX_QUOTAIO_V2_H */
include/linux/dqblk_qtree.h new file +49 -0
49 lines not on this page · raw message
include/linux/dqblk_v2.h +8 -11
@@ -1,26 +1,23 @@/* -* Definitions of structures for vfsv0 quota format +* Definitions for vfsv0 quota format */ #ifndef _LINUX_DQBLK_V2_H#define _LINUX_DQBLK_V2_H -#include <linux/types.h> +#include <linux/dqblk_qtree.h> -/* id numbers of quota format */ +/* Id number of quota format */ #define QFMT_VFS_V0 2/* Numbers of blocks needed for updates */ -#define V2_INIT_ALLOC 4 -#define V2_INIT_REWRITE 2 -#define V2_DEL_ALLOC 0 -#define V2_DEL_REWRITE 6 +#define V2_INIT_ALLOC QTREE_INIT_ALLOC +#define V2_INIT_REWRITE QTREE_INIT_REWRITE +#define V2_DEL_ALLOC QTREE_DEL_ALLOC +#define V2_DEL_REWRITE QTREE_DEL_REWRITE -/* Inmemory copy of version specific information */ struct v2_mem_dqinfo { -unsigned int dqi_blocks; -unsigned int dqi_free_blk; -unsigned int dqi_free_entry; +struct qtree_mem_dqinfo i; };#endif /* _LINUX_DQBLK_V2_H */
Signature · 1 line
1.5.2.4