Ejemplo n.º 1
0
/* Read information header from quota file */
static int v2_read_file_info(struct super_block *sb, int type)
{
    struct v2_disk_dqinfo dinfo;
    struct v2_disk_dqheader dqhead;
    struct mem_dqinfo *info = sb_dqinfo(sb, type);
    struct qtree_mem_dqinfo *qinfo;
    ssize_t size;
    unsigned int version;

    if (!v2_read_header(sb, type, &dqhead))
        return -1;
    version = le32_to_cpu(dqhead.dqh_version);
    if ((info->dqi_fmt_id == QFMT_VFS_V0 && version != 0) ||
            (info->dqi_fmt_id == QFMT_VFS_V1 && version != 1))
        return -1;

    size = sb->s_op->quota_read(sb, type, (char *)&dinfo,
                                sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
    if (size != sizeof(struct v2_disk_dqinfo)) {
        printk(KERN_WARNING "quota_v2: Can't read info structure on device %s.\n",
               sb->s_id);
        return -1;
    }
    info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_NOFS);
    if (!info->dqi_priv) {
        printk(KERN_WARNING
               "Not enough memory for quota information structure.\n");
        return -1;
    }
    qinfo = info->dqi_priv;
    if (version == 0) {
        /* limits are stored as unsigned 32-bit data */
        info->dqi_maxblimit = 0xffffffff;
        info->dqi_maxilimit = 0xffffffff;
    } else {
        /* used space is stored as unsigned 64-bit value */
        info->dqi_maxblimit = 0xffffffffffffffffULL;	/* 2^64-1 */
        info->dqi_maxilimit = 0xffffffffffffffffULL;
    }
    info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace);
    info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace);
    info->dqi_flags = le32_to_cpu(dinfo.dqi_flags);
    qinfo->dqi_sb = sb;
    qinfo->dqi_type = type;
    qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks);
    qinfo->dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk);
    qinfo->dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry);
    qinfo->dqi_blocksize_bits = V2_DQBLKSIZE_BITS;
    qinfo->dqi_usable_bs = 1 << V2_DQBLKSIZE_BITS;
    qinfo->dqi_qtree_depth = qtree_depth(qinfo);
    if (version == 0) {
        qinfo->dqi_entry_size = sizeof(struct v2r0_disk_dqblk);
        qinfo->dqi_ops = &v2r0_qtree_ops;
    } else {
        qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
        qinfo->dqi_ops = &v2r1_qtree_ops;
    }
    return 0;
}
Ejemplo n.º 2
0
/* Check whether given file is really vfsv0 quotafile */
static int v2_check_quota_file(struct super_block *sb, int type)
{
    struct v2_disk_dqheader dqhead;
    static const uint quota_magics[] = V2_INITQMAGICS;
    static const uint quota_versions[] = V2_INITQVERSIONS;

    if (!v2_read_header(sb, type, &dqhead))
        return 0;
    if (le32_to_cpu(dqhead.dqh_magic) != quota_magics[type] ||
            le32_to_cpu(dqhead.dqh_version) > quota_versions[type])
        return 0;
    return 1;
}
/*
 * Check whether given quota file is in our format
 */
static int v2_check_file(struct quota_handle *h, int type, int fmt)
{
	struct v2_disk_dqheader dqh;
	int file_magics[] = INITQMAGICS;

	if (fmt != QFMT_VFS_V1)
		return 0;

	if (!v2_read_header(h, &dqh))
		return 0;

	if (ext2fs_le32_to_cpu(dqh.dqh_magic) != file_magics[type]) {
		if (ext2fs_be32_to_cpu(dqh.dqh_magic) == file_magics[type])
			log_err("Your quota file is stored in wrong endianity");
		return 0;
	}
	if (V2_VERSION != ext2fs_le32_to_cpu(dqh.dqh_version))
		return 0;
	return 1;
}
Ejemplo n.º 4
0
/* Read information header from quota file */
static int v2_read_file_info(struct super_block *sb, int type)
{
	struct v2_disk_dqinfo dinfo;
	struct v2_disk_dqheader dqhead;
	struct mem_dqinfo *info = sb_dqinfo(sb, type);
	struct qtree_mem_dqinfo *qinfo;
	ssize_t size;
	unsigned int version;

	if (!v2_read_header(sb, type, &dqhead))
		return -1;
	version = le32_to_cpu(dqhead.dqh_version);
	if ((info->dqi_fmt_id == QFMT_VFS_V0 && version != 0) ||
	    (info->dqi_fmt_id == QFMT_VFS_V1 && version != 1))
		return -1;

	size = sb->s_op->quota_read(sb, type, (char *)&dinfo,
	       sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
	if (size != sizeof(struct v2_disk_dqinfo)) {
		quota_error(sb, "Can't read info structure");
		return -1;
	}
	info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_NOFS);
	if (!info->dqi_priv) {
		printk(KERN_WARNING
		       "Not enough memory for quota information structure.\n");
		return -ENOMEM;
	}
	qinfo = info->dqi_priv;
	if (version == 0) {
		/* limits are stored as unsigned 32-bit data */
		info->dqi_max_spc_limit = 0xffffffffLL << QUOTABLOCK_BITS;
		info->dqi_max_ino_limit = 0xffffffff;
	} else {
		/*
		 * Used space is stored as unsigned 64-bit value in bytes but
		 * quota core supports only signed 64-bit values so use that
		 * as a limit
		 */
		info->dqi_max_spc_limit = 0x7fffffffffffffffLL; /* 2^63-1 */
		info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
	}
	info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace);
	info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace);
	/* No flags currently supported */
	info->dqi_flags = 0;
	qinfo->dqi_sb = sb;
	qinfo->dqi_type = type;
	qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks);
	qinfo->dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk);
	qinfo->dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry);
	qinfo->dqi_blocksize_bits = V2_DQBLKSIZE_BITS;
	qinfo->dqi_usable_bs = 1 << V2_DQBLKSIZE_BITS;
	qinfo->dqi_qtree_depth = qtree_depth(qinfo);
	if (version == 0) {
		qinfo->dqi_entry_size = sizeof(struct v2r0_disk_dqblk);
		qinfo->dqi_ops = &v2r0_qtree_ops;
	} else {
		qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
		qinfo->dqi_ops = &v2r1_qtree_ops;
	}
	return 0;
}