[CRIU] [PATCH RFC 2/2] mount: "get fs type by mount id" helper introduced
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Wed Feb 24 02:54:57 PST 2016
This helper takes mount id, discovers struct mountinfo and takes fs magic from
fstype object, is present. Returns error otherwise.
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
files.c | 5 +++--
include/mount.h | 1 +
include/proc_parse.h | 1 +
mount.c | 24 +++++++++++++++++++++---
4 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/files.c b/files.c
index 3a96985..04fd9eb 100644
--- a/files.c
+++ b/files.c
@@ -280,8 +280,9 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
if (parse_fdinfo_pid(ctl->pid.real, fd, FD_TYPES__UND, NULL, &fdinfo))
return -1;
- if (get_fstype_by_fd(lfd, &fs_type))
- return -1;
+ if (get_fstype_by_mntid(fdinfo.mnt_id, &fs_type))
+ if (get_fstype_by_fd(lfd, &fs_type))
+ return -1;
p->fs_type = fs_type;
p->ctl = ctl;
diff --git a/include/mount.h b/include/mount.h
index 4989b41..eb9546f 100644
--- a/include/mount.h
+++ b/include/mount.h
@@ -128,5 +128,6 @@ 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);
+extern int get_fstype_by_mntid(unsigned int id, unsigned int *type);
#endif /* __CR_MOUNT_H__ */
diff --git a/include/proc_parse.h b/include/proc_parse.h
index 9e932db..8521eff 100644
--- a/include/proc_parse.h
+++ b/include/proc_parse.h
@@ -117,6 +117,7 @@ struct fstype {
int (*parse)(struct mount_info *pm);
bool (*can_mount)(struct mount_info *pm);
mount_fn_t mount;
+ unsigned int fs_magic;
};
struct vm_area_list;
diff --git a/mount.c b/mount.c
index f5d8773..355cd88 100644
--- a/mount.c
+++ b/mount.c
@@ -237,6 +237,21 @@ int get_fstype_by_path(const char *path, unsigned int *type)
return 0;
}
+int get_fstype_by_mntid(unsigned int id, unsigned int *type)
+{
+ struct mount_info *m;
+
+ m = lookup_mnt_id(id);
+ if (!m)
+ return -EINVAL;
+
+ if (m->fstype->fs_magic == 0)
+ return -ENOENT;
+
+ *type = m->fstype->fs_magic;
+ return 0;
+}
+
struct mount_info *lookup_mnt_sdev(unsigned int s_dev)
{
struct mount_info *m;
@@ -1810,11 +1825,13 @@ static struct fstype fstypes[32] = {
.code = FSTYPE__NFS,
.mount = nfs_mount,
.can_mount = nfs_can_mount,
+ .fs_magic = NFS_SUPER_MAGIC,
}, {
.name = "nfs4",
.code = FSTYPE__NFS4,
.mount = nfs_mount,
.can_mount = nfs_can_mount,
+ .fs_magic = NFS_SUPER_MAGIC,
}
};
@@ -2631,10 +2648,11 @@ static int do_mount_one(struct mount_info *mi)
return -1;
if (mi->fstype->code == FSTYPE__UNSUPPORTED) {
- unsigned int fs_type;
+ unsigned int fstype = mi->fstype->fs_magic;
- if (get_fstype_by_path(mi->mountpoint, &fs_type))
- return -1;
+ if (fstype == 0)
+ if (get_fstype_by_path(mi->mountpoint, &fstype))
+ return -1;
if (fstype == BTRFS_SUPER_MAGIC)
mi->fstype = find_fstype_by_name("btrfs");
More information about the CRIU
mailing list