From 7954f8f43328c07fc976d55db455cba56e0e4a74 Mon Sep 17 00:00:00 2001 From: lsy Date: Sat, 14 Oct 2006 15:45:52 +0000 Subject: [PATCH] fixed a logic error in ll_add_capa(), which will make list not sorted. remove debug code. --- lustre/cmm/mdc_device.c | 4 +++- lustre/include/lustre_capa.h | 2 +- lustre/llite/llite_capa.c | 42 ++++++++++++++++-------------------------- lustre/mdt/mdt_handler.c | 2 +- lustre/ptlrpc/import.c | 2 +- lustre/tests/cfg/lmv.sh | 4 ++++ 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/lustre/cmm/mdc_device.c b/lustre/cmm/mdc_device.c index 84e4f23..cd15fb2 100644 --- a/lustre/cmm/mdc_device.c +++ b/lustre/cmm/mdc_device.c @@ -107,7 +107,9 @@ static int mdc_add_obd(const struct lu_env *env, if (!ocd) RETURN(-ENOMEM); /* The connection between MDS must be local */ - ocd->ocd_connect_flags |= OBD_CONNECT_LCL_CLIENT; + ocd->ocd_connect_flags = OBD_CONNECT_LCL_CLIENT | + OBD_CONNECT_MDS_CAPA | + OBD_CONNECT_OSS_CAPA; rc = obd_connect(env, conn, mdc, &mdc->obd_uuid, ocd); OBD_FREE_PTR(ocd); if (rc) { diff --git a/lustre/include/lustre_capa.h b/lustre/include/lustre_capa.h index a37fe7c..ca5c981 100644 --- a/lustre/include/lustre_capa.h +++ b/lustre/include/lustre_capa.h @@ -299,7 +299,7 @@ static inline unsigned long capa_renewal_time(struct obd_capa *ocapa) * to OSS before capability expires. */ return ocapa->c_expiry - - ((ocapa->c_capa.lc_flags & CAPA_FL_SHORT_EXPIRY) ? 300:1200) * HZ; + ((ocapa->c_capa.lc_flags & CAPA_FL_SHORT_EXPIRY) ? 40:1200) * HZ; } #ifdef __KERNEL__ diff --git a/lustre/llite/llite_capa.c b/lustre/llite/llite_capa.c index a68a744..b91ff6e 100644 --- a/lustre/llite/llite_capa.c +++ b/lustre/llite/llite_capa.c @@ -55,7 +55,7 @@ static inline void update_capa_timer(struct obd_capa *ocapa, cfs_time_t expiry) cfs_timer_arm(&ll_capa_timer, expiry); DEBUG_CAPA(D_SEC, &ocapa->c_capa, "ll_capa_timer update: %lu/%lu by", - expiry, cfs_time_current()); + expiry, jiffies); } } @@ -130,19 +130,6 @@ static void ll_delete_capa(struct obd_capa *ocapa) free_capa(ocapa); } -static void inline assert_expired_capa(struct obd_capa *oc) -{ - if (S_ISDIR(oc->u.cli.inode->i_mode)) - DEBUG_CAPA(D_ERROR, &oc->c_capa, "shouldn't release dir"); - else if (obd_capa_open_count(oc)) - DEBUG_CAPA(D_ERROR, &oc->c_capa, "shouldn't release opened"); - else if (obd_capa_is_root(oc)) - DEBUG_CAPA(D_ERROR, &oc->c_capa, "shouldn't release root"); - else - return; - LBUG(); -} - /* three places where client capa is deleted: * 1. capa_thread_main(), main place to delete expired capa. * 2. ll_clear_inode_capas() in ll_clear_inode(). @@ -185,7 +172,6 @@ static int capa_thread_main(void *unused) !obd_capa_is_root(ocapa) && !ll_have_md_lock(ocapa->u.cli.inode, MDS_INODELOCK_LOOKUP)) { - assert_expired_capa(ocapa); /* MDS capa without LOOKUP lock, and the related * inode is not opened, it won't renew, * move to idle list (except root fid) */ @@ -198,7 +184,6 @@ static int capa_thread_main(void *unused) if (capa_for_oss(&ocapa->c_capa) && obd_capa_open_count(ocapa) == 0) { - assert_expired_capa(ocapa); /* oss capa with open count == 0 won't renew, * move to idle list */ list_del_init(&ocapa->c_list); @@ -392,15 +377,10 @@ struct obd_capa *ll_mdscapa_get(struct inode *inode) } if (!ocapa && atomic_read(&ll_capa_debug)) { - CDEBUG(D_ERROR, - "no MDS capability for fid "DFID", this might be ok;)\n", - PFID(ll_inode2fid(inode))); -#if 0 LASSERT(!S_ISDIR(inode->i_mode)); LASSERT(!obd_capa_open_count(ocapa)); LASSERT(!ll_have_md_lock(ocapa->u.cli.inode, MDS_INODELOCK_LOOKUP)); -#endif atomic_set(&ll_capa_debug, 0); } @@ -422,7 +402,8 @@ static inline int do_add_mds_capa(struct inode *inode, struct obd_capa **pcapa) DEBUG_CAPA(D_SEC, &ocapa->c_capa, "add MDS"); } else { - if (ocapa->c_capa.lc_expiry == old->c_capa.lc_expiry) { + if (!memcmp(&old->c_capa, &ocapa->c_capa, sizeof(old->c_capa))) + { rc = -EEXIST; } else { spin_lock(&old->c_lock); @@ -510,12 +491,13 @@ struct obd_capa *ll_add_capa(struct inode *inode, struct obd_capa *ocapa) /* truncate capa won't renew, or no existed capa changed, don't update * capa timer. */ if (!rc && ocapa->c_capa.lc_opc != CAPA_OPC_OSS_TRUNC) { - list_del_init(&ocapa->c_list); - sort_add_capa(ocapa, ll_capa_list); - spin_lock(&ocapa->c_lock); set_capa_expiry(ocapa); spin_unlock(&ocapa->c_lock); + + list_del_init(&ocapa->c_list); + sort_add_capa(ocapa, ll_capa_list); + update_capa_timer(ocapa, capa_renewal_time(ocapa)); } @@ -546,7 +528,15 @@ int ll_update_capa(struct obd_capa *ocapa, struct lustre_capa *capa) "renewal failed: -EIO, retry in 1 min"); goto retry; } else { - sort_add_capa(ocapa, &ll_idle_capas); + if (rc == -ENOENT && !capa_is_to_expire(ocapa)) { + /* NB: in period of renewal, inode might be + * deleted and then created, so actually ocapa + * is a completely new one! */ + LASSERT(!list_empty(&ocapa->c_list)); + } else { + LASSERT(list_empty(&ocapa->c_list)); + sort_add_capa(ocapa, &ll_idle_capas); + } } spin_unlock(&capa_lock); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f11eed9..b1130e9 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -3299,7 +3299,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, spin_lock_init(&m->mdt_ioepoch_lock); m->mdt_opts.mo_compat_resname = 0; - m->mdt_capa_timeout = 320; //CAPA_TIMEOUT; + m->mdt_capa_timeout = CAPA_TIMEOUT; m->mdt_capa_alg = CAPA_HMAC_ALG_SHA1; m->mdt_ck_timeout = CAPA_KEY_TIMEOUT; obd->obd_replayable = 1; diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index 9c323b1..fc2cf76 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -363,8 +363,8 @@ int ptlrpc_connect_import(struct obd_import *imp, char *new_uuid) (char *)&imp->imp_dlm_handle, (char *)&imp->imp_connect_data }; struct ptlrpc_connect_async_args *aa; - ENTRY; + spin_lock(&imp->imp_lock); if (imp->imp_state == LUSTRE_IMP_CLOSED) { spin_unlock(&imp->imp_lock); diff --git a/lustre/tests/cfg/lmv.sh b/lustre/tests/cfg/lmv.sh index f89c12f..8f96af3 100644 --- a/lustre/tests/cfg/lmv.sh +++ b/lustre/tests/cfg/lmv.sh @@ -59,6 +59,8 @@ MOUNTOPT="" MKFSOPT=$MKFSOPT" -i $MDSISIZE" [ "x$MKFSOPT" != "x" ] && MKFSOPT="--mkfsoptions=\"$MKFSOPT\"" +[ "x$MDSCAPA" != "x" ] && + MKFSOPT="--param mdt.capa=$MDSCAPA" [ "x$mdsfailover_HOST" != "x" ] && MOUNTOPT=$MOUNTOPT" --failnode=`h2$NETTYPE $mdsfailover_HOST`" [ "x$STRIPE_BYTES" != "x" ] && @@ -74,6 +76,8 @@ MOUNTOPT="" MKFSOPT=$MKFSOPT" -J size=$OSTJOURNALSIZE" [ "x$MKFSOPT" != "x" ] && MKFSOPT="--mkfsoptions=\"$MKFSOPT\"" +[ "x$OSSCAPA" != "x" ] && + MKFSOPT="--param ost.capa=$OSSCAPA" [ "x$ostfailover_HOST" != "x" ] && MOUNTOPT=$MOUNTOPT" --failnode=`h2$NETTYPE $ostfailover_HOST`" OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$TIMEOUT $MKFSOPT $MOUNTOPT $OSTOPT" -- 1.8.3.1