hi-res mtime userspace interface - Kernel

This is a discussion on hi-res mtime userspace interface - Kernel ; Is there an existing linux userspace interface for accessing the microsecond or nanosecond level (a|m|c)times of filesystems that support them (e.g. ext4, xfs)? and possibly also the generation counters used by NFS. I notice sys_utimes is able to set microsecond ...

+ Reply to Thread
Results 1 to 5 of 5

Thread: hi-res mtime userspace interface

  1. hi-res mtime userspace interface

    Is there an existing linux userspace interface for accessing the
    microsecond or nanosecond level (a|m|c)times of filesystems that support
    them (e.g. ext4, xfs)? and possibly also the generation counters used by
    NFS.

    I notice sys_utimes is able to set microsecond (c|a|m)times but I can't
    find an associated interface to read them (I've googled to no avail).

    (also noticing freebsd and darwin's struct stat contains struct timespec
    for these as well as an st_gen field - although I do realise how
    incredibly difficult it would be to add these to linux's struct stat).

    ~mc

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: hi-res mtime userspace interface

    On Sun, 20 Jan 2008 21:09:52 +0800
    Michael Clark wrote:

    > Is there an existing linux userspace interface for accessing the
    > microsecond or nanosecond level (a|m|c)times of filesystems that support
    > them (e.g. ext4, xfs)? and possibly also the generation counters used by
    > NFS.
    >
    > I notice sys_utimes is able to set microsecond (c|a|m)times but I can't
    > find an associated interface to read them (I've googled to no avail).
    >
    > (also noticing freebsd and darwin's struct stat contains struct timespec
    > for these as well as an st_gen field - although I do realise how
    > incredibly difficult it would be to add these to linux's struct stat).
    >


    Look at stat.

    In /usr/include/bits/stat.h:
    struct stat
    {
    __dev_t st_dev; /* Device. */
    ....
    #ifdef __USE_MISC
    /* Nanosecond resolution timestamps are stored in a format
    equivalent to 'struct timespec'. This is the type used
    whenever possible but the Unix namespace rules do not allow the
    identifier 'timespec' to appear in the header.
    Therefore we have to handle the use of this header in strictly
    standard-compliant sources special. */
    struct timespec st_atim; /* Time of last access. */
    struct timespec st_mtim; /* Time of last modification. */
    struct timespec st_ctim; /* Time of last status change. */
    # define st_atime st_atim.tv_sec /* Backward compatibility. */
    # define st_mtime st_mtim.tv_sec
    # define st_ctime st_ctim.tv_sec
    #else
    __time_t st_atime; /* Time of last access. */
    unsigned long int st_atimensec; /* Nscecs of last access. */
    __time_t st_mtime; /* Time of last modification. */
    unsigned long int st_mtimensec; /* Nsecs of last modification. */
    __time_t st_ctime; /* Time of last status change. */
    unsigned long int st_ctimensec; /* Nsecs of last status change. */
    #endif
    --
    Stephen Hemminger
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. Re: hi-res mtime userspace interface

    Stephen Hemminger wrote:
    > Look at stat.
    >


    Thanks. OK that was what I wanted. I hadn't looked further than man 2
    stat - I think the stat man page needs an update.

    > In /usr/include/bits/stat.h:
    > struct stat
    > {
    > __dev_t st_dev; /* Device. */
    > ...
    > #ifdef __USE_MISC
    > /* Nanosecond resolution timestamps are stored in a format
    > equivalent to 'struct timespec'. This is the type used
    > whenever possible but the Unix namespace rules do not allow the
    > identifier 'timespec' to appear in the header.
    > Therefore we have to handle the use of this header in strictly
    > standard-compliant sources special. */
    > struct timespec st_atim; /* Time of last access. */
    > struct timespec st_mtim; /* Time of last modification. */
    > struct timespec st_ctim; /* Time of last status change. */
    > # define st_atime st_atim.tv_sec /* Backward compatibility. */
    > # define st_mtime st_mtim.tv_sec
    > # define st_ctime st_ctim.tv_sec
    > #else
    > __time_t st_atime; /* Time of last access. */
    > unsigned long int st_atimensec; /* Nscecs of last access. */
    > __time_t st_mtime; /* Time of last modification. */
    > unsigned long int st_mtimensec; /* Nsecs of last modification. */
    > __time_t st_ctime; /* Time of last status change. */
    > unsigned long int st_ctimensec; /* Nsecs of last status change. */
    > #endif
    >


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. Re: hi-res mtime userspace interface

    Hi,

    I have what might be a newbie question.

    I've tried using the st_mtim.tv_nsec to get to the nanosecond part, but it is always 0. I tried this:

    Code:
    FILE *f = fopen("/home/my_file", "w+");
    int ff = fileno(f);
    struct stat *s;
    fstat(ff, s);
    printf("Opened my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    
    char *str = "Hello World\n";
    fwrite(str, 12, 1, f);
    fstat(ff, s);
    printf("Written to my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    fclose(f);
    
    stat("/home/my_file", s);
    printf("Closed my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    
    f = fopen("/home/my_file", "w+");
    ff = fileno(f);
    fstat(ff, s);
    printf("Reopened my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    
    fwrite(str, 12, 1, f);
    fstat(ff, s);
    printf("Rewrote to my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    
    fclose(f);
    
    stat("/home/my_file", s);
    printf("Closed my_file. modified: sec %ld \tnsec: %ld\n", s->st_mtim.tv_sec, s->st_mtim.tv_nsec);
    And the output is this

    Code:
    Opened my_file. modified: sec 1206446228        nsec: 0
    Written to my_file. modified: sec 1206446228    nsec: 0
    Closed my_file. modified: sec 1206446228        nsec: 0
    Reopened my_file. modified: sec 1206446228      nsec: 0
    Rewrote to my_file. modified: sec 1206446228    nsec: 0
    Closed my_file. modified: sec 1206446228        nsec: 0
    I'm using ext3, and I know that the nanosecond part is not saved to disk, but I thought that while open, the nanosecond part was available.

    What am I doing wrong?

    Q

  5. Re: hi-res mtime userspace interface

    I noticed that /usr/include/asm/stat.h leads to different stat structure than /usr/include/sys/stat.h.

    The former also defines STAT_HAVE_NSEC

    So I added this to my test program:

    Code:
    #ifdef STAT_HAVE_NSEC
    printf("Hooray!\n");
    #endif
    It doesnt print Hooray.

    Is this what I need? Do I need to recompile my kernel or something to get it to have nsec support? How would I do this? Am I on the wrong track here?

    Please help.

    Q

+ Reply to Thread