!!! DON'T PUSH until stat-time lgpl 3 issue is fixed
!!! To tests this change lgpl version to 3 in bootstrap.conf:176
The access, birth, modification and change times are added to
storage volumes and corresponding xml representations.
---
bootstrap.conf | 1 +
docs/formatstorage.html.in | 13 +++++++++++++
docs/schemas/storagevol.rng | 36 ++++++++++++++++++++++++++++++++++++
src/conf/storage_conf.c | 18 ++++++++++++++++++
src/conf/storage_conf.h | 13 +++++++++++++
src/storage/storage_backend.c | 6 ++++++
6 files changed, 87 insertions(+)
diff --git a/bootstrap.conf b/bootstrap.conf
index 9b42cbf..da0b960 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -115,6 +115,7 @@ vc-list-files
vsnprintf
waitpid
warnings
+stat-time
'
# Additional xgettext options to use. Use "\\\newline" to break lines.
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index d0e4319..ec7ec90 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>
+ <ctime>1341930622.47245868</ctime>
+ <mtime>1341930622.47245868</mtime>
+ </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 four sub elements
+ <code>atime</code>, <code>btime</code>,
<code>ctime</code> and <code>mtime</code>
+ hold the access, birth, change and modification time of the volume, where known.
+ 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..a20c7a5 100644
--- a/docs/schemas/storagevol.rng
+++ b/docs/schemas/storagevol.rng
@@ -63,6 +63,41 @@
</optional>
</define>
+ <define name='timestamps'>
+ <optional>
+ <element name='timestamps'>
+ <optional>
+ <element name='atime'>
+ <data type="string">
+ <param name="pattern">[0-9]+\.[0-9]+</param>
+ </data>
+ </element>
+ </optional>
+ <optional>
+ <element name='btime'>
+ <data type="string">
+ <param name="pattern">[0-9]+\.[0-9]+</param>
+ </data>
+ </element>
+ </optional>
+ <optional>
+ <element name='ctime'>
+ <data type="string">
+ <param name="pattern">[0-9]+\.[0-9]+</param>
+ </data>
+ </element>
+ </optional>
+ <optional>
+ <element name='mtime'>
+ <data type="string">
+ <param name="pattern">[0-9]+\.[0-9]+</param>
+ </data>
+ </element>
+ </optional>
+ </element>
+ </optional>
+ </define>
+
<define name='target'>
<element name='target'>
<optional>
@@ -72,6 +107,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 36a3bb9..b1ec8da 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1277,6 +1277,24 @@ virStorageVolTargetDefFormat(virStorageVolOptionsPtr options,
virBufferAddLit(buf," </permissions>\n");
+ virBufferAddLit(buf, " <timestamps>\n");
+ virBufferAsprintf(buf, " <atime>%llu.%ld</atime>\n",
+ (unsigned long long) def->timestamps.atime.tv_sec,
+ def->timestamps.atime.tv_nsec);
+ if(def->timestamps.btime.tv_sec != -1 ||
+ def->timestamps.btime.tv_nsec != -1) {
+ virBufferAsprintf(buf, " <btime>%llu.%ld</btime>\n",
+ (unsigned long long) def->timestamps.btime.tv_sec,
+ def->timestamps.btime.tv_nsec);
+ }
+ virBufferAsprintf(buf, " <ctime>%llu.%ld</ctime>\n",
+ (unsigned long long) def->timestamps.ctime.tv_sec,
+ def->timestamps.ctime.tv_nsec);
+ virBufferAsprintf(buf, " <mtime>%llu.%ld</mtime>\n",
+ (unsigned long long) def->timestamps.mtime.tv_sec,
+ def->timestamps.mtime.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..706e874 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -46,6 +46,18 @@ struct _virStoragePerms {
/* Storage volumes */
+typedef struct _virStorageTimestamps virStorageTimestamps;
+typedef virStorageTimestamps *virStorageTimestampsPtr;
+struct _virStorageTimestamps {
+ struct timespec atime;
+ /* if btime.tv_sec == -1 && btime.tv_nsec == -1 than
+ * birth time is unknown
+ */
+ struct timespec btime;
+ struct timespec ctime;
+ struct timespec mtime;
+};
+
/*
* How the volume's data is stored on underlying
@@ -77,6 +89,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 6ea0881..c665711 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -57,6 +57,7 @@
#include "storage_backend.h"
#include "logging.h"
#include "virfile.h"
+#include "stat-time.h"
#if WITH_STORAGE_LVM
# include "storage_backend_logical.h"
@@ -1208,6 +1209,11 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr
target,
target->perms.uid = sb.st_uid;
target->perms.gid = sb.st_gid;
+ target->timestamps.atime = get_stat_atime(&sb);
+ target->timestamps.btime = get_stat_birthtime(&sb);
+ target->timestamps.ctime = get_stat_ctime(&sb);
+ target->timestamps.mtime = get_stat_mtime(&sb);
+
VIR_FREE(target->perms.label);
#if HAVE_SELINUX
--
1.7.9.5