X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosp%2Fosp_dev.c;h=f20d8c6fee1ab2283a35c66b18738063fedce8c3;hb=107c1d022ffd976b4a335f794de731cf9d57a514;hp=2a9d30f9ff63c0cb56751abed0394fc49bdeb72d;hpb=0585b0fb5895a24f07ca32e830d1fa72b75f4f2b;p=fs%2Flustre-release.git diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index 2a9d30f..f20d8c6 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -75,10 +75,12 @@ #define DEBUG_SUBSYSTEM S_MDS #include -#include + #include -#include #include +#include +#include +#include #include "osp_internal.h" @@ -453,10 +455,11 @@ static void osp_last_used_fini(const struct lu_env *env, struct osp_device *osp) */ static int osp_disconnect(struct osp_device *d) { + struct obd_device *obd = d->opd_obd; struct obd_import *imp; int rc = 0; - imp = d->opd_obd->u.cli.cl_import; + imp = obd->u.cli.cl_import; /* Mark import deactivated now, so we don't try to reconnect if any * of the cleanup RPCs fails (e.g. ldlm cancel, etc). We don't @@ -475,8 +478,7 @@ static int osp_disconnect(struct osp_device *d) rc = ptlrpc_disconnect_import(imp, 0); if (rc != 0) - CERROR("%s: can't disconnect: rc = %d\n", - d->opd_obd->obd_name, rc); + CERROR("%s: can't disconnect: rc = %d\n", obd->obd_name, rc); ptlrpc_invalidate_import(imp); @@ -564,7 +566,7 @@ static void osp_update_fini(const struct lu_env *env, struct osp_device *osp) LASSERT(our->our_th != NULL); osp_trans_callback(env, our->our_th, -EIO); /* our will be destroyed in osp_thandle_put() */ - osp_thandle_put(our->our_th); + osp_thandle_put(env, our->our_th); } spin_unlock(&ou->ou_lock); @@ -634,6 +636,8 @@ static int osp_process_config(const struct lu_env *env, case LCFG_PRE_CLEANUP: rc = osp_disconnect(d); osp_update_fini(env, d); + if (obd->obd_namespace != NULL) + ldlm_namespace_free_prior(obd->obd_namespace, NULL, 1); break; case LCFG_CLEANUP: lu_dev_del_linkage(dev->ld_site, dev); @@ -719,9 +723,13 @@ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, struct obd_statfs *sfs) { struct osp_device *d = dt2osp_dev(dev); + struct obd_import *imp = d->opd_obd->u.cli.cl_import; ENTRY; + if (imp->imp_state == LUSTRE_IMP_CLOSED) + RETURN(-ESHUTDOWN); + if (unlikely(d->opd_imp_active == 0)) RETURN(-ENOTCONN); @@ -752,17 +760,7 @@ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, LPU64" files, "LPU64" free files\n", d->opd_obd->obd_name, sfs->os_blocks, sfs->os_bfree, sfs->os_bavail, sfs->os_files, sfs->os_ffree); - - /* ENOSPC could be for two reasons, - * 1) not enough inodes 2) not enough blocks - * for 1) lod should use preallocated objects - * and for 2) shouldn`t. So, here for ENOSPC - * different values is returned to spend preallocated. - */ - if (d->opd_pre_status == -ENOSPC && sfs->os_ffree < 32) - RETURN(0); - - RETURN(d->opd_pre_status); + RETURN(0); } static int osp_sync_timeout(void *data) @@ -815,7 +813,7 @@ static int osp_sync(const struct lu_env *env, struct dt_device *dev) if (rc != 0) GOTO(out, rc); - CDEBUG(D_CACHE, "%s: id: used %lu, processed %lu\n", + CDEBUG(D_CACHE, "%s: id: used %lu, processed "LPU64"\n", d->opd_obd->obd_name, id, d->opd_syn_last_processed_id); /* wait till all-in-line are processed */ @@ -848,26 +846,27 @@ static int osp_sync(const struct lu_env *env, struct dt_device *dev) atomic_inc(&d->opd_syn_barrier); CDEBUG(D_CACHE, "%s: %u in flight\n", d->opd_obd->obd_name, - d->opd_syn_rpc_in_flight); + atomic_read(&d->opd_syn_rpc_in_flight)); /* wait till all-in-flight are replied, so executed by the target */ /* XXX: this is used by LFSCK at the moment, which doesn't require * all the changes to be committed, but in general it'd be * better to wait till commit */ - while (d->opd_syn_rpc_in_flight > 0) { + while (atomic_read(&d->opd_syn_rpc_in_flight) > 0) { - old = d->opd_syn_rpc_in_flight; + old = atomic_read(&d->opd_syn_rpc_in_flight); expire = cfs_time_shift(obd_timeout); lwi = LWI_TIMEOUT(expire - cfs_time_current(), osp_sync_timeout, d); l_wait_event(d->opd_syn_barrier_waitq, - d->opd_syn_rpc_in_flight == 0, &lwi); + atomic_read(&d->opd_syn_rpc_in_flight) == 0, + &lwi); - if (d->opd_syn_rpc_in_flight == 0) + if (atomic_read(&d->opd_syn_rpc_in_flight) == 0) break; - if (d->opd_syn_rpc_in_flight != old) { + if (atomic_read(&d->opd_syn_rpc_in_flight) != old) { /* some progress have been made */ continue; } @@ -1324,21 +1323,18 @@ static struct lu_device *osp_device_fini(const struct lu_env *env, struct lu_device *ld) { struct osp_device *osp = lu2osp_dev(ld); - struct obd_import *imp; int rc; ENTRY; if (osp->opd_async_requests != NULL) { - osp_update_request_destroy(osp->opd_async_requests); + osp_update_request_destroy(env, osp->opd_async_requests); osp->opd_async_requests = NULL; } if (osp->opd_storage_exp) obd_disconnect(osp->opd_storage_exp); - imp = osp->opd_obd->u.cli.cl_import; - if (osp->opd_symlink) lprocfs_remove(&osp->opd_symlink); @@ -1433,10 +1429,10 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, *ocd = *data; imp->imp_connect_flags_orig = ocd->ocd_connect_flags; + imp->imp_connect_flags2_orig = ocd->ocd_connect_flags2; ocd->ocd_version = LUSTRE_VERSION_CODE; ocd->ocd_index = data->ocd_index; - imp->imp_connect_flags_orig = ocd->ocd_connect_flags; rc = ptlrpc_connect_import(imp); if (rc) { @@ -1579,6 +1575,7 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, enum obd_import_event event) { struct osp_device *d = lu2osp_dev(obd->obd_lu_dev); + int rc; switch (event) { case IMP_EVENT_DISCON: @@ -1597,11 +1594,14 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, case IMP_EVENT_INACTIVE: d->opd_imp_active = 0; d->opd_imp_connected = 0; + d->opd_obd->obd_inactive = 1; if (d->opd_connect_mdt) break; - if (d->opd_pre != NULL) { - osp_pre_update_status(d, -ENODEV); + /* Import is invalid, we can`t get stripes so + * wakeup waiters */ + rc = imp->imp_deactive ? -ESHUTDOWN : -ENODEV; + osp_pre_update_status(d, rc); wake_up(&d->opd_pre_waitq); } @@ -1614,6 +1614,7 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, d->opd_new_connection = 1; d->opd_imp_connected = 1; d->opd_imp_seen_connected = 1; + d->opd_obd->obd_inactive = 0; if (d->opd_connect_mdt) break; @@ -1624,6 +1625,9 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, CDEBUG(D_HA, "got connected\n"); break; case IMP_EVENT_INVALIDATE: + if (d->opd_connect_mdt) + osp_invalidate_request(d); + if (obd->obd_namespace == NULL) break; ldlm_namespace_cleanup(obd->obd_namespace, LDLM_FL_LOCAL_ONLY); @@ -1657,7 +1661,7 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, * \retval negative negative errno if the ioctl handling failed. */ static int osp_iocontrol(unsigned int cmd, struct obd_export *exp, int len, - void *karg, void *uarg) + void *karg, void __user *uarg) { struct obd_device *obd = exp->exp_obd; struct osp_device *d;