Skip to content

Commit

Permalink
Allocate callback functions per session.
Browse files Browse the repository at this point in the history
Instead of using a static global variable with the callback functions
allocate the callbacks as part of the session structure or context so we
can have different sets of callbacks for each session.

We also check that the actual function pointer is non-NULL before calling it.
  • Loading branch information
Marco van Wieringen committed Nov 16, 2015
1 parent a50b481 commit 86ce108
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 114 deletions.
16 changes: 9 additions & 7 deletions src/dird/ndmp_dma.c
Expand Up @@ -1640,7 +1640,7 @@ extern "C" int bndmp_add_dirnode_root(struct ndmlog *ixlog, int tagc,
/*
* This glues the NDMP File Handle DB with internal code.
*/
static inline void register_callback_hooks(void)
static inline void register_callback_hooks(struct ndmlog *ixlog)
{
struct ndm_fhdb_callbacks fhdb_callbacks;

Expand All @@ -1651,12 +1651,12 @@ static inline void register_callback_hooks(void)
fhdb_callbacks.add_dir = bndmp_add_dir;
fhdb_callbacks.add_node = bndmp_add_node;
fhdb_callbacks.add_dirnode_root = bndmp_add_dirnode_root;
ndmfhdb_register_callbacks(&fhdb_callbacks);
ndmfhdb_register_callbacks(ixlog, &fhdb_callbacks);
}

static inline void unregister_callback_hooks(void)
static inline void unregister_callback_hooks(struct ndmlog *ixlog)
{
ndmfhdb_unregister_callbacks();
ndmfhdb_unregister_callbacks(ixlog);
}

/*
Expand Down Expand Up @@ -2080,8 +2080,6 @@ bool do_ndmp_backup(JCR *jcr)
goto bail_out;
}

register_callback_hooks();

/*
* Loop over each include set of the fileset and fire off a NDMP backup of the included fileset.
*/
Expand Down Expand Up @@ -2197,6 +2195,7 @@ bool do_ndmp_backup(JCR *jcr)
* function as we catch the index information via callbacks.
*/
ndmp_sess.control_acb->job.index_log.ctx = ndmp_sess.param->log.ctx;
register_callback_hooks(&ndmp_sess.control_acb->job.index_log);

/*
* Let the DMA perform its magic.
Expand All @@ -2205,6 +2204,8 @@ bool do_ndmp_backup(JCR *jcr)
goto cleanup;
}

unregister_callback_hooks(&ndmp_sess.control_acb->job.index_log);

/*
* See if there were any errors during the backup.
*/
Expand Down Expand Up @@ -2294,6 +2295,8 @@ bool do_ndmp_backup(JCR *jcr)
free(ndmp_sess.control_acb->job.tape_device);
}

unregister_callback_hooks(&ndmp_sess.control_acb->job.index_log);

/*
* Destroy the session.
*/
Expand Down Expand Up @@ -2329,7 +2332,6 @@ bool do_ndmp_backup(JCR *jcr)
}

ok_out:
unregister_callback_hooks();
free_paired_storage(jcr);

if (status == JS_Terminated) {
Expand Down
37 changes: 18 additions & 19 deletions src/ndmp/ndma_robot_simulator.c
Expand Up @@ -50,28 +50,27 @@
* interface
*/

static struct ndm_robot_simulator_callbacks *nrsc = NULL;

void
ndmos_scsi_register_callbacks (struct ndm_robot_simulator_callbacks *callbacks)
ndmos_scsi_register_callbacks (struct ndm_session *sess,
struct ndm_robot_simulator_callbacks *callbacks)
{
/*
* Only allow one register.
*/
if (!nrsc) {
nrsc = NDMOS_API_MALLOC (sizeof(struct ndm_robot_simulator_callbacks));
if (nrsc) {
memcpy (nrsc, callbacks, sizeof(struct ndm_robot_simulator_callbacks));
if (!sess->nrsc) {
sess->nrsc = NDMOS_API_MALLOC (sizeof(struct ndm_robot_simulator_callbacks));
if (sess->nrsc) {
memcpy (sess->nrsc, callbacks, sizeof(struct ndm_robot_simulator_callbacks));
}
}
}

void
ndmos_scsi_unregister_callbacks (void)
ndmos_scsi_unregister_callbacks (struct ndm_session *sess)
{
if (nrsc) {
NDMOS_API_FREE (nrsc);
nrsc = NULL;
if (sess->nrsc) {
NDMOS_API_FREE (sess->nrsc);
sess->nrsc = NULL;
}
}

Expand Down Expand Up @@ -102,8 +101,8 @@ ndmos_scsi_open (struct ndm_session *sess, char *name)
if (!name || strlen(name) > NDMOS_CONST_PATH_MAX - 1)
return NDMP9_NO_DEVICE_ERR;

if (nrsc) {
err = nrsc->scsi_open(sess, name);
if (sess->nrsc && sess->nrsc->scsi_open) {
err = sess->nrsc->scsi_open(sess, name);
if (err != NDMP9_NO_ERR)
return err;
}
Expand All @@ -116,8 +115,8 @@ ndmos_scsi_close (struct ndm_session *sess)
{
ndmp9_error err;

if (nrsc) {
err = nrsc->scsi_close(sess);
if (sess->nrsc && sess->nrsc->scsi_close) {
err = sess->nrsc->scsi_close(sess);
if (err != NDMP9_NO_ERR)
return err;
}
Expand All @@ -140,8 +139,8 @@ ndmos_scsi_reset_device (struct ndm_session *sess)
ndmp9_error err;
struct ndm_robot_agent * ra = sess->robot_acb;

if (nrsc) {
err = nrsc->scsi_reset(sess);
if (sess->nrsc && sess->nrsc->scsi_reset) {
err = sess->nrsc->scsi_reset(sess);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down Expand Up @@ -170,8 +169,8 @@ ndmos_scsi_execute_cdb (struct ndm_session *sess,
if (request->cdb.cdb_len < 1)
return NDMP9_ILLEGAL_ARGS_ERR;

if (nrsc) {
err = nrsc->scsi_execute_cdb(sess, request, reply);
if (sess->nrsc && sess->nrsc->scsi_execute_cdb) {
err = sess->nrsc->scsi_execute_cdb(sess, request, reply);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down
43 changes: 21 additions & 22 deletions src/ndmp/ndma_tape_simulator.c
Expand Up @@ -42,26 +42,25 @@

#ifdef NDMOS_OPTION_TAPE_SIMULATOR

static struct ndm_tape_simulator_callbacks *ntsc = NULL;

void
ndmos_tape_register_callbacks (struct ndm_tape_simulator_callbacks *callbacks)
ndmos_tape_register_callbacks (struct ndm_session *sess,
struct ndm_tape_simulator_callbacks *callbacks)
{
/*
* Only allow one register.
*/
if (!ntsc) {
ntsc = NDMOS_API_MALLOC (sizeof(struct ndm_tape_simulator_callbacks));
memcpy(ntsc, callbacks, sizeof(struct ndm_tape_simulator_callbacks));
if (!sess->ntsc) {
sess->ntsc = NDMOS_API_MALLOC (sizeof(struct ndm_tape_simulator_callbacks));
memcpy(sess->ntsc, callbacks, sizeof(struct ndm_tape_simulator_callbacks));
}
}

void
ndmos_tape_unregister_callbacks (void)
ndmos_tape_unregister_callbacks (struct ndm_session *sess)
{
if (!ntsc) {
NDMOS_API_FREE (ntsc);
ntsc = NULL;
if (!sess->ntsc) {
NDMOS_API_FREE (sess->ntsc);
sess->ntsc = NULL;
}
}

Expand Down Expand Up @@ -90,8 +89,8 @@ ndmos_tape_open (struct ndm_session *sess, char *drive_name, int will_write)
return NDMP9_DEVICE_OPENED_ERR;
}

if (ntsc) {
err = ntsc->tape_open(sess, drive_name, will_write);
if (sess->ntsc && sess->ntsc->tape_open) {
err = sess->ntsc->tape_open(sess, drive_name, will_write);
if (err != NDMP9_NO_ERR)
return err;
}
Expand All @@ -109,8 +108,8 @@ ndmos_tape_close (struct ndm_session *sess)
return NDMP9_DEV_NOT_OPEN_ERR;
}

if (ntsc) {
err = ntsc->tape_close(sess);
if (sess->ntsc && sess->ntsc->tape_close) {
err = sess->ntsc->tape_close(sess);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down Expand Up @@ -180,8 +179,8 @@ ndmos_tape_mtio (struct ndm_session *sess,
return NDMP9_ILLEGAL_ARGS_ERR;
}

if (ntsc) {
err = ntsc->tape_mtio(sess, op, count, resid);
if (sess->ntsc && sess->ntsc->tape_mtio) {
err = sess->ntsc->tape_mtio(sess, op, count, resid);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down Expand Up @@ -215,8 +214,8 @@ ndmos_tape_write (struct ndm_session *sess,
return NDMP9_NO_ERR;
}

if (ntsc) {
err = ntsc->tape_write(sess, buf, count, done_count);
if (sess->ntsc && sess->ntsc->tape_write) {
err = sess->ntsc->tape_write(sess, buf, count, done_count);
if (err != NDMP9_NO_ERR)
return err;
}
Expand All @@ -240,8 +239,8 @@ ndmos_tape_wfm (struct ndm_session *sess)
return NDMP9_PERMISSION_ERR;
}

if (ntsc) {
err = ntsc->tape_wfm(sess);
if (sess->ntsc && sess->ntsc->tape_wfm) {
err = sess->ntsc->tape_wfm(sess);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down Expand Up @@ -272,8 +271,8 @@ ndmos_tape_read (struct ndm_session *sess,
return NDMP9_NO_ERR;
}

if (ntsc) {
err = ntsc->tape_read(sess, buf, count, done_count);
if (sess->ntsc && sess->ntsc->tape_read) {
err = sess->ntsc->tape_read(sess, buf, count, done_count);
if (err != NDMP9_NO_ERR)
return err;
}
Expand Down
16 changes: 10 additions & 6 deletions src/ndmp/ndmagents.h
Expand Up @@ -1098,11 +1098,15 @@ struct ndm_session {
#endif /* !NDMOS_OPTION_NO_DATA_AGENT */
#ifndef NDMOS_OPTION_NO_TAPE_AGENT
struct ndm_tape_agent *tape_acb;
struct ndm_tape_simulator_callbacks *ntsc;
#endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
#ifndef NDMOS_OPTION_NO_ROBOT_AGENT
struct ndm_robot_agent *robot_acb;
struct ndm_robot_simulator_callbacks *nrsc;
#endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */

struct ndm_auth_callbacks *nac;

struct ndm_plumbing plumb;

struct ndm_session_param *param;
Expand Down Expand Up @@ -1241,9 +1245,9 @@ struct ndm_auth_callbacks {
int (*validate_md5)(struct ndm_session *sess, char *name, char digest[16]);
};

extern void ndmos_auth_register_callbacks (
extern void ndmos_auth_register_callbacks (struct ndm_session *sess,
struct ndm_auth_callbacks *callbacks);
extern void ndmos_auth_unregister_callbacks (void);
extern void ndmos_auth_unregister_callbacks (struct ndm_session *sess);
extern int ndmos_ok_name_password (struct ndm_session *sess,
char *name, char *pass);
extern int ndmos_get_md5_challenge (struct ndm_session *sess);
Expand Down Expand Up @@ -1278,9 +1282,9 @@ struct ndm_tape_simulator_callbacks {
char *buf, u_long count, u_long *done_count);
};

extern void ndmos_tape_register_callbacks (
extern void ndmos_tape_register_callbacks (struct ndm_session *sess,
struct ndm_tape_simulator_callbacks *callbacks);
extern void ndmos_tape_unregister_callbacks (void);
extern void ndmos_tape_unregister_callbacks (struct ndm_session *sess);
extern int ndmos_tape_initialize (struct ndm_session *sess);
extern ndmp9_error ndmos_tape_open (struct ndm_session *sess,
char *drive_name, int will_write);
Expand Down Expand Up @@ -1312,9 +1316,9 @@ struct ndm_robot_simulator_callbacks {
ndmp9_execute_cdb_reply *reply);
};

extern void ndmos_scsi_register_callbacks (
extern void ndmos_scsi_register_callbacks (struct ndm_session *sess,
struct ndm_robot_simulator_callbacks *callbacks);
extern void ndmos_scsi_unregister_callbacks (void);
extern void ndmos_scsi_unregister_callbacks (struct ndm_session *sess);
extern int ndmos_scsi_initialize (struct ndm_session *sess);
extern void ndmos_scsi_sync_state (struct ndm_session *sess);
extern void ndmos_scsi_sync_config_info (struct ndm_session *sess);
Expand Down
6 changes: 4 additions & 2 deletions src/ndmp/ndmjob.h
Expand Up @@ -139,8 +139,10 @@ extern void ndmjob_ixlog_deliver(struct ndmlog *log, char *tag,

#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */

extern void ndmjob_register_callbacks (void);
extern void ndmjob_unregister_callbacks (void);
extern void ndmjob_register_callbacks (struct ndm_session *sess,
struct ndmlog *ixlog);
extern void ndmjob_unregister_callbacks (struct ndm_session *sess,
struct ndmlog *ixlog);

extern int ndmjobfhdb_add_file (struct ndmlog *ixlog, int tagc,
char *raw_name, ndmp9_file_stat *fstat);
Expand Down
4 changes: 2 additions & 2 deletions src/ndmp/ndmjob_main.c
Expand Up @@ -44,7 +44,7 @@ exit_program (void)
ndma_destroy_env_list (&E_environment);
ndma_destroy_env_list (&ji_environment);

ndmjob_unregister_callbacks ();
ndmjob_unregister_callbacks (&the_session, &the_param.log);

exit (0);
}
Expand Down Expand Up @@ -98,7 +98,7 @@ main (int ac, char *av[])
exit_program ();
}

ndmjob_register_callbacks ();
ndmjob_register_callbacks (&the_session, &the_param.log);

#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
build_job(); /* might not return */
Expand Down
20 changes: 10 additions & 10 deletions src/ndmp/ndmjob_simulator.c
Expand Up @@ -1639,7 +1639,7 @@ ndmjob_validate_md5 (struct ndm_session *sess, char *name, char digest[16])
}

void
ndmjob_register_callbacks (void)
ndmjob_register_callbacks (struct ndm_session *sess, struct ndmlog *ixlog)
{
#ifdef NDMOS_OPTION_TAPE_SIMULATOR
struct ndm_tape_simulator_callbacks tape_callbacks;
Expand All @@ -1658,7 +1658,7 @@ ndmjob_register_callbacks (void)
tape_callbacks.tape_wfm = ndmjob_tape_wfm;
tape_callbacks.tape_read = ndmjob_tape_read;

ndmos_tape_register_callbacks (&tape_callbacks);
ndmos_tape_register_callbacks (sess, &tape_callbacks);
#endif /* NDMOS_OPTION_TAPE_SIMULATOR */

#ifdef NDMOS_OPTION_ROBOT_SIMULATOR
Expand All @@ -1667,31 +1667,31 @@ ndmjob_register_callbacks (void)
robot_callbacks.scsi_reset = ndmjob_scsi_reset;
robot_callbacks.scsi_execute_cdb = ndmjob_scsi_execute_cdb;

ndmos_scsi_register_callbacks (&robot_callbacks);
ndmos_scsi_register_callbacks (sess, &robot_callbacks);
#endif /* NDMOS_OPTION_ROBOT_SIMULATOR */

auth_callbacks.validate_password = ndmjob_validate_password;
auth_callbacks.validate_md5 = ndmjob_validate_md5;

ndmos_auth_register_callbacks (&auth_callbacks);
ndmos_auth_register_callbacks (sess, &auth_callbacks);

fhdb_callbacks.add_file = ndmjobfhdb_add_file;
fhdb_callbacks.add_dir = ndmjobfhdb_add_dir;
fhdb_callbacks.add_node = ndmjobfhdb_add_node;
fhdb_callbacks.add_dirnode_root = ndmjobfhdb_add_dirnode_root;

ndmfhdb_register_callbacks (&fhdb_callbacks);
ndmfhdb_register_callbacks (ixlog, &fhdb_callbacks);
}

void
ndmjob_unregister_callbacks (void)
ndmjob_unregister_callbacks (struct ndm_session *sess, struct ndmlog *ixlog)
{
ndmfhdb_unregister_callbacks ();
ndmos_auth_unregister_callbacks ();
ndmfhdb_unregister_callbacks (ixlog);
ndmos_auth_unregister_callbacks (sess);
#ifdef NDMOS_OPTION_ROBOT_SIMULATOR
ndmos_scsi_unregister_callbacks ();
ndmos_scsi_unregister_callbacks (sess);
#endif /* NDMOS_OPTION_ROBOT_SIMULATOR */
#ifdef NDMOS_OPTION_TAPE_SIMULATOR
ndmos_auth_unregister_callbacks ();
ndmos_auth_unregister_callbacks (sess);
#endif /* NDMOS_OPTION_TAPE_SIMULATOR */
}

0 comments on commit 86ce108

Please sign in to comment.