[Ocfs2-tools-devel] [Ocfs2-devel] [PATCH 3/9] Implement quota functions to libocfs2
Jan Kara
jack at suse.cz
Mon Aug 3 06:14:56 PDT 2009
On Fri 31-07-09 10:46:02, Tao Ma wrote:
>> + /* We need at least two blocks */
>> + err = ocfs2_cached_inode_extend_allocation(ci,
>> + ocfs2_clusters_in_blocks(fs, OCFS2_LOCAL_QF_INIT_BLOCKS));
>> + if (err)
>> + goto out;
>> + di->i_size = bytes;
>> + di->i_mtime = time(NULL);
>> + err = ocfs2_write_inode(fs, blkno, (char *)di);
>> + if (err)
>> + goto out;
>> +
>> + err = ocfs2_malloc_blocks(fs->fs_io, bytes, &buf);
> hey, ocfs2_malloc_blocks need num_blocks, not "bytes". so maybe
> OCFS2_LOCAL_QF_INIT_BLOCKS?
Argh, right. I don't know why I thought it takes bytes. Will fix it
and resend the series. Thanks for catching this.
> Oh, I just checked your v1, it was there. I am so sorry for not finding it
> earlier. And please change all of them in this patch.
>> +/* Get free block in file (either from free list or create new one) */
>> +static errcode_t ocfs2_get_free_dqblk(ocfs2_filesys *fs, int type,
>> + unsigned int *blk)
>> +{
>> + errcode_t err;
>> + char *buf;
>> + struct qt_disk_dqdbheader *dh;
>> + struct ocfs2_global_disk_dqinfo *info = &(fs->qinfo[type].qi_info);
>> + ocfs2_cached_inode *ci = fs->qinfo[type].qi_inode;
>> +
>> + err = ocfs2_malloc_block(fs->fs_io, &buf);
>> + if (err)
>> + return err;
>> + dh = (struct qt_disk_dqdbheader *)buf;
>> + if (info->dqi_free_blk) {
>> + *blk = info->dqi_free_blk;
>> + err = read_blk(fs, type, *blk, buf);
>> + if (err)
>> + goto bail;
>> + info->dqi_free_blk = le32_to_cpu(dh->dqdh_next_free);
>> + }
>> + else {
>> + if (info->dqi_blocks ==
>> + ocfs2_clusters_to_blocks(fs, ci->ci_inode->i_clusters)) {
>> + err = ocfs2_cached_inode_extend_allocation(ci, 1);
>> + if (err)
>> + goto bail;
>> + }
>> + *blk = info->dqi_blocks++;
>> + ci->ci_inode->i_size =
>> + ocfs2_blocks_to_bytes(fs, info->dqi_blocks);
> I am interested in this part. I read the kernel part yesterday. There you
> often check whether we need to add a chunk header in which case we need to
> extend the file by 2 blocks actually. But here we just extend 1 cluster? Is
> this a little different from the kernel part or we just simplify the case
> in the userspace? Please help me clarify it. Thanks.
This code takes care of extending global quota file - in kernel this
corresponds to a handling in ocfs2_quota_write(). Userspace code never
needs to extend local quota files, it only initializes them.
>> + }
>> + mark_quotafile_info_dirty(fs, type);
>> +bail:
>> + ocfs2_free(&buf);
>> + return err;
>> +}
Honza
--
Jan Kara <jack at suse.cz>
SUSE Labs, CR
More information about the Ocfs2-tools-devel
mailing list