libmount: improve fs referencing in tables
* Added member 'struct libmnt_table *tab' to libmnt_fs structure. * Added 'mnt_fs_get_table()'. * Removed overhead from 'mnt_table_{insert,move,remove}_fs(). * Added check to 'mnt_table_set_iter()' that entry is member of table. [kzak@redhat.com: - add to libmount.sys - add to docs - cleanup commit message - set fs->tab = NULL before mnt_unref_fs() in mnt_table_remove_fs()] Signed-off-by: Tim Hildering <hilderingt@posteo.net> Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
64a87be1a4
commit
9d5eb4c464
|
@ -227,6 +227,7 @@ mnt_fs_get_source
|
|||
mnt_fs_get_srcpath
|
||||
mnt_fs_get_swaptype
|
||||
mnt_fs_get_tag
|
||||
mnt_fs_get_table
|
||||
mnt_fs_get_target
|
||||
mnt_fs_get_tid
|
||||
mnt_fs_get_usedsize
|
||||
|
|
|
@ -190,6 +190,7 @@ struct libmnt_fs *mnt_copy_fs(struct libmnt_fs *dest,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
dest->tab = NULL;
|
||||
dest->id = src->id;
|
||||
dest->parent = src->parent;
|
||||
dest->devno = src->devno;
|
||||
|
@ -445,6 +446,22 @@ int mnt_fs_streq_srcpath(struct libmnt_fs *fs, const char *path)
|
|||
return p && path && strcmp(p, path) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mnt_fs_get_table:
|
||||
* @fs: table entry
|
||||
* @tb: table that contains @fs
|
||||
*
|
||||
* Returns: 0 or negative number on error (if @fs or @tb is NULL).
|
||||
*/
|
||||
int mnt_fs_get_table(struct libmnt_fs *fs, struct libmnt_table **tb)
|
||||
{
|
||||
if (!fs || !tb)
|
||||
return -EINVAL;
|
||||
|
||||
*tb = fs->tab;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mnt_fs_streq_target:
|
||||
* @fs: fs
|
||||
|
|
|
@ -439,6 +439,7 @@ extern int mnt_fs_set_userdata(struct libmnt_fs *fs, void *data);
|
|||
extern const char *mnt_fs_get_source(struct libmnt_fs *fs);
|
||||
extern int mnt_fs_set_source(struct libmnt_fs *fs, const char *source);
|
||||
extern const char *mnt_fs_get_srcpath(struct libmnt_fs *fs);
|
||||
extern int mnt_fs_get_table(struct libmnt_fs *fs, struct libmnt_table **tb);
|
||||
|
||||
extern int mnt_fs_get_tag(struct libmnt_fs *fs, const char **name,
|
||||
const char **value);
|
||||
|
|
|
@ -344,6 +344,7 @@ MOUNT_2.33 {
|
|||
|
||||
MOUNT_2.34 {
|
||||
mnt_context_next_remount;
|
||||
mnt_fs_get_table;
|
||||
mnt_guess_system_root;
|
||||
mnt_table_find_fs;
|
||||
mnt_table_insert_fs;
|
||||
|
|
|
@ -170,6 +170,7 @@ struct libmnt_iter {
|
|||
*/
|
||||
struct libmnt_fs {
|
||||
struct list_head ents;
|
||||
struct libmnt_table *tab;
|
||||
|
||||
int refcount; /* reference counter */
|
||||
int id; /* mountinfo[1]: ID */
|
||||
|
|
|
@ -443,11 +443,12 @@ int mnt_table_add_fs(struct libmnt_table *tb, struct libmnt_fs *fs)
|
|||
if (!tb || !fs)
|
||||
return -EINVAL;
|
||||
|
||||
if (!list_empty(&fs->ents))
|
||||
if (fs->tab)
|
||||
return -EBUSY;
|
||||
|
||||
mnt_ref_fs(fs);
|
||||
list_add_tail(&fs->ents, &tb->ents);
|
||||
fs->tab = tb;
|
||||
tb->nents++;
|
||||
|
||||
DBG(TAB, ul_debugobj(tb, "add entry: %s %s",
|
||||
|
@ -466,6 +467,7 @@ static int __table_insert_fs(
|
|||
else
|
||||
list_add_tail(&fs->ents, head);
|
||||
|
||||
fs->tab = tb;
|
||||
tb->nents++;
|
||||
|
||||
DBG(TAB, ul_debugobj(tb, "insert entry: %s %s",
|
||||
|
@ -487,7 +489,6 @@ static int __table_insert_fs(
|
|||
* This function inncrements reference to @fs. Don't forget to use
|
||||
* mnt_unref_fs() after mnt_table_insert_fs() if you want to keep the @fs
|
||||
* referenced by the table only.
|
||||
|
||||
*
|
||||
* Returns: 0 on success or negative number in case of error.
|
||||
*/
|
||||
|
@ -497,10 +498,10 @@ int mnt_table_insert_fs(struct libmnt_table *tb, int before,
|
|||
if (!tb || !fs)
|
||||
return -EINVAL;
|
||||
|
||||
if (!list_empty(&fs->ents))
|
||||
if (fs->tab)
|
||||
return -EBUSY;
|
||||
|
||||
if (pos && mnt_table_find_fs(tb, pos) < 1)
|
||||
if (pos && pos->tab != tb)
|
||||
return -ENOENT;
|
||||
|
||||
mnt_ref_fs(fs);
|
||||
|
@ -529,10 +530,7 @@ int mnt_table_move_fs(struct libmnt_table *src, struct libmnt_table *dst,
|
|||
if (!src || !dst || !fs)
|
||||
return -EINVAL;
|
||||
|
||||
if (mnt_table_find_fs(src, fs) < 1)
|
||||
return -ENOENT;
|
||||
|
||||
if (pos && mnt_table_find_fs(dst, pos) < 1)
|
||||
if (fs->tab != src || (pos && pos->tab != dst))
|
||||
return -ENOENT;
|
||||
|
||||
/* remove from source */
|
||||
|
@ -557,9 +555,10 @@ int mnt_table_move_fs(struct libmnt_table *src, struct libmnt_table *dst,
|
|||
*/
|
||||
int mnt_table_remove_fs(struct libmnt_table *tb, struct libmnt_fs *fs)
|
||||
{
|
||||
if (!tb || !fs || mnt_table_find_fs(tb, fs) < 1)
|
||||
if (!tb || !fs || fs->tab != tb)
|
||||
return -EINVAL;
|
||||
|
||||
fs->tab = NULL;
|
||||
list_del_init(&fs->ents);
|
||||
|
||||
mnt_unref_fs(fs);
|
||||
|
@ -913,6 +912,9 @@ int mnt_table_set_iter(struct libmnt_table *tb, struct libmnt_iter *itr, struct
|
|||
if (!tb || !itr || !fs)
|
||||
return -EINVAL;
|
||||
|
||||
if (fs->tab != tb)
|
||||
return -ENOENT;
|
||||
|
||||
MNT_ITER_INIT(itr, &tb->ents);
|
||||
itr->p = &fs->ents;
|
||||
|
||||
|
|
Loading…
Reference in New Issue