mirror of
https://github.com/containers/fuse-overlayfs.git
synced 2025-08-04 02:15:58 -04:00
plugins: allow to manage multiple layers with a ds
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
parent
7095cc29ef
commit
1c490d91d8
9
direct.c
9
direct.c
@ -160,7 +160,7 @@ direct_readlinkat (struct ovl_layer *l, const char *path, char *buf, size_t bufs
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
direct_load_data_source (struct ovl_layer *l, const char *opaque, const char *path)
|
direct_load_data_source (struct ovl_layer *l, const char *opaque, const char *path, int n_layer)
|
||||||
{
|
{
|
||||||
l->path = realpath (path, NULL);
|
l->path = realpath (path, NULL);
|
||||||
if (l->path == NULL)
|
if (l->path == NULL)
|
||||||
@ -186,8 +186,15 @@ direct_cleanup (struct ovl_layer *l)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
direct_num_of_layers (const char *opaque, const char *path)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
struct data_source direct_access_ds =
|
struct data_source direct_access_ds =
|
||||||
{
|
{
|
||||||
|
.num_of_layers = direct_num_of_layers,
|
||||||
.load_data_source = direct_load_data_source,
|
.load_data_source = direct_load_data_source,
|
||||||
.cleanup = direct_cleanup,
|
.cleanup = direct_cleanup,
|
||||||
.file_exists = direct_file_exists,
|
.file_exists = direct_file_exists,
|
||||||
|
@ -119,7 +119,8 @@ struct ovl_layer
|
|||||||
/* a data_source defines the methods for accessing a lower layer. */
|
/* a data_source defines the methods for accessing a lower layer. */
|
||||||
struct data_source
|
struct data_source
|
||||||
{
|
{
|
||||||
int (*load_data_source)(struct ovl_layer *l, const char *opaque, const char *path);
|
int (*num_of_layers) (const char *opaque, const char *path);
|
||||||
|
int (*load_data_source)(struct ovl_layer *l, const char *opaque, const char *path, int n_layer);
|
||||||
int (*cleanup)(struct ovl_layer *l);
|
int (*cleanup)(struct ovl_layer *l);
|
||||||
int (*file_exists)(struct ovl_layer *l, const char *pathname);
|
int (*file_exists)(struct ovl_layer *l, const char *pathname);
|
||||||
int (*statat)(struct ovl_layer *l, const char *path, struct stat *st, int flags, unsigned int mask);
|
int (*statat)(struct ovl_layer *l, const char *path, struct stat *st, int flags, unsigned int mask);
|
||||||
|
68
main.c
68
main.c
@ -1549,16 +1549,14 @@ read_dirs (struct ovl_data *lo, char *path, bool low, struct ovl_layer *layers)
|
|||||||
{
|
{
|
||||||
char *name, *data;
|
char *name, *data;
|
||||||
char *it_path = it;
|
char *it_path = it;
|
||||||
|
int i, n_layers;
|
||||||
cleanup_layer struct ovl_layer *l = NULL;
|
cleanup_layer struct ovl_layer *l = NULL;
|
||||||
|
struct data_source *ds;
|
||||||
l = calloc (1, sizeof (*l));
|
|
||||||
if (l == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (it[0] != '/' || it[1] != '/')
|
if (it[0] != '/' || it[1] != '/')
|
||||||
{
|
{
|
||||||
/* By default use the direct access data store. */
|
/* By default use the direct access data store. */
|
||||||
l->ds = &direct_access_ds;
|
ds = &direct_access_ds;
|
||||||
|
|
||||||
data = NULL;
|
data = NULL;
|
||||||
path = it_path;
|
path = it_path;
|
||||||
@ -1603,43 +1601,59 @@ read_dirs (struct ovl_data *lo, char *path, bool low, struct ovl_layer *layers)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
l->ds = p->load (l, data, path);
|
ds = p->load (data, path);
|
||||||
if (l->ds == NULL)
|
if (ds == NULL)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "cannot load plugin %s\n", name);
|
fprintf (stderr, "cannot load plugin %s\n", name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
l->ovl_data = lo;
|
n_layers = ds->num_of_layers (data, path);
|
||||||
|
if (n_layers < 0)
|
||||||
l->path = NULL;
|
|
||||||
l->fd = -1;
|
|
||||||
|
|
||||||
if (l->ds->load_data_source (l, data, path) < 0)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "cannot load store %s at %s\n", data, path);
|
fprintf (stderr, "cannot retrieve number of layers for %s\n", path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
l->low = low;
|
for (i = 0; i < n_layers; i++)
|
||||||
if (low)
|
|
||||||
{
|
{
|
||||||
l->next = NULL;
|
l = calloc (1, sizeof (*l));
|
||||||
if (last == NULL)
|
if (l == NULL)
|
||||||
last = layers = l;
|
return NULL;
|
||||||
|
|
||||||
|
l->ds = ds;
|
||||||
|
|
||||||
|
l->ovl_data = lo;
|
||||||
|
|
||||||
|
l->path = NULL;
|
||||||
|
l->fd = -1;
|
||||||
|
|
||||||
|
if (l->ds->load_data_source (l, data, path, i) < 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "cannot load store %s at %s\n", data, path);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
l->low = low;
|
||||||
|
if (low)
|
||||||
|
{
|
||||||
|
l->next = NULL;
|
||||||
|
if (last == NULL)
|
||||||
|
last = layers = l;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last->next = l;
|
||||||
|
last = l;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
last->next = l;
|
l->next = layers;
|
||||||
last = l;
|
layers = l;
|
||||||
}
|
}
|
||||||
|
l = NULL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
l->next = layers;
|
|
||||||
layers = l;
|
|
||||||
}
|
|
||||||
l = NULL;
|
|
||||||
}
|
}
|
||||||
return layers;
|
return layers;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,10 @@ plugin_free_all (struct ovl_plugin_context *context)
|
|||||||
{
|
{
|
||||||
next = it->next;
|
next = it->next;
|
||||||
|
|
||||||
dlclose (it->handle);
|
it->release ();
|
||||||
|
|
||||||
|
/* Skip dlclose (it->handle) as it causes plugins written in Go to crash. */
|
||||||
|
|
||||||
free (it);
|
free (it);
|
||||||
|
|
||||||
it = next;
|
it = next;
|
||||||
|
4
plugin.h
4
plugin.h
@ -23,8 +23,8 @@
|
|||||||
# include <utils.h>
|
# include <utils.h>
|
||||||
# include <fuse-overlayfs.h>
|
# include <fuse-overlayfs.h>
|
||||||
|
|
||||||
typedef struct data_source *(*plugin_load_data_source)(struct ovl_layer *layer, const char *opaque, const char *path);
|
typedef struct data_source *(*plugin_load_data_source)(const char *opaque, const char *path);
|
||||||
typedef int (*plugin_release)(struct ovl_layer *layer);
|
typedef int (*plugin_release)();
|
||||||
typedef const char *(*plugin_name)();
|
typedef const char *(*plugin_name)();
|
||||||
typedef int (*plugin_version)();
|
typedef int (*plugin_version)();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user