[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Add me_mountroot to mount_entry for linux machines
From: |
Dave Chiluk |
Subject: |
[PATCH] Add me_mountroot to mount_entry for linux machines |
Date: |
Mon, 31 Aug 2015 16:07:58 -0500 |
Add me_mountroot to mount_entry so linux machines based on
/proc/self/mountinfo can distinguish between bind mounts and original
mounts. In reality bind mounts aren't treated any different than
mountroot=/ mounts by the kernel, but this is still confusing to the
user, and a change in behavior
More information is available here
https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/1432871
---
lib/mountlist.c | 24 +++++++++++++++++++++---
lib/mountlist.h | 2 ++
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/lib/mountlist.c b/lib/mountlist.c
index 6f04f55..f4463ff 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -478,7 +478,8 @@ read_file_system_list (bool need_fs_type)
while (getline (&line, &buf_size, fp) != -1)
{
unsigned int devmaj, devmin;
- int target_s, target_e, type_s, type_e, source_s, source_e;
+ int target_s, target_e, type_s, type_e, source_s, source_e, \
+ mntroot_s, mntroot_e;
char test;
char *dash;
int rc;
@@ -486,13 +487,15 @@ read_file_system_list (bool need_fs_type)
rc = sscanf(line, "%*u " /* id - discarded */
"%*u " /* parent - discarded */
"%u:%u " /* dev major:minor */
- "%*s " /* mountroot - discarded */
+ "%n%*s%n " /* mountroot */
"%n%*s%n" /* target, start and end */
"%c", /* more data... */
&devmaj, &devmin,
+ &mntroot_s, &mntroot_e,
&target_s, &target_e,
&test);
- if (rc != 3 && rc != 5) /* 5 if %n included in count. */
+
+ if (rc != 3 && rc != 7) /* 7 if %n included in count. */
continue;
/* skip optional fields, terminated by " - " */
@@ -511,14 +514,17 @@ read_file_system_list (bool need_fs_type)
continue;
/* manipulate the sub-strings in place. */
+ line[mntroot_e] = '\0';
line[target_e] = '\0';
dash[type_e] = '\0';
dash[source_e] = '\0';
unescape_tab (dash + source_s);
+ unescape_tab (line + mntroot_s);
unescape_tab (line + target_s);
me = xmalloc (sizeof *me);
+ me->me_mntroot = xstrdup (line + mntroot_s);
me->me_devname = xstrdup (dash + source_s);
me->me_mountdir = xstrdup (line + target_s);
me->me_type = xstrdup (dash + type_s);
@@ -566,6 +572,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (mnt->mnt_fsname);
me->me_mountdir = xstrdup (mnt->mnt_dir);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (mnt->mnt_type);
me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type, bind);
@@ -598,6 +605,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (fsp->f_mntfromname);
me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_mntroot = NULL;
me->me_type = fs_type;
me->me_type_malloced = 0;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -624,6 +632,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (fsp->f_mntfromname);
me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (fsp->f_fstypename);
me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -650,6 +659,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (fsd.fd_req.devname);
me->me_mountdir = xstrdup (fsd.fd_req.path);
+ me->me_mntroot = NULL;
me->me_type = gt_names[fsd.fd_req.fstype];
me->me_type_malloced = 0;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -748,6 +758,7 @@ read_file_system_list (bool need_fs_type)
me->me_devname = xstrdup (fi.device_name[0] != '\0'
? fi.device_name : fi.fsh_name);
me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name);
+ me->mntroot = NULL ;
me->me_type = xstrdup (fi.fsh_name);
me->me_type_malloced = 1;
me->me_dev = fi.dev;
@@ -797,6 +808,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (stats[counter].f_mntfromname);
me->me_mountdir = xstrdup (stats[counter].f_mntonname);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (FS_TYPE (stats[counter]));
me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -833,6 +845,7 @@ read_file_system_list (bool need_fs_type)
strcpy (me->me_devname + 5, mnt.mt_dev);
# endif
me->me_mountdir = xstrdup (mnt.mt_filsys);
+ me->me_mntroot = NULL;
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_type = "";
me->me_type_malloced = 0;
@@ -880,6 +893,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup ((*ent)->mt_resource);
me->me_mountdir = xstrdup ((*ent)->mt_directory);
+ me->me_mntroot = NULL;
me->me_type = xstrdup ((*ent)->mt_fstype);
me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -942,6 +956,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (mnt.mnt_special);
me->me_mountdir = xstrdup (mnt.mnt_mountp);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (mnt.mnt_fstype);
me->me_type_malloced = 1;
me->me_dummy = MNT_IGNORE (&mnt) != 0;
@@ -1020,6 +1035,7 @@ read_file_system_list (bool need_fs_type)
vmp->vmt_data[VMT_OBJECT].vmt_off);
}
me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype));
me->me_type_malloced = 1;
options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off;
@@ -1063,6 +1079,7 @@ read_file_system_list (bool need_fs_type)
me = xmalloc (sizeof *me);
me->me_devname = xstrdup (dev.f_mntfromname);
me->me_mountdir = xstrdup (dev.f_mntonname);
+ me->me_mntroot = NULL;
me->me_type = xstrdup (dev.f_fstypename);
me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
@@ -1105,6 +1122,7 @@ void free_mount_entry (struct mount_entry *me)
{
free (me->me_devname);
free (me->me_mountdir);
+ free (me->me_mntroot);
if (me->me_type_malloced)
free (me->me_type);
free (me);
diff --git a/lib/mountlist.h b/lib/mountlist.h
index 735776b..9ce3137 100644
--- a/lib/mountlist.h
+++ b/lib/mountlist.h
@@ -27,6 +27,8 @@ struct mount_entry
{
char *me_devname; /* Device node name, including "/dev/". */
char *me_mountdir; /* Mount point directory name. */
+ char *me_mntroot; /* Directory on filesystem of device used */
+ /* as root for the (bind) mount. */
char *me_type; /* "nfs", "4.2", etc. */
dev_t me_dev; /* Device number of me_mountdir. */
unsigned int me_dummy : 1; /* Nonzero for dummy file systems. */
--
1.9.1