[Ocfs2-tools-devel] [PATCH 13/19] Ocfs2-tools: Add running codes for '--file-statistics' in operation.c

tristan tristan.ye at oracle.com
Mon Apr 19 00:21:44 PDT 2010


Sunil Mushran wrote:
> How is this different from the stat tool?
>
> We want this tool to provide info that may not be available
> to non privileged users.

Sunil,

It's an extension of standard 'stat' tool, following is the difference 
between 'stat' and 'o2info --file-statstics':

[oracle at ocfs2-test4 ~]$ stat /storage/testfile
File: `/storage/testfile'
Size: 0 Blocks: 0 IO Block: 32768 regular empty file
Device: 808h/2056d Inode: 17962 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-04-19 14:56:32.822439918 +0800
Modify: 2010-04-19 14:56:32.822439918 +0800
Change: 2010-04-19 14:56:32.822439918 +0800


[oracle at ocfs2-test4 ~]$ o2info --file-statistics /storage/testfile
File: /storage/testfile
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 808h/2056d Inode: 17962 Links: 1
Frag%: 0.00 Clusters: 0 Extents: 0 Score: 0
Shared: 0 Unwritten: 0 Holes: 0 Xattr: 0
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-04-19 14:56:32.822439918 +0800
Modify: 2010-04-19 14:56:32.822439918 +0800
Change: 2010-04-19 14:56:32.822439918 +0800



Frag%: 0.00 Clusters: 0 Extents: 0 Score: 0
Shared: 0 Unwritten: 0 Holes: 0 Xattr: 0

Above 2 lines is the additional info o2info provides.

non-privileged users are not able to have a close watch on these without 
'o2info --file-statistics'.

They're all in o2info's design doc.

Tristan.


>
> So nak for now.
>
> Tristan Ye wrote:
>> Task of file statistics will be partly implemented by fiemap, and partly
>> from standard stat().
>>
>> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
>> ---
>> o2info/operations.c | 109 
>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 109 insertions(+), 0 deletions(-)
>>
>> diff --git a/o2info/operations.c b/o2info/operations.c
>> index c4fa7fc..21504d6 100644
>> --- a/o2info/operations.c
>> +++ b/o2info/operations.c
>> @@ -553,3 +553,112 @@ static int usage_run(struct o2info_operation *op,
>> DEFINE_O2INFO_OP(usage,
>> usage_run,
>> NULL);
>> +
>> +static int filestat_run(struct o2info_operation *op,
>> + struct o2info_method *om,
>> + void *arg)
>> +{
>> + int rc = 0;
>> + uint16_t perm;
>> + struct stat st;
>> +
>> + char *path = NULL;
>> + char *filetype = NULL, *h_perm = NULL;
>> + char *uname = NULL, *gname = NULL;
>> + char *ah_time = NULL, *ch_time = NULL, *mh_time = NULL;
>> +
>> + static struct o2info_fiemap_stats ofs;
>> +
>> + rc = lstat(om->om_path, &st);
>> + if (rc < 0) {
>> + rc = errno;
>> + o2i_error(op, "stat error: %s\n", strerror(rc));
>> + goto out;
>> + }
>> +
>> + rc = o2info_get_human_path(st.st_mode, om->om_path, &path);
>> + if (rc)
>> + goto out;
>> +
>> + rc = o2info_get_filetype(st, &filetype);
>> + if (rc)
>> + goto out;
>> +
>> + rc = o2info_uid2name(st.st_uid, &uname);
>> + if (rc)
>> + goto out;
>> +
>> + rc = o2info_gid2name(st.st_gid, &gname);
>> + if (rc)
>> + goto out;
>> +
>> + rc = o2info_get_human_permission(st.st_mode, &perm, &h_perm);
>> + if (rc)
>> + goto out;
>> +
>> + rc = get_fiemap_stats(op, om, &ofs);
>> + if (rc)
>> + goto out;
>> +
>> + if (!ofs.blocksize)
>> + ofs.blocksize = st.st_blksize;
>> +
>> + fprintf(stdout, " File: %s\n", path);
>> + fprintf(stdout, " Size: %-10lu\tBlocks: %-10u IO Block: %-6u %s\n",
>> + st.st_size, st.st_blocks, ofs.blocksize, filetype);
>> + if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode))
>> + fprintf(stdout, "Device: %xh/%dd\tInode: %-10i Links: %-5u"
>> + " Device type: %u,%u\n", st.st_dev, st.st_dev,
>> + st.st_ino, st.st_nlink,
>> + st.st_dev >> 16UL, st.st_dev & 0x0000FFFF);
>> + else
>> + fprintf(stdout, "Device: %xh/%dd\tInode: %-10i Links: %u\n",
>> + st.st_dev, st.st_dev, st.st_ino, st.st_nlink);
>> + fprintf(stdout, " Frag%: %-10.2f\tClusters: %-8u Extents: "
>> + "%-6lu Score: %.0f\n", ofs.frag, ofs.clusters,
>> + ofs.num_extents, ofs.score);
>> + fprintf(stdout, "Shared: %-10u\tUnwritten: %-7u Holes: %-8u "
>> + "Xattr: %u\n", ofs.shared, ofs.unwrittens,
>> + ofs.holes, ofs.xattr);
>> + fprintf(stdout, "Access: (%04o/%10s) Uid: (%5u/%8s) "
>> + "Gid: (%5u/%8s)\n", perm, h_perm, st.st_uid,
>> + uname, st.st_gid, gname);
>> +
>> + rc = o2info_get_human_time(&ah_time, o2info_get_stat_atime(&st));
>> + if (rc)
>> + goto out;
>> + rc = o2info_get_human_time(&mh_time, o2info_get_stat_mtime(&st));
>> + if (rc)
>> + goto out;
>> + rc = o2info_get_human_time(&ch_time, o2info_get_stat_ctime(&st));
>> + if (rc)
>> + goto out;
>> +
>> + fprintf(stdout, "Access: %s\n", ah_time);
>> + fprintf(stdout, "Modify: %s\n", mh_time);
>> + fprintf(stdout, "Change: %s\n", ch_time);
>> +
>> +out:
>> + if (path)
>> + ocfs2_free(&path);
>> + if (filetype)
>> + ocfs2_free(&filetype);
>> + if (uname)
>> + ocfs2_free(&uname);
>> + if (gname)
>> + ocfs2_free(&gname);
>> + if (h_perm)
>> + ocfs2_free(&h_perm);
>> + if (ah_time)
>> + ocfs2_free(&ah_time);
>> + if (mh_time)
>> + ocfs2_free(&mh_time);
>> + if (ch_time)
>> + ocfs2_free(&ch_time);
>> +
>> + return rc;
>> +}
>> +
>> +DEFINE_O2INFO_OP(filestat,
>> + filestat_run,
>> + NULL);
>




More information about the Ocfs2-tools-devel mailing list