The access, modification and change times are added to storage volumes and corresponding xml representations. --- docs/formatstorage.html.in | 13 +++++++++++++ docs/schemas/storagevol.rng | 23 +++++++++++++++++++++++ src/conf/storage_conf.c | 12 ++++++++++++ src/conf/storage_conf.h | 9 +++++++++ src/storage/storage_backend.c | 20 ++++++++++++++++++++ 5 files changed, 77 insertions(+) diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index d0e4319..c4d6d85 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -141,6 +141,11 @@ <mode>0744</mode> <label>virt_image_t</label> </permissions> + <timestamps> + <atime>1341933637.27319099</atime> + <mtime>1341930622.47245868</mtime> + <ctime>1341930622.47245868</ctime> + </timestamps> <encryption type='...'> ... </encryption> @@ -172,6 +177,14 @@ contains the MAC (eg SELinux) label string. <span class="since">Since 0.4.1</span> </dd> + <dt><code>timestamps</code></dt> + <dd>Provides timing information about the volume. The three sub elements + <code>atime</code>, <code>mtime</code> and <code>ctime</code> hold the + access, modification and respectively the change time of the volume. The + used time format is <seconds>.<nanoseconds> since the beginning + of the epoch. This is a readonly attribute and is ignored when creating + a volume. <span class="since">Since 0.10.0</span> + </dd> <dt><code>encryption</code></dt> <dd>If present, specifies how the volume is encrypted. See the <a href="formatstorageencryption.html">Storage Encryption</a> page diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng index 7a74331..dafe918 100644 --- a/docs/schemas/storagevol.rng +++ b/docs/schemas/storagevol.rng @@ -63,6 +63,28 @@ </optional> </define> + <define name='timestamps'> + <optional> + <element name='timestamps'> + <element name='atime'> + <data type="string"> + <param name="pattern">[0-9]+\.[0-9]+</param> + </data> + </element> + <element name='mtime'> + <data type="string"> + <param name="pattern">[0-9]+\.[0-9]+</param> + </data> + </element> + <element name='ctime'> + <data type="string"> + <param name="pattern">[0-9]+\.[0-9]+</param> + </data> + </element> + </element> + </optional> + </define> + <define name='target'> <element name='target'> <optional> @@ -72,6 +94,7 @@ </optional> <ref name='format'/> <ref name='permissions'/> + <ref name='timestamps'/> <optional> <ref name='encryption'/> </optional> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index ab8df9e..435ad00 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1272,6 +1272,18 @@ virStorageVolTargetDefFormat(virStorageVolOptionsPtr options, virBufferAddLit(buf," </permissions>\n"); + virBufferAddLit(buf, " <timestamps>\n"); + virBufferAsprintf(buf, " <atime>%llu.%lu</atime>\n", + (unsigned long long) def->timestamps.atime.tv_sec, + def->timestamps.atime.tv_nsec); + virBufferAsprintf(buf, " <mtime>%llu.%lu</mtime>\n", + (unsigned long long) def->timestamps.mtime.tv_sec, + def->timestamps.mtime.tv_nsec); + virBufferAsprintf(buf, " <ctime>%llu.%lu</ctime>\n", + (unsigned long long) def->timestamps.ctime.tv_sec, + def->timestamps.ctime.tv_nsec); + virBufferAddLit(buf, " </timestamps>\n"); + if (def->encryption) { virBufferAdjustIndent(buf, 4); if (virStorageEncryptionFormat(buf, def->encryption) < 0) diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 5733b57..977b136 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -46,6 +46,14 @@ struct _virStoragePerms { /* Storage volumes */ +typedef struct _virStorageTimestamps virStorageTimestamps; +typedef virStorageTimestamps *virStorageTimestampsPtr; +struct _virStorageTimestamps { + struct timespec atime; + struct timespec mtime; + struct timespec ctime; +}; + /* * How the volume's data is stored on underlying @@ -77,6 +85,7 @@ struct _virStorageVolTarget { char *path; int format; virStoragePerms perms; + virStorageTimestamps timestamps; int type; /* only used by disk backend for partition type */ /* Currently used only in virStorageVolDef.target, not in .backingstore. */ virStorageEncryptionPtr encryption; diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index e2e9b51..ce4d808 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1156,6 +1156,9 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr target, unsigned long long *capacity) { struct stat sb; + struct timespec *const atime=&target->timestamps.atime, + *const mtime=&target->timestamps.mtime, + *const catime=&target->timestamps.ctime; #if HAVE_SELINUX security_context_t filecon = NULL; #endif @@ -1209,6 +1212,23 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr target, target->perms.uid = sb.st_uid; target->perms.gid = sb.st_gid; + atime->tv_sec = sb.st_atime; + mtime->tv_sec = sb.st_mtime; + catime->tv_sec = sb.st_ctime; +#if _BSD_SOURCE || _SVID_SOURCE + atime->tv_nsec = sb.st_atim.tv_nsec; + mtime->tv_nsec = sb.st_mtim.tv_nsec; + catime->tv_nsec = sb.st_ctim.tv_nsec; +#elif _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 + atime->tv_nsec = sb.st_atimensec; + mtime->tv_nsec = sb.st_mtimensec; + catime->tv_nsec = sb.st_ctimensec; +#else + atime->tv_nsec = 0; + mtime->tv_nsec = 0; + catime->tv_nsec = 0; +#endif + VIR_FREE(target->perms.label); #if HAVE_SELINUX -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list