2011-07-22 10:43:40 +00:00
|
|
|
// (c) 2010 Thomas Schoebel-Theuer / 1&1 Internet AG
|
|
|
|
// OLD CODE => will disappear!
|
|
|
|
#ifndef _OLD_STRATEGY
|
|
|
|
#define _OLD_STRATEGY
|
|
|
|
|
|
|
|
#define _STRATEGY // call this only in strategy bricks, never in ordinary bricks
|
|
|
|
|
|
|
|
#include "../mars.h"
|
|
|
|
|
|
|
|
#define MARS_ARGV_MAX 4
|
|
|
|
#define MARS_PATH_MAX 256
|
|
|
|
|
|
|
|
extern char *my_id(void);
|
|
|
|
|
|
|
|
#define MARS_DENT(TYPE) \
|
|
|
|
struct list_head dent_link; \
|
|
|
|
struct list_head brick_list; \
|
|
|
|
struct TYPE *d_parent; \
|
|
|
|
char *d_argv[MARS_ARGV_MAX]; /* for internal use, will be automatically deallocated*/ \
|
|
|
|
char *d_args; /* ditto uninterpreted */ \
|
|
|
|
char *d_name; /* current path component */ \
|
|
|
|
char *d_rest; /* some "meaningful" rest of d_name*/ \
|
|
|
|
char *d_path; /* full absolute path */ \
|
|
|
|
int d_namelen; \
|
|
|
|
int d_pathlen; \
|
|
|
|
int d_depth; \
|
|
|
|
unsigned int d_type; /* from readdir() => often DT_UNKNOWN => don't rely on it, use new_stat.mode instead */ \
|
|
|
|
int d_class; /* for pre-grouping order */ \
|
|
|
|
int d_serial; /* for pre-grouping order */ \
|
|
|
|
int d_version; /* dynamic programming per call of mars_ent_work() */ \
|
|
|
|
char d_once_error; \
|
|
|
|
bool d_killme; \
|
|
|
|
struct kstat new_stat; \
|
|
|
|
struct kstat old_stat; \
|
|
|
|
char *new_link; \
|
|
|
|
char *old_link; \
|
|
|
|
struct mars_global *d_global; \
|
|
|
|
void *d_private;
|
|
|
|
|
|
|
|
struct mars_dent {
|
|
|
|
MARS_DENT(mars_dent);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern const struct meta mars_kstat_meta[];
|
|
|
|
extern const struct meta mars_dent_meta[];
|
|
|
|
|
|
|
|
struct mars_global {
|
|
|
|
struct rw_semaphore dent_mutex;
|
|
|
|
struct rw_semaphore brick_mutex;
|
|
|
|
struct generic_switch global_power;
|
|
|
|
struct list_head dent_anchor;
|
|
|
|
struct list_head brick_anchor;
|
2011-08-31 11:42:04 +00:00
|
|
|
struct list_head server_anchor;
|
2011-07-22 10:43:40 +00:00
|
|
|
wait_queue_head_t main_event;
|
2012-01-23 17:40:15 +00:00
|
|
|
loff_t total_space;
|
2011-11-08 12:33:13 +00:00
|
|
|
loff_t remaining_space;
|
2011-10-10 13:03:10 +00:00
|
|
|
int global_version;
|
2012-02-01 14:05:49 +00:00
|
|
|
int deleted_border;
|
|
|
|
int deleted_min;
|
2012-02-01 12:47:35 +00:00
|
|
|
bool main_trigger;
|
2012-01-23 15:13:29 +00:00
|
|
|
bool exhausted;
|
2011-07-22 10:43:40 +00:00
|
|
|
};
|
|
|
|
|
2011-10-24 10:54:15 +00:00
|
|
|
typedef int (*mars_dent_checker_fn)(struct mars_dent *parent, const char *name, int namlen, unsigned int d_type, int *prefix, int *serial);
|
|
|
|
typedef int (*mars_dent_worker_fn)(struct mars_global *global, struct mars_dent *dent, bool prepare, bool direction);
|
2011-07-22 10:43:40 +00:00
|
|
|
|
2011-10-24 10:54:15 +00:00
|
|
|
extern int mars_dent_work(struct mars_global *global, char *dirname, int allocsize, mars_dent_checker_fn checker, mars_dent_worker_fn worker, void *buf, int maxdepth);
|
|
|
|
extern struct mars_dent *_mars_find_dent(struct mars_global *global, const char *path);
|
2011-07-22 10:43:40 +00:00
|
|
|
extern struct mars_dent *mars_find_dent(struct mars_global *global, const char *path);
|
2011-09-27 08:46:14 +00:00
|
|
|
extern int mars_find_dent_all(struct mars_global *global, char *prefix, struct mars_dent ***table);
|
2011-07-22 10:43:40 +00:00
|
|
|
extern void mars_kill_dent(struct mars_dent *dent);
|
|
|
|
extern void mars_free_dent(struct mars_dent *dent);
|
2011-09-27 08:46:14 +00:00
|
|
|
extern void mars_free_dent_all(struct mars_global *global, struct list_head *anchor);
|
2011-07-22 10:43:40 +00:00
|
|
|
|
|
|
|
// low-level brick instantiation
|
|
|
|
|
|
|
|
extern struct mars_brick *mars_find_brick(struct mars_global *global, const void *brick_type, const char *path);
|
2011-09-02 12:17:40 +00:00
|
|
|
extern struct mars_brick *mars_make_brick(struct mars_global *global, struct mars_dent *belongs, bool is_server, const void *_brick_type, const char *path, const char *name);
|
2011-07-22 10:43:40 +00:00
|
|
|
extern int mars_free_brick(struct mars_brick *brick);
|
|
|
|
extern int mars_kill_brick(struct mars_brick *brick);
|
2011-08-31 11:42:04 +00:00
|
|
|
extern int mars_kill_brick_all(struct mars_global *global, struct list_head *anchor, bool use_dent_link);
|
2011-11-04 15:43:23 +00:00
|
|
|
extern int mars_kill_brick_when_possible(struct mars_global *global, struct list_head *anchor, bool use_dent_link, const struct mars_brick_type *type, bool only_off);
|
2011-07-22 10:43:40 +00:00
|
|
|
|
|
|
|
// mid-level brick instantiation (identity is based on path strings)
|
|
|
|
|
|
|
|
extern char *vpath_make(const char *fmt, va_list *args);
|
|
|
|
extern char *path_make(const char *fmt, ...);
|
|
|
|
extern char *backskip_replace(const char *path, char delim, bool insert, const char *fmt, ...);
|
|
|
|
|
|
|
|
extern struct mars_brick *path_find_brick(struct mars_global *global, const void *brick_type, const char *fmt, ...);
|
|
|
|
|
|
|
|
/* Create a new brick and connect its inputs to a set of predecessors.
|
|
|
|
* When @timeout > 0, switch on the brick as well as its predecessors.
|
|
|
|
*/
|
|
|
|
extern struct mars_brick *make_brick_all(
|
|
|
|
struct mars_global *global,
|
|
|
|
struct mars_dent *belongs,
|
2011-09-02 12:17:40 +00:00
|
|
|
bool is_server,
|
2011-08-25 10:16:32 +00:00
|
|
|
int (*setup_fn)(struct mars_brick *brick, void *private),
|
2011-07-22 10:43:40 +00:00
|
|
|
void *private,
|
|
|
|
int timeout,
|
|
|
|
const char *new_name,
|
|
|
|
const struct generic_brick_type *new_brick_type,
|
|
|
|
const struct generic_brick_type *prev_brick_type[],
|
|
|
|
const char *switch_fmt,
|
2011-11-03 11:31:47 +00:00
|
|
|
int switch_override, // -1 = off, +1 = on, 0 = let switch decide
|
2011-07-22 10:43:40 +00:00
|
|
|
const char *new_fmt,
|
|
|
|
const char *prev_fmt[],
|
|
|
|
int prev_count,
|
|
|
|
...
|
|
|
|
);
|
|
|
|
|
|
|
|
// general MARS infrastructure
|
|
|
|
|
|
|
|
#define MARS_ERR_ONCE(dent, args...) if (!dent->d_once_error++) MARS_ERR(args)
|
|
|
|
|
|
|
|
/* General fs wrappers (for abstraction)
|
|
|
|
*/
|
|
|
|
extern int mars_stat(const char *path, struct kstat *stat, bool use_lstat);
|
|
|
|
extern int mars_mkdir(const char *path);
|
2011-10-24 10:54:15 +00:00
|
|
|
extern int mars_unlink(const char *path);
|
2011-07-22 10:43:40 +00:00
|
|
|
extern int mars_symlink(const char *oldpath, const char *newpath, const struct timespec *stamp, uid_t uid);
|
|
|
|
extern int mars_rename(const char *oldpath, const char *newpath);
|
|
|
|
extern int mars_chmod(const char *path, mode_t mode);
|
|
|
|
extern int mars_lchown(const char *path, uid_t uid);
|
2012-01-23 17:40:15 +00:00
|
|
|
extern void mars_remaining_space(const char *fspath, loff_t *total, loff_t *remaining);
|
2011-07-22 10:43:40 +00:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
extern struct mars_global *mars_global;
|
|
|
|
|
|
|
|
extern int mars_power_button(struct mars_brick *brick, bool val, bool force_off);
|
|
|
|
extern int mars_power_button_recursive(struct mars_brick *brick, bool val, bool force_off, int timeout);
|
|
|
|
|
2011-08-25 10:16:32 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2012-02-08 18:12:57 +00:00
|
|
|
// quirk
|
|
|
|
|
|
|
|
#ifdef CONFIG_MARS_LOADAVG_LIMIT
|
|
|
|
extern int mars_max_loadavg;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-08-25 10:16:32 +00:00
|
|
|
// init
|
|
|
|
|
|
|
|
extern int init_sy(void);
|
|
|
|
extern void exit_sy(void);
|
|
|
|
|
|
|
|
extern int init_sy_net(void);
|
|
|
|
extern void exit_sy_net(void);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|