[Ocfs2-devel] [PATCH 3/8] Implement quota functions to libocfs2
Tao Ma
tao.ma at oracle.com
Tue Jul 28 00:55:30 PDT 2009
Hi Jan,
Jan Kara wrote:
> Signed-off-by: Jan Kara <jack at suse.cz>
> ---
> include/ocfs2/ocfs2.h | 80 +++
> libocfs2/Makefile | 1 +
> libocfs2/feature_string.c | 18 +
> libocfs2/ocfs2_err.et | 6 +
> libocfs2/quota.c | 1208 +++++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 1313 insertions(+), 0 deletions(-)
> create mode 100644 libocfs2/quota.c
>
> diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
> index ac16823..7f136ca 100644
> --- a/include/ocfs2/ocfs2.h
> +++ b/include/ocfs2/ocfs2.h
> @@ -125,16 +125,36 @@
> #define OCFS2_CHB_WAITING 2
> #define OCFS2_CHB_COMPLETE 3
>
> +/* Flags for global quotafile info */
> +#define OCFS2_QF_INFO_DIRTY 1
> +/* Should be power of two */
> +#define DEFAULT_QUOTA_HASH_SIZE 8192
> +#define MAX_QUOTA_HASH_SIZE (1<<21) /* 16 MB on 64-bit arch*/
16MB is 1<<24?
> +errcode_t ocfs2_init_local_quota_file(ocfs2_filesys *fs, int type,
> + uint64_t blkno)
> +{
> + ocfs2_cached_inode *ci = NULL;
> + struct ocfs2_dinode *di;
> + struct ocfs2_disk_dqheader *header;
> + struct ocfs2_local_disk_dqinfo *info;
> + unsigned int magics[] = OCFS2_LOCAL_QMAGICS;
> + int versions[] = OCFS2_LOCAL_QVERSIONS;
> + char *buf = NULL;
> + unsigned int written;
> + errcode_t err;
> +
> + err = ocfs2_read_cached_inode(fs, blkno, &ci);
> + if (err)
> + goto out;
> +
> + if (!(ci->ci_inode->i_flags & OCFS2_VALID_FL) ||
> + !(ci->ci_inode->i_flags & OCFS2_SYSTEM_FL) ||
> + !(ci->ci_inode->i_flags & OCFS2_QUOTA_FL)) {
> + err = OCFS2_ET_INTERNAL_FAILURE;
> + goto out;
> + }
> + di = ci->ci_inode;
> +
> + /* We need at least two blocks */
> + err = ocfs2_cached_inode_extend_allocation(ci, (2 * fs->fs_blocksize +
> + fs->fs_clustersize - 1) / fs->fs_clustersize);
> + if (err)
> + goto out;
> + di->i_size = 2 * fs->fs_blocksize;
> + di->i_mtime = time(NULL);
> + err = ocfs2_write_inode(fs, blkno, (char *)di);
> + if (err)
> + goto out;
> +
> + err = ocfs2_malloc_blocks(fs->fs_io, fs->fs_blocksize * 2, &buf);
> + if (err)
> + goto out;
> + memset(buf, 0, 2 * fs->fs_blocksize);
> +
> + header = (struct ocfs2_disk_dqheader *)buf;
> + header->dqh_magic = magics[type];
> + header->dqh_version = versions[type];
> + ocfs2_swap_quota_header(header);
> +
> + info = (struct ocfs2_local_disk_dqinfo *)(buf + OCFS2_LOCAL_INFO_OFF);
> + info->dqi_chunks = 1;
> + info->dqi_blocks = 2;
I see hardcoded "2" so many times in this function while in
ocfs2_init_global_quota_file you define "int blocks = 2", so I just
wonder if we can change it somehow like that function?
> + info->dqi_flags = OLQF_CLEAN;
> + ocfs2_swap_quota_local_info(info);
> +
> + /* There are no free chunks because there are no blocks allocated for
> + * them yet. So chunk header is all-zero and needs no initialization */
> + ocfs2_checksum_quota_block(fs, buf);
> + ocfs2_checksum_quota_block(fs, buf + fs->fs_blocksize);
> + err = ocfs2_file_write(ci, buf, 2 * fs->fs_blocksize, 0, &written);
> + if (!err && written != 2 * fs->fs_blocksize) {
> + err = OCFS2_ET_INTERNAL_FAILURE;
> + goto out;
> + }
and here in ocfs2_init_global_quota_file you use write_blk which will
calculate ocfs2_checksum_quota_block. So we can use that function also here?
Regards,
Tao
More information about the Ocfs2-devel
mailing list