On Mon, Nov 11, 2013 at 09:19:31PM -0700, Eric Blake wrote:
diff --git a/src/storage/storage_backend_gluster.c
b/src/storage/storage_backend_gluster.c
index bc90de9..69e8e61 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -116,6 +116,12 @@ virStorageBackendGlusterOpen(virStoragePoolObjPtr pool)
goto error;
}
+ if (glfs_chdir(ret->vol, ret->dir) < 0) {
+ virReportSystemError(errno, _("failed to change to directory
'%s'"),
+ ret->dir);
+ goto error;
+ }
+
return ret;
error:
@@ -124,6 +130,37 @@ error:
}
+static int
s/int/ssize_t/ ?
+virStorageBackendGlusterReadHeader(glfs_fd_t *fd,
+ const char *name,
+ int maxlen,
s/int/size_t/ ?
+ char **buf)
+{
+ char *s;
+ size_t nread = 0;
+
+ if (VIR_ALLOC_N(*buf, maxlen) < 0)
+ return -1;
+
+ s = *buf;
+ while (maxlen) {
+ ssize_t r = glfs_read(fd, s, maxlen, 0);
+ if (r < 0 && errno == EINTR)
+ continue;
+ if (r < 0) {
+ VIR_FREE(*buf);
+ virReportSystemError(errno, _("unable to read '%s'"),
name);
+ return r;
+ }
+ if (r == 0)
+ return nread;
+ buf += r;
+ maxlen -= r;
+ nread += r;
+ }
+ return nread;
+}
+
/* Populate *volptr for the given name and stat information, or leave
* it NULL if the entry should be skipped (such as "."). Return 0 on
* success, -1 on failure. */
@@ -137,6 +174,10 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr
state,
char *tmp;
int ret = -1;
virStorageVolDefPtr vol = NULL;
+ glfs_fd_t *fd = NULL;
+ virStorageFileMetadata *meta = NULL;
+ char *header = NULL;
+ ssize_t len = VIR_STORAGE_MAX_HEADER;
/* Silently skip directories, including '.' and '..'. FIXME:
* should non-'.' subdirectories be listed as type dir? */
@@ -162,11 +203,57 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr
state,
}
state->uri->path = tmp;
+ if (!(fd = glfs_open(state->vol, name, O_RDONLY| O_NONBLOCK | O_NOCTTY))) {
+ if ((errno == ENOENT || errno == ELOOP) &&
+ S_ISLNK(st->st_mode)) {
+ VIR_WARN("ignoring dangling symlink '%s'", name);
+ ret = 0;
+ } else {
+ virReportSystemError(errno, _("cannot open volume '%s'"),
name);
+ }
+ goto cleanup;
+ }
+
+ if ((len = virStorageBackendGlusterReadHeader(fd, name, len, &header)) < 0)
+ goto cleanup;
+
+ if ((vol->target.format = virStorageFileProbeFormatFromBuf(name,
+ header,
+ len)) < 0 ||
+ !(meta = virStorageFileGetMetadataFromBuf(name, header, len,
+ vol->target.format)))
+ goto cleanup;
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|