From fe36bdba6c04f086339b8411d363fea751a71eee Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 22 Jul 2004 15:27:42 +0000 Subject: [PATCH] b=3920 bits from 3599 landed to help debugging --- lustre/include/linux/lustre_lite.h | 3 +++ lustre/llite/file.c | 26 +++++++++++++++++++++----- lustre/llite/llite_lib.c | 17 ++++++++++++----- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lustre/include/linux/lustre_lite.h b/lustre/include/linux/lustre_lite.h index 5077f8f..b15e74f 100644 --- a/lustre/include/linux/lustre_lite.h +++ b/lustre/include/linux/lustre_lite.h @@ -71,10 +71,13 @@ struct ll_dentry_data { extern struct file_operations ll_pgcache_seq_fops; +#define LLI_INODE_MAGIC 0x111d0de5 +#define LLI_INODE_DEAD 0xdeadd00d #define LLI_F_HAVE_OST_SIZE_LOCK 0 #define LLI_F_HAVE_MDS_SIZE_LOCK 1 #define LLI_F_PREFER_EXTENDED_SIZE 2 struct ll_inode_info { + int lli_inode_magic; struct lov_stripe_md *lli_smd; struct mea *lli_mea; char *lli_symlink_name; diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 324e9d2..7e8cc0d 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -316,15 +316,25 @@ static int ll_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock) ENTRY; if (lsm->lsm_stripe_count == 1) - RETURN(0); + GOTO(check, stripe = 0); /* get our offset in the lov */ rc = obd_get_info(exp, sizeof(key), &key, &vallen, &stripe); if (rc != 0) { CERROR("obd_get_info: rc = %d\n", rc); - LBUG(); + RETURN(rc); } LASSERT(stripe < lsm->lsm_stripe_count); + +check: + if (lsm->lsm_oinfo[stripe].loi_id != lock->l_resource->lr_name.name[0]|| + lsm->lsm_oinfo[stripe].loi_gr != lock->l_resource->lr_name.name[2]){ + LDLM_ERROR(lock, "resource doesn't match object "LPU64"/"LPU64, + lsm->lsm_oinfo[stripe].loi_id, + lsm->lsm_oinfo[stripe].loi_gr); + RETURN(-ELDLM_NO_LOCK_DATA); + } + RETURN(stripe); } @@ -489,6 +499,8 @@ static int ll_extent_lock_callback(struct ldlm_lock *lock, lsm = lli->lli_smd; stripe = ll_lock_to_stripe_offset(inode, lock); + if (stripe < 0) + goto iput; ll_pgcache_remove_extent(inode, lsm, lock, stripe); down(&inode->i_sem); @@ -536,6 +548,8 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data) LDLM_DEBUG(lock, "client-side async enqueue: granted/glimpsed"); stripe = ll_lock_to_stripe_offset(inode, lock); + if (stripe < 0) + goto iput; if (lock->l_lvb_len) { struct lov_stripe_md *lsm = lli->lli_smd; @@ -553,6 +567,7 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data) up(&inode->i_sem); } +iput: iput(inode); wake_up(&lock->l_waitq); @@ -568,7 +583,7 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp) struct inode *inode = ll_inode_from_lock(lock); struct ll_inode_info *lli; struct ost_lvb *lvb; - int rc, size = sizeof(*lvb), stripe = 0; + int rc, size = sizeof(*lvb), stripe; ENTRY; if (inode == NULL) @@ -580,8 +595,9 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp) GOTO(iput, rc = -ELDLM_NO_LOCK_DATA); /* First, find out which stripe index this lock corresponds to. */ - if (lli->lli_smd->lsm_stripe_count > 1) - stripe = ll_lock_to_stripe_offset(inode, lock); + stripe = ll_lock_to_stripe_offset(inode, lock); + if (stripe < 0) + GOTO(iput, rc = -ELDLM_NO_LOCK_DATA); rc = lustre_pack_reply(req, 1, &size, NULL); if (rc) { diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 170d3fd..13b092c 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -441,6 +441,7 @@ void ll_lli_init(struct ll_inode_info *lli) lli->lli_maxbytes = PAGE_CACHE_MAXBYTES; spin_lock_init(&lli->lli_lock); INIT_LIST_HEAD(&lli->lli_pending_write_llaps); + lli->lli_inode_magic = LLI_INODE_MAGIC; } int ll_fill_super(struct super_block *sb, void *data, int silent) @@ -918,12 +919,17 @@ int ll_process_config_update(struct ll_sb_info *sbi, int clean) struct inode *ll_inode_from_lock(struct ldlm_lock *lock) { - struct inode *inode; + struct inode *inode = NULL; l_lock(&lock->l_resource->lr_namespace->ns_lock); - if (lock->l_ast_data) - inode = igrab(lock->l_ast_data); - else - inode = NULL; + if (lock->l_ast_data) { + struct ll_inode_info *lli = ll_i2info(lock->l_ast_data); + if (lli->lli_inode_magic == LLI_INODE_MAGIC) { + inode = igrab(lock->l_ast_data); + } else { + CERROR("DEBUG: l_ast_data %p is bogus: magic %x\n", + lock->l_ast_data, lli->lli_inode_magic); + } + } l_unlock(&lock->l_resource->lr_namespace->ns_lock); return inode; } @@ -949,6 +955,7 @@ void ll_clear_inode(struct inode *inode) CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino, inode->i_generation, inode); + lli->lli_inode_magic = LLI_INODE_DEAD; ll_inode2fid(&fid, inode); clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK, &(ll_i2info(inode)->lli_flags)); md_change_cbdata(sbi->ll_mdc_exp, &fid, null_if_equal, inode); -- 1.8.3.1