rc = statx(api->fd_tree, "", AT_EMPTY_PATH, STATX_MNT_ID, &st);
cxt->fs->id = (int) st.stx_mnt_id;
+
+ if (cxt->update) {
+ struct libmnt_fs *fs = mnt_update_get_fs(cxt->update);
+ if (fs)
+ fs->id = cxt->fs->id;
+ }
}
done:
- DBG(HOOK, ul_debugobj(hs, "create FS done [rc=%d]", rc));
+ DBG(HOOK, ul_debugobj(hs, "create FS done [rc=%d, id=%d]", rc, cxt->fs ? cxt->fs->id : -1));
return rc;
}
if (!*p)
break;
- if (!fs->source && !strncmp(p, "SRC=", 4)) {
+ if (!fs->id && !strncmp(p, "ID=", 3)) {
+ int rc = 0;
+
+ end = next_s32(p + 3, &fs->id, &rc);
+ if (!end || rc)
+ return rc;
+
+ } else if (!fs->source && !strncmp(p, "SRC=", 4)) {
char *v = unmangle(p + 4, &end);
if (!v)
goto enomem;
struct libmnt_fs *fs;
struct libmnt_iter itr;
const char *optstr, *src, *target, *root, *attrs;
+ int id;
if (!tb || !uf)
return NULL;
optstr = mnt_fs_get_user_options(uf);
attrs = mnt_fs_get_attributes(uf);
root = mnt_fs_get_root(uf);
+ id = mnt_fs_get_id(uf);
if (!src || !target || !root || (!attrs && !optstr))
return NULL;
if (fs->flags & MNT_FS_MERGED)
continue;
- if (r && strcmp(r, root) == 0
+ if (id > 0 && mnt_fs_get_id(fs)) {
+ DBG(TAB, ul_debugobj(tb, " using ID"));
+ if (mnt_fs_get_id(fs) == id)
+ break;
+ } else if (r && strcmp(r, root) == 0
&& mnt_fs_streq_target(fs, target)
&& mnt_fs_streq_srcpath(fs, src))
break;
}
if (fs) {
- DBG(TAB, ul_debugobj(tb, "found fs -- appending user optstr"));
+ DBG(TAB, ul_debugobj(tb, " found"));
mnt_fs_append_options(fs, optstr);
mnt_fs_append_attributes(fs, attrs);
mnt_fs_set_bindsrc(fs, mnt_fs_get_bindsrc(uf));
fs->flags |= MNT_FS_MERGED;
- DBG(TAB, ul_debugobj(tb, "found fs:"));
DBG(TAB, mnt_fs_print_debug(fs, stderr));
}
return fs;
if (!fs || !f)
return -EINVAL;
- p = mangle(mnt_fs_get_source(fs));
- if (p) {
- rc = fprintf(f, "SRC=%s ", p);
- free(p);
+ if (mnt_fs_get_id(fs) > 0) {
+ rc = fprintf(f, "ID=%d ", mnt_fs_get_id(fs));
+ }
+ if (rc >= 0) {
+ p = mangle(mnt_fs_get_source(fs));
+ if (p) {
+ rc = fprintf(f, "SRC=%s ", p);
+ free(p);
+ }
}
if (rc >= 0) {
p = mangle(mnt_fs_get_target(fs));