Whamcloud - gitweb
b=3920
authoralex <alex>
Thu, 22 Jul 2004 15:27:42 +0000 (15:27 +0000)
committeralex <alex>
Thu, 22 Jul 2004 15:27:42 +0000 (15:27 +0000)
bits from 3599 landed to help debugging

lustre/include/linux/lustre_lite.h
lustre/llite/file.c
lustre/llite/llite_lib.c

index 5077f8f..b15e74f 100644 (file)
@@ -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;
index 324e9d2..7e8cc0d 100644 (file)
@@ -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) {
index 170d3fd..13b092c 100644 (file)
@@ -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);