[libvirt] [PATCH] storage: Skip socket and fifo on pool-start

Jiri Denemark jdenemar at redhat.com
Fri Nov 25 12:20:20 UTC 2011


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




More information about the libvir-list mailing list