[Ocfs2-tools-devel] [PATCH 5/6] O2info: Add running codes for '--volinfo'.
Sunil Mushran
sunil.mushran at oracle.com
Fri Apr 23 15:43:52 PDT 2010
Tristan Ye wrote:
> Task of '--volinfo' will be capable of two approaches, including
> libocfs2 and ioctl solutions.
>
> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
> ---
> o2info/o2info.c | 15 +++++
> o2info/operations.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 164 insertions(+), 0 deletions(-)
>
> diff --git a/o2info/o2info.c b/o2info/o2info.c
> index 1e281d9..0dff173 100644
> --- a/o2info/o2info.c
> +++ b/o2info/o2info.c
> @@ -35,6 +35,7 @@
> #include "utils.h"
>
> extern struct o2info_operation fs_features_op;
> +extern struct o2info_operation volinfo_op;
>
> static LIST_HEAD(o2info_op_task_list);
> static int o2info_op_task_count;
> @@ -113,11 +114,25 @@ static struct o2info_option fs_features_option = {
> .opt_private = NULL,
> };
>
> +static struct o2info_option volinfo_option = {
> + .opt_option = {
> + .name = "volinfo",
> + .val = CHAR_MAX,
> + .has_arg = 0,
> + .flag = NULL,
> + },
> + .opt_help = " --volinfo",
> + .opt_handler = NULL,
> + .opt_op = &volinfo_op,
> + .opt_private = NULL,
> +};
> +
> static struct o2info_option *options[] = {
> &help_option,
> &version_option,
> &coherency_option,
> &fs_features_option,
> + &volinfo_option,
> NULL,
> };
>
> diff --git a/o2info/operations.c b/o2info/operations.c
> index d2a190c..1e3ac13 100644
> --- a/o2info/operations.c
> +++ b/o2info/operations.c
> @@ -225,3 +225,152 @@ out:
> DEFINE_O2INFO_OP(fs_features,
> fs_features_run,
> NULL);
> +
> +struct o2info_volinfo {
> + uint32_t blocksize;
> + uint32_t clustersize;
> + uint16_t maxslots;
> + uint8_t label[OCFS2_MAX_VOL_LABEL_LEN];
> + uint8_t uuid_str[OCFS2_TEXT_UUID_LEN + 1];
> + struct o2info_fs_features ofs;
> +};
> +
> +static int get_volinfo_libocfs2(struct o2info_operation *op,
> + ocfs2_filesys *fs,
> + struct o2info_volinfo *vf)
> +{
> + int rc = 0;
> + struct ocfs2_super_block *sb = NULL;
> +
> + memset(vf, 0, sizeof(*vf));
> +
> + sb = OCFS2_RAW_SB(fs->fs_super);
> + vf->blocksize = fs->fs_blocksize;
> + vf->clustersize = fs->fs_clustersize;
> + vf->maxslots = sb->s_max_slots;
> + memcpy(vf->label, sb->s_label, OCFS2_MAX_VOL_LABEL_LEN);
> + memcpy(vf->uuid_str, fs->uuid_str, OCFS2_TEXT_UUID_LEN + 1);
> + rc = get_fs_features_libocfs2(op, fs, &(vf->ofs));
> +
> + return rc;
> +}
> +
> +static int get_volinfo_ioctl(struct o2info_operation *op,
> + int fd,
> + struct o2info_volinfo *vf)
> +{
> + int rc = 0, flags = 0;
> +
> + struct ocfs2_info_blocksize oib;
> + struct ocfs2_info_clustersize oic;
> + struct ocfs2_info_maxslots oim;
> + struct ocfs2_info_label oil;
> + struct ocfs2_info_uuid oiu;
> +
> + memset(vf, 0, sizeof(*vf));
> + flags |= cluster_coherent;
> +
> + o2info_fill_request((struct ocfs2_info_request *)&oib, sizeof(oib),
> + OCFS2_INFO_BLOCKSIZE, flags);
> + o2info_fill_request((struct ocfs2_info_request *)&oic, sizeof(oic),
> + OCFS2_INFO_CLUSTERSIZE, flags);
> + o2info_fill_request((struct ocfs2_info_request *)&oim, sizeof(oim),
> + OCFS2_INFO_MAXSLOTS, flags);
> + o2info_fill_request((struct ocfs2_info_request *)&oil, sizeof(oil),
> + OCFS2_INFO_LABEL, flags);
> + o2info_fill_request((struct ocfs2_info_request *)&oiu, sizeof(oiu),
> + OCFS2_INFO_UUID, flags);
> +
> + uint64_t reqs[5] = {(unsigned long)&oib,
> + (unsigned long)&oic,
> + (unsigned long)&oim,
> + (unsigned long)&oil,
> + (unsigned long)&oiu};
> +
> + struct ocfs2_info info = {
> + .oi_requests = (uint64_t)reqs,
> + .oi_count = 5,
> + };
>
Please stick to C. Declarations should be at the top.
> +
> + rc = ioctl(fd, OCFS2_IOC_INFO, &info);
> + if (rc) {
> + rc = errno;
> + o2i_error(op, "ioctl failed: %s\n", strerror(rc));
> + goto out;
> + }
> +
> + if (oib.ib_req.ir_flags & OCFS2_INFO_FL_FILLED)
> + vf->blocksize = oib.ib_blocksize;
> +
> + if (oic.ic_req.ir_flags & OCFS2_INFO_FL_FILLED)
> + vf->clustersize = oic.ic_clustersize;
> +
> + if (oim.im_req.ir_flags & OCFS2_INFO_FL_FILLED)
> + vf->maxslots = oim.im_max_slots;
> +
> + if (oil.il_req.ir_flags & OCFS2_INFO_FL_FILLED)
> + memcpy(vf->label, oil.il_label, OCFS2_MAX_VOL_LABEL_LEN);
> +
> + if (oiu.iu_req.ir_flags & OCFS2_INFO_FL_FILLED)
> + memcpy(vf->uuid_str, oiu.iu_uuid_str, OCFS2_TEXT_UUID_LEN + 1);
> +
> + rc = get_fs_features_ioctl(op, fd, &(vf->ofs));
> +
> +out:
> + return rc;
> +}
> +
> +static int volinfo_run(struct o2info_operation *op,
> + struct o2info_method *om,
> + void *arg)
> +{
> + int rc = 0;
> + static struct o2info_volinfo vf;
> +
> + char *compat = NULL;
> + char *incompat = NULL;
> + char *rocompat = NULL;
> + char *features = NULL;
> +
> +#define VOLINFO " Block Size: %u\n" \
> + "Cluster Size: %u\n" \
> + " Max Slots: %u\n" \
> + "Volume Label: %s\n" \
> + " Volume UUID: %s\n"
>
Didn't I give you a different format. The difference was that
I wanted the label/uuid at the top. That's the volume identifier.
See my previous email.
> +
> + if (om->om_method == O2INFO_USE_IOCTL)
> + rc = get_volinfo_ioctl(op, om->om_fd, &vf);
> + else
> + rc = get_volinfo_libocfs2(op, om->om_fs, &vf);
> + if (rc)
> + goto out;
> +
> + rc = o2info_get_compat_flag(vf.ofs.compat, &compat);
> + if (rc)
> + goto out;
> +
> + rc = o2info_get_incompat_flag(vf.ofs.incompat, &incompat);
> + if (rc)
> + goto out;
> +
> + rc = o2info_get_rocompat_flag(vf.ofs.rocompat, &rocompat);
> + if (rc)
> + goto out;
> +
> + features = malloc(strlen(compat) + strlen(incompat) +
> + strlen(rocompat) + 3);
> +
> + sprintf(features, "%s %s %s", compat, incompat, rocompat);
> +
> + fprintf(stdout, VOLINFO, vf.blocksize, vf.clustersize,
> + vf.maxslots, vf.label, vf.uuid_str);
> +
> + o2info_print_line(" Features:", features, ' ');
>
So this is good. However, in the previous patch (--fs-features),
I would like the features to be printed in one line. No "Features :"
qualifier, etc. Just plain string in one line.
In --volinfo, we would want it looking pretty.
The reason is that --fs-features can be used easily in scripts to determine
whether a feature is available or not.
has_reflink=`o2info --fs-features /path/to/file/device | grep refcount"
I guess this will work with multiline too. But just do this, please.
> +
> +out:
> + return rc;
> +}
> +
> +DEFINE_O2INFO_OP(volinfo,
> + volinfo_run,
> + NULL);
>
More information about the Ocfs2-tools-devel
mailing list