Skip to content
Snippets Groups Projects
Commit fe36bdba authored by alex's avatar alex
Browse files

b=3920

bits from 3599 landed to help debugging
parent ea8623c4
No related branches found
No related tags found
No related merge requests found
...@@ -71,10 +71,13 @@ struct ll_dentry_data { ...@@ -71,10 +71,13 @@ struct ll_dentry_data {
extern struct file_operations ll_pgcache_seq_fops; 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_OST_SIZE_LOCK 0
#define LLI_F_HAVE_MDS_SIZE_LOCK 1 #define LLI_F_HAVE_MDS_SIZE_LOCK 1
#define LLI_F_PREFER_EXTENDED_SIZE 2 #define LLI_F_PREFER_EXTENDED_SIZE 2
struct ll_inode_info { struct ll_inode_info {
int lli_inode_magic;
struct lov_stripe_md *lli_smd; struct lov_stripe_md *lli_smd;
struct mea *lli_mea; struct mea *lli_mea;
char *lli_symlink_name; char *lli_symlink_name;
......
...@@ -316,15 +316,25 @@ static int ll_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock) ...@@ -316,15 +316,25 @@ static int ll_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock)
ENTRY; ENTRY;
if (lsm->lsm_stripe_count == 1) if (lsm->lsm_stripe_count == 1)
RETURN(0); GOTO(check, stripe = 0);
/* get our offset in the lov */ /* get our offset in the lov */
rc = obd_get_info(exp, sizeof(key), &key, &vallen, &stripe); rc = obd_get_info(exp, sizeof(key), &key, &vallen, &stripe);
if (rc != 0) { if (rc != 0) {
CERROR("obd_get_info: rc = %d\n", rc); CERROR("obd_get_info: rc = %d\n", rc);
LBUG(); RETURN(rc);
} }
LASSERT(stripe < lsm->lsm_stripe_count); 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); RETURN(stripe);
} }
...@@ -489,6 +499,8 @@ static int ll_extent_lock_callback(struct ldlm_lock *lock, ...@@ -489,6 +499,8 @@ static int ll_extent_lock_callback(struct ldlm_lock *lock,
lsm = lli->lli_smd; lsm = lli->lli_smd;
stripe = ll_lock_to_stripe_offset(inode, lock); stripe = ll_lock_to_stripe_offset(inode, lock);
if (stripe < 0)
goto iput;
ll_pgcache_remove_extent(inode, lsm, lock, stripe); ll_pgcache_remove_extent(inode, lsm, lock, stripe);
down(&inode->i_sem); down(&inode->i_sem);
...@@ -536,6 +548,8 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data) ...@@ -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"); LDLM_DEBUG(lock, "client-side async enqueue: granted/glimpsed");
stripe = ll_lock_to_stripe_offset(inode, lock); stripe = ll_lock_to_stripe_offset(inode, lock);
if (stripe < 0)
goto iput;
if (lock->l_lvb_len) { if (lock->l_lvb_len) {
struct lov_stripe_md *lsm = lli->lli_smd; 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) ...@@ -553,6 +567,7 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data)
up(&inode->i_sem); up(&inode->i_sem);
} }
iput:
iput(inode); iput(inode);
wake_up(&lock->l_waitq); wake_up(&lock->l_waitq);
...@@ -568,7 +583,7 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp) ...@@ -568,7 +583,7 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp)
struct inode *inode = ll_inode_from_lock(lock); struct inode *inode = ll_inode_from_lock(lock);
struct ll_inode_info *lli; struct ll_inode_info *lli;
struct ost_lvb *lvb; struct ost_lvb *lvb;
int rc, size = sizeof(*lvb), stripe = 0; int rc, size = sizeof(*lvb), stripe;
ENTRY; ENTRY;
if (inode == NULL) if (inode == NULL)
...@@ -580,8 +595,9 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp) ...@@ -580,8 +595,9 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp)
GOTO(iput, rc = -ELDLM_NO_LOCK_DATA); GOTO(iput, rc = -ELDLM_NO_LOCK_DATA);
/* First, find out which stripe index this lock corresponds to. */ /* 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); rc = lustre_pack_reply(req, 1, &size, NULL);
if (rc) { if (rc) {
......
...@@ -441,6 +441,7 @@ void ll_lli_init(struct ll_inode_info *lli) ...@@ -441,6 +441,7 @@ void ll_lli_init(struct ll_inode_info *lli)
lli->lli_maxbytes = PAGE_CACHE_MAXBYTES; lli->lli_maxbytes = PAGE_CACHE_MAXBYTES;
spin_lock_init(&lli->lli_lock); spin_lock_init(&lli->lli_lock);
INIT_LIST_HEAD(&lli->lli_pending_write_llaps); 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) 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) ...@@ -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 *ll_inode_from_lock(struct ldlm_lock *lock)
{ {
struct inode *inode; struct inode *inode = NULL;
l_lock(&lock->l_resource->lr_namespace->ns_lock); l_lock(&lock->l_resource->lr_namespace->ns_lock);
if (lock->l_ast_data) if (lock->l_ast_data) {
inode = igrab(lock->l_ast_data); struct ll_inode_info *lli = ll_i2info(lock->l_ast_data);
else if (lli->lli_inode_magic == LLI_INODE_MAGIC) {
inode = NULL; 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); l_unlock(&lock->l_resource->lr_namespace->ns_lock);
return inode; return inode;
} }
...@@ -949,6 +955,7 @@ void ll_clear_inode(struct inode *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, CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
inode->i_generation, inode); inode->i_generation, inode);
lli->lli_inode_magic = LLI_INODE_DEAD;
ll_inode2fid(&fid, inode); ll_inode2fid(&fid, inode);
clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK, &(ll_i2info(inode)->lli_flags)); 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); md_change_cbdata(sbi->ll_mdc_exp, &fid, null_if_equal, inode);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment