X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_handler.c;h=5d778090643baf584236936915b856cbc117a212;hp=2ea2f1f002ce627f7607eef6fb7bf06ddb34ff3c;hb=0c69c941cdae8cc41a3daaa9184ef2468a24aa09;hpb=dd520a37ad28c94921d3bb1444449967d95d72e8 diff --git a/lustre/osd-zfs/osd_handler.c b/lustre/osd-zfs/osd_handler.c index 2ea2f1f..5d77809 100644 --- a/lustre/osd-zfs/osd_handler.c +++ b/lustre/osd-zfs/osd_handler.c @@ -664,6 +664,16 @@ struct lu_context_key osd_key = { .lct_exit = osd_key_exit }; +static void osd_fid_fini(const struct lu_env *env, struct osd_device *osd) +{ + if (osd->od_cl_seq == NULL) + return; + + seq_client_fini(osd->od_cl_seq); + OBD_FREE_PTR(osd->od_cl_seq); + osd->od_cl_seq = NULL; +} + static int osd_shutdown(const struct lu_env *env, struct osd_device *o) { ENTRY; @@ -674,6 +684,8 @@ static int osd_shutdown(const struct lu_env *env, struct osd_device *o) o->od_quota_slave = NULL; } + osd_fid_fini(env, o); + RETURN(0); } @@ -1096,6 +1108,33 @@ static int osd_obd_disconnect(struct obd_export *exp) RETURN(rc); } +static int osd_fid_init(const struct lu_env *env, struct osd_device *osd) +{ + struct seq_server_site *ss = osd_seq_site(osd); + int rc; + ENTRY; + + if (osd->od_is_ost || osd->od_cl_seq != NULL) + RETURN(0); + + if (unlikely(ss == NULL)) + RETURN(-ENODEV); + + OBD_ALLOC_PTR(osd->od_cl_seq); + if (osd->od_cl_seq == NULL) + RETURN(-ENOMEM); + + rc = seq_client_init(osd->od_cl_seq, NULL, LUSTRE_SEQ_METADATA, + osd->od_svname, ss->ss_server_seq); + + if (rc != 0) { + OBD_FREE_PTR(osd->od_cl_seq); + osd->od_cl_seq = NULL; + } + + RETURN(rc); +} + static int osd_prepare(const struct lu_env *env, struct lu_device *pdev, struct lu_device *dev) { @@ -1103,9 +1142,14 @@ static int osd_prepare(const struct lu_env *env, struct lu_device *pdev, int rc = 0; ENTRY; - if (osd->od_quota_slave != NULL) + if (osd->od_quota_slave != NULL) { /* set up quota slave objects */ rc = qsd_prepare(env, osd->od_quota_slave); + if (rc != 0) + RETURN(rc); + } + + rc = osd_fid_init(env, osd); RETURN(rc); }