On Thu, Nov 24, 2011 at 15:22:10 +0100, Michal Privoznik wrote: > If pool directory contains special files like FIFO or sockets > we want to skip those on pool-start or pool-refresh otherwise > open() will get an error. > --- > src/storage/storage_backend.c | 25 ++++++++++++++++--------- > 1 files changed, 16 insertions(+), 9 deletions(-) > > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 93c98d6..d30829d 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -1013,9 +1013,24 @@ virStorageBackendVolOpenCheckMode(const char *path, unsigned int flags) > struct stat sb; > char *base = last_component(path); > > + if (lstat(path, &sb) < 0) { > + virReportSystemError(errno, > + _("cannot stat file '%s'"), > + path); > + return -1; > + } > + > + if (S_ISFIFO(sb.st_mode)) { > + VIR_WARN("ignoring FIFO '%s'", path); > + return -2; > + } else if (S_ISSOCK(sb.st_mode)) { > + VIR_WARN("ignoring socket '%s'", path); > + return -2; > + } > + > if ((fd = open(path, O_RDONLY|O_NONBLOCK|O_NOCTTY)) < 0) { > if ((errno == ENOENT || errno == ELOOP) && > - lstat(path, &sb) == 0) { > + S_ISLNK(sb.st_mode)) { > VIR_WARN("ignoring dangling symlink '%s'", path); > return -2; > } > @@ -1026,14 +1041,6 @@ virStorageBackendVolOpenCheckMode(const char *path, unsigned int flags) > return -1; > } > > - if (fstat(fd, &sb) < 0) { > - virReportSystemError(errno, > - _("cannot stat file '%s'"), > - path); > - VIR_FORCE_CLOSE(fd); > - return -1; > - } > - Oops, you can't remove this fstat since it operates on fd we got by opening path. Information returned by lstat(path) doesn't have to be the same as what fstat(fd) returns. Especially, if path is a symlink, the two calls will provide different results. The following code needs to check st_mode of the real file not a symlink... > if (S_ISREG(sb.st_mode)) > mode = VIR_STORAGE_VOL_OPEN_REG; > else if (S_ISCHR(sb.st_mode)) Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list