[Ocfs2-tools-devel] [Ocfs2-devel] [PATCH 3/8] Implement quota functions to libocfs2
Jan Kara
jack at suse.cz
Tue Jul 28 01:41:00 PDT 2009
On Tue 28-07-09 15:55:30, Tao Ma wrote:
> 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?
The comment is meant to say that the hash-table will occupy 16 MB on a
64-bit architecture where each pointer has 8 bytes... I'll expand the
comment a bit.
>> +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?
OK, will do.
>> + 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?
No, we cannot since write_blk() writes to a global quota file. Here we
need to write to a node-local quota file. Since there's only this place,
where we write to local quota file, I'd just leave the code as is.
Honza
--
Jan Kara <jack at suse.cz>
SUSE Labs, CR
More information about the Ocfs2-tools-devel
mailing list