NFS does not support file labelling, so ignore this error
for stdin_path when on NFS.
* src/security/security_selinux.c: Ignore failures on labelling
stdin_path on NFS
* src/util/storage_file.c, src/util/storage_file.h: Refine
virStorageFileIsSharedFS() to allow it to check for a
specific FS type.
---
src/libvirt_private.syms | 1 +
src/security/security_selinux.c | 9 ++++++---
src/util/storage_file.c | 32 +++++++++++++++++++++++++-------
src/util/storage_file.h | 9 +++++++++
4 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index cf64bd3..003d1a0 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -689,6 +689,7 @@ virStorageFileFormatTypeToString;
virStorageFileGetMetadata;
virStorageFileGetMetadataFromFD;
virStorageFileIsSharedFS;
+virStorageFileIsSharedFSType;
virStorageFileProbeFormat;
virStorageFileProbeFormatFromFD;
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index a9dd836..0612ce3 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1023,9 +1023,12 @@ SELinuxSetSecurityAllLabel(virSecurityDriverPtr drv,
SELinuxSetFilecon(vm->def->os.initrd, default_content_context) < 0)
return -1;
- if (stdin_path &&
- SELinuxSetFilecon(stdin_path, default_content_context) < 0)
- return -1;
+ if (stdin_path) {
+ if (SELinuxSetFilecon(stdin_path, default_content_context) < 0 &&
+ virStorageFileIsSharedFSType(stdin_path,
+ VIR_STORAGE_FILE_SHFS_NFS) != 1)
+ return -1;
+ }
return 0;
}
diff --git a/src/util/storage_file.c b/src/util/storage_file.c
index 3cd5dbc..0dc9f99 100644
--- a/src/util/storage_file.c
+++ b/src/util/storage_file.c
@@ -804,7 +804,8 @@ virStorageFileGetMetadata(const char *path,
# endif
-int virStorageFileIsSharedFS(const char *path)
+int virStorageFileIsSharedFSType(const char *path,
+ int fstypes)
{
char *dirpath, *p;
struct statfs sb;
@@ -853,19 +854,36 @@ int virStorageFileIsSharedFS(const char *path)
VIR_DEBUG("Check if path %s with FS magic %lld is shared",
path, (long long int)sb.f_type);
- if (sb.f_type == NFS_SUPER_MAGIC ||
- sb.f_type == GFS2_MAGIC ||
- sb.f_type == OCFS2_SUPER_MAGIC ||
- sb.f_type == AFS_FS_MAGIC) {
+ if ((fstypes & VIR_STORAGE_FILE_SHFS_NFS) &&
+ (sb.f_type == NFS_SUPER_MAGIC))
+ return 1;
+
+ if ((fstypes & VIR_STORAGE_FILE_SHFS_GFS2) &&
+ (sb.f_type == GFS2_MAGIC))
+ return 1;
+ if ((fstypes & VIR_STORAGE_FILE_SHFS_OCFS) &&
+ (sb.f_type == OCFS2_SUPER_MAGIC))
+ return 1;
+ if ((fstypes & VIR_STORAGE_FILE_SHFS_AFS) &&
+ (sb.f_type == AFS_FS_MAGIC))
return 1;
- }
return 0;
}
#else
-int virStorageFileIsSharedFS(const char *path ATTRIBUTE_UNUSED)
+int virStorageFileIsSharedFSType(const char *path ATTRIBUTE_UNUSED,
+ int fstypes ATTRIBUTE_UNUSED)
{
/* XXX implement me :-) */
return 0;
}
#endif
+
+int virStorageFileIsSharedFS(const char *path)
+{
+ return virStorageFileIsSharedFSType(path,
+ VIR_STORAGE_FILE_SHFS_NFS |
+ VIR_STORAGE_FILE_SHFS_GFS2 |
+ VIR_STORAGE_FILE_SHFS_OCFS |
+ VIR_STORAGE_FILE_SHFS_AFS);
+}
diff --git a/src/util/storage_file.h b/src/util/storage_file.h
index 6853182..ba44111 100644
--- a/src/util/storage_file.h
+++ b/src/util/storage_file.h
@@ -68,6 +68,15 @@ int virStorageFileGetMetadataFromFD(const char *path,
int format,
virStorageFileMetadata *meta);
+enum {
+ VIR_STORAGE_FILE_SHFS_NFS = (1 << 0),
+ VIR_STORAGE_FILE_SHFS_GFS2 = (1 << 1),
+ VIR_STORAGE_FILE_SHFS_OCFS = (1 << 2),
+ VIR_STORAGE_FILE_SHFS_AFS = (1 << 3),
+};
+
int virStorageFileIsSharedFS(const char *path);
+int virStorageFileIsSharedFSType(const char *path,
+ int fstypes);
#endif /* __VIR_STORAGE_FILE_H__ */
--
1.7.2.3