[CRIU] [PATCH RFC 1/2] mount: fs type helpers introduced

Pavel Emelyanov xemul at virtuozzo.com
Thu Mar 10 00:56:59 PST 2016


On 02/24/2016 01:54 PM, Stanislav Kinsburskiy wrote:
> This helpers just hide statfs syscall, which is used only for one purpose: get
> file system magic number.
> 
> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
> ---
>  files.c         |   10 ++++------
>  include/mount.h |    3 +++
>  kerndat.c       |    8 +++-----
>  mount.c         |   33 ++++++++++++++++++++++++++++-----
>  4 files changed, 38 insertions(+), 16 deletions(-)
> 
> diff --git a/files.c b/files.c
> index f605a51..3a96985 100644
> --- a/files.c
> +++ b/files.c
> @@ -269,7 +269,7 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
>  				struct fd_opts *opts, struct fd_parms *p)
>  {
>  	int ret;
> -	struct statfs fsbuf;
> +	unsigned int fs_type;
>  	struct fdinfo_common fdinfo = { .mnt_id = -1, .owner = ctl->pid.virt };
>  
>  	if (fstat(lfd, &p->stat) < 0) {
> @@ -277,15 +277,13 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
>  		return -1;
>  	}
>  
> -	if (fstatfs(lfd, &fsbuf) < 0) {
> -		pr_perror("Can't statfs fd %d", lfd);
> +	if (parse_fdinfo_pid(ctl->pid.real, fd, FD_TYPES__UND, NULL, &fdinfo))
>  		return -1;
> -	}
>  
> -	if (parse_fdinfo_pid(ctl->pid.real, fd, FD_TYPES__UND, NULL, &fdinfo))
> +	if (get_fstype_by_fd(lfd, &fs_type))
>  		return -1;
>  
> -	p->fs_type	= fsbuf.f_type;
> +	p->fs_type	= fs_type;

No need in separate variable, just pass &p->fs_type into get_fstype_by_fd.

>  	p->ctl		= ctl;
>  	p->fd		= fd;
>  	p->pos		= fdinfo.pos;
> diff --git a/include/mount.h b/include/mount.h
> index b3bbdce..4989b41 100644
> --- a/include/mount.h
> +++ b/include/mount.h
> @@ -126,4 +126,7 @@ extern int mntns_maybe_create_roots(void);
>  extern int read_mnt_ns_img(void);
>  extern void cleanup_mnt_ns(void);
>  
> +extern int get_fstype_by_fd(int fd, unsigned int *type);
> +extern int get_fstype_by_path(const char *path, unsigned int *type);
> +
>  #endif /* __CR_MOUNT_H__ */
> diff --git a/kerndat.c b/kerndat.c
> index 696701d..af84902 100644
> --- a/kerndat.c
> +++ b/kerndat.c
> @@ -198,13 +198,11 @@ static dev_t get_host_dev(unsigned int which)
>  	}
>  
>  	if (kstat[which].fs_dev == 0) {
> -		struct statfs fst;
> +		unsigned int fs_type;
>  		struct stat st;
>  
> -		if (statfs(kstat[which].path, &fst)) {
> -			pr_perror("Unable to statefs %s", kstat[which].path);
> +		if (get_fstype_by_path(kstat[which].path, &fs_type))
>  			return 0;
> -		}
>  
>  		/*
>  		 * XXX: If the fs we need is not there, it still
> @@ -212,7 +210,7 @@ static dev_t get_host_dev(unsigned int which)
>  		 * mounted on the host.
>  		 */
>  
> -		if (fst.f_type != kstat[which].magic) {
> +		if (fs_type != kstat[which].magic) {
>  			pr_err("%s isn't mount on the host\n", kstat[which].name);
>  			return 0;
>  		}
> diff --git a/mount.c b/mount.c
> index 747488b..f5d8773 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -213,6 +213,30 @@ struct mount_info *lookup_mnt_id(unsigned int id)
>  	return __lookup_mnt_id(mntinfo, id);
>  }
>  
> +int get_fstype_by_fd(int fd, unsigned int *type)
> +{
> +	struct statfs fst;
> +
> +	if (fstatfs(fd, &fst)) {
> +		pr_perror("Unable to statfs fd %d", fd);
> +		return -errno;
> +	}
> +	*type = fst.f_type;
> +	return 0;
> +}
> +
> +int get_fstype_by_path(const char *path, unsigned int *type)
> +{
> +	struct statfs fst;
> +
> +	if (statfs(path, &fst)) {
> +		pr_perror("Unable to statfs %s", path);
> +		return -errno;
> +	}
> +	*type = fst.f_type;
> +	return 0;
> +}
> +
>  struct mount_info *lookup_mnt_sdev(unsigned int s_dev)
>  {
>  	struct mount_info *m;
> @@ -2607,13 +2631,12 @@ static int do_mount_one(struct mount_info *mi)
>  		return -1;
>  
>  	if (mi->fstype->code == FSTYPE__UNSUPPORTED) {
> -		struct statfs st;
> +		unsigned int fs_type;
>  
> -		if (statfs(mi->mountpoint, &st)) {
> -			pr_perror("Unable to statfs %s", mi->mountpoint);
> +		if (get_fstype_by_path(mi->mountpoint, &fs_type))
>  			return -1;
> -		}
> -		if (st.f_type == BTRFS_SUPER_MAGIC)
> +
> +		if (fstype == BTRFS_SUPER_MAGIC)
>  			mi->fstype = find_fstype_by_name("btrfs");
>  	}
>  
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
> 



More information about the CRIU mailing list