[Ocfs2-devel] [PATCH 2/5] Implement support for quota changes in libocfs2
Tristan
tristan.ye at oracle.com
Mon Oct 19 23:49:08 PDT 2009
Jan Kara wrote:
> Implement some common functions for changing quotas in libocfs2
> so that they don't have to be reimplemented in several users.
>
> Signed-off-by: Jan Kara <jack at suse.cz>
> ---
> include/ocfs2/ocfs2.h | 16 ++++++
> libocfs2/quota.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 143 insertions(+), 0 deletions(-)
>
> diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
> index d7be734..bf64fa0 100644
> --- a/include/ocfs2/ocfs2.h
> +++ b/include/ocfs2/ocfs2.h
> @@ -685,6 +685,7 @@ int ocfs2_qtree_entry_unused(struct ocfs2_global_disk_dqblk *ddquot);
> errcode_t ocfs2_init_global_quota_file(ocfs2_filesys *fs, int type);
> errcode_t ocfs2_init_fs_quota_info(ocfs2_filesys *fs, int type);
> errcode_t ocfs2_read_global_quota_info(ocfs2_filesys *fs, int type);
> +errcode_t ocfs2_load_fs_quota_info(ocfs2_filesys *fs);
> errcode_t ocfs2_write_global_quota_info(ocfs2_filesys *fs, int type);
> errcode_t ocfs2_write_dquot(ocfs2_filesys *fs, int type,
> ocfs2_cached_dquot *dquot);
> @@ -702,9 +703,24 @@ errcode_t ocfs2_find_quota_hash(ocfs2_quota_hash *hash, qid_t id,
> ocfs2_cached_dquot **dquotp);
> errcode_t ocfs2_find_create_quota_hash(ocfs2_quota_hash *hash, qid_t id,
> ocfs2_cached_dquot **dquotp);
> +errcode_t ocfs2_find_read_quota_hash(ocfs2_filesys *fs, ocfs2_quota_hash *hash,
> + int type, qid_t id,
> + ocfs2_cached_dquot **dquotp);
> errcode_t ocfs2_compute_quota_usage(ocfs2_filesys *fs,
> ocfs2_quota_hash *usr_hash,
> ocfs2_quota_hash *grp_hash);
> +errcode_t ocfs2_init_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash **usrhash,
> + ocfs2_quota_hash **grphash);
> +errcode_t ocfs2_finish_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash *usrhash,
> + ocfs2_quota_hash *grphash);
> +errcode_t ocfs2_apply_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash *usrhash,
> + ocfs2_quota_hash *grphash,
> + uid_t uid, gid_t gid,
> + int64_t space_change,
> + int64_t inode_change);
> errcode_t ocfs2_iterate_quota_hash(ocfs2_quota_hash *hash,
> errcode_t (*f)(ocfs2_cached_dquot *, void *),
> void *data);
> diff --git a/libocfs2/quota.c b/libocfs2/quota.c
> index e36b12f..9e0ca33 100644
> --- a/libocfs2/quota.c
> +++ b/libocfs2/quota.c
> @@ -229,6 +229,30 @@ errcode_t ocfs2_find_create_quota_hash(ocfs2_quota_hash *hash, qid_t id,
> return 0;
> }
>
> +errcode_t ocfs2_find_read_quota_hash(ocfs2_filesys *fs, ocfs2_quota_hash *hash,
> + int type, qid_t id,
> + ocfs2_cached_dquot **dquotp)
> +{
> + errcode_t err;
> +
> + err = ocfs2_find_quota_hash(hash, id, dquotp);
> + if (err)
> + return err;
> + if (*dquotp)
> + return 0;
> +
> + err = ocfs2_read_dquot(fs, type, id, dquotp);
> + if (err)
> + return err;
> +
> + err = ocfs2_insert_quota_hash(hash, *dquotp);
> + if (err) {
> + ocfs2_free(dquotp);
> + return err;
> + }
> + return 0;
> +}
> +
> errcode_t ocfs2_compute_quota_usage(ocfs2_filesys *fs,
> ocfs2_quota_hash *usr_hash,
> ocfs2_quota_hash *grp_hash)
> @@ -296,6 +320,84 @@ out:
> return err;
> }
>
> +errcode_t ocfs2_init_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash **usrhash,
> + ocfs2_quota_hash **grphash)
> +{
> + errcode_t err;
> +
> + if (OCFS2_HAS_RO_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
> + OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
> + err = ocfs2_new_quota_hash(usrhash);
> + if (err)
> + return err;
>
no need to free 'usrhash' as well as following 'grphash'?
> + }
> + if (OCFS2_HAS_RO_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
> + OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
> + err = ocfs2_new_quota_hash(grphash);
> + if (err) {
> + ocfs2_free_quota_hash(*usrhash);
>
shouldn't it be:
ocfs2_free_quota_hash(*grphash);
> + return err;
> + }
> + }
> + return 0;
> +}
> +
> +errcode_t ocfs2_finish_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash *usrhash,
> + ocfs2_quota_hash *grphash)
> +{
> + errcode_t ret = 0, err;
> +
> + if (usrhash) {
> + err = ocfs2_write_release_dquots(fs, USRQUOTA, usrhash);
> + if (!ret)
> + ret = err;
>
There is no need to judge 'ret' here since it was always zero without
any re-assignment. the same goes for other 'if' statement in this function.
> + err = ocfs2_free_quota_hash(usrhash);
> + if (!ret)
> + ret = err;
> + }
> + if (grphash) {
> + err = ocfs2_write_release_dquots(fs, GRPQUOTA, grphash);
> + if (!ret)
> + ret = err;
> + err = ocfs2_free_quota_hash(grphash);
> + if (!ret)
> + ret = err;
> + }
> +
> + return ret;
> +}
> +
> +errcode_t ocfs2_apply_quota_change(ocfs2_filesys *fs,
> + ocfs2_quota_hash *usrhash,
> + ocfs2_quota_hash *grphash,
> + uid_t uid, gid_t gid,
> + int64_t space_change,
> + int64_t inode_change)
> +{
> + ocfs2_cached_dquot *dquot;
> + errcode_t err;
> +
> + if (usrhash) {
> + err = ocfs2_find_read_quota_hash(fs, usrhash, USRQUOTA, uid,
> + &dquot);
> + if (err)
> + return err;
> + dquot->d_ddquot.dqb_curspace += space_change;
> + dquot->d_ddquot.dqb_curinodes += inode_change;
> + }
> + if (grphash) {
> + err = ocfs2_find_read_quota_hash(fs, grphash, GRPQUOTA, gid,
> + &dquot);
> + if (err)
> + return err;
> + dquot->d_ddquot.dqb_curspace += space_change;
> + dquot->d_ddquot.dqb_curinodes += inode_change;
> + }
> + return 0;
> +}
> +
> errcode_t ocfs2_iterate_quota_hash(ocfs2_quota_hash *hash,
> errcode_t (*f)(ocfs2_cached_dquot *, void *),
> void *data)
> @@ -614,6 +716,31 @@ bail:
> return ret;
> }
>
> +errcode_t ocfs2_load_fs_quota_info(ocfs2_filesys *fs)
> +{
> + errcode_t err;
> +
> + if (OCFS2_HAS_RO_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
> + OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
> + err = ocfs2_init_fs_quota_info(fs, USRQUOTA);
> + if (err)
> + return err;
> + err = ocfs2_read_global_quota_info(fs, USRQUOTA);
> + if (err)
> + return err;
> + }
> + if (OCFS2_HAS_RO_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
> + OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
> + err = ocfs2_init_fs_quota_info(fs, GRPQUOTA);
> + if (err)
> + return err;
> + err = ocfs2_read_global_quota_info(fs, GRPQUOTA);
> + if (err)
> + return err;
> + }
> + return 0;
> +}
> +
> #define OCFS2_GLOBAL_QF_INIT_BLOCKS 2
>
> errcode_t ocfs2_init_global_quota_file(ocfs2_filesys *fs, int type)
>
More information about the Ocfs2-devel
mailing list