Whamcloud - gitweb
LU-3299 llite: force lvb_data update after layout change
authorjcl <jacques-charles.lafoucriere@cea.fr>
Wed, 8 May 2013 12:49:07 +0000 (14:49 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 13 Jun 2013 17:09:38 +0000 (13:09 -0400)
When a file is restored the layout lock is first
associated with the released layout and after restore
it has to be assocaited with the new layout. This patch
forces lvb_data update in ll_layout_fetch() even if one
is present (case for released->normal state change)

Signed-off-by: JC Lafoucriere <jacques-charles.lafoucriere@cea.fr>
Change-Id: I9bc02955a8e005898db3dc4db530ee0d29b35ba1
Reviewed-on: http://review.whamcloud.com/6291
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Johann Lombardi <johann.lombardi@intel.com>
lustre/llite/file.c

index a5d5f05..cc1697e 100644 (file)
@@ -3262,7 +3262,11 @@ static int ll_layout_fetch(struct inode *inode, struct ldlm_lock *lock)
        int rc;
        ENTRY;
 
        int rc;
        ENTRY;
 
-       if (lock->l_lvb_data != NULL)
+       CDEBUG(D_INODE, DFID" LVB_READY=%d l_lvb_data=%p l_lvb_len=%d\n",
+              PFID(ll_inode2fid(inode)), !!(lock->l_flags & LDLM_FL_LVB_READY),
+              lock->l_lvb_data, lock->l_lvb_len);
+
+       if ((lock->l_lvb_data != NULL) && (lock->l_flags & LDLM_FL_LVB_READY))
                RETURN(0);
 
        /* if layout lock was granted right away, the layout is returned
                RETURN(0);
 
        /* if layout lock was granted right away, the layout is returned
@@ -3298,15 +3302,13 @@ static int ll_layout_fetch(struct inode *inode, struct ldlm_lock *lock)
 
        memcpy(lvbdata, lmm, lmmsize);
        lock_res_and_lock(lock);
 
        memcpy(lvbdata, lmm, lmmsize);
        lock_res_and_lock(lock);
-       if (lock->l_lvb_data == NULL) {
-               lock->l_lvb_data = lvbdata;
-               lock->l_lvb_len = lmmsize;
-               lvbdata = NULL;
-       }
+       if (lock->l_lvb_data != NULL)
+               OBD_FREE_LARGE(lock->l_lvb_data, lock->l_lvb_len);
+
+       lock->l_lvb_data = lvbdata;
+       lock->l_lvb_len = lmmsize;
        unlock_res_and_lock(lock);
 
        unlock_res_and_lock(lock);
 
-       if (lvbdata != NULL)
-               OBD_FREE_LARGE(lvbdata, lmmsize);
        EXIT;
 
 out:
        EXIT;
 
 out:
@@ -3338,7 +3340,7 @@ static int ll_layout_lock_set(struct lustre_handle *lockh, ldlm_mode_t mode,
        LASSERT(ldlm_has_layout(lock));
 
        LDLM_DEBUG(lock, "File %p/"DFID" being reconfigured: %d.\n",
        LASSERT(ldlm_has_layout(lock));
 
        LDLM_DEBUG(lock, "File %p/"DFID" being reconfigured: %d.\n",
-               inode, PFID(&lli->lli_fid), reconf);
+                  inode, PFID(&lli->lli_fid), reconf);
 
        /* in case this is a caching lock and reinstate with new inode */
        md_set_lock_data(sbi->ll_md_exp, &lockh->cookie, inode, NULL);
 
        /* in case this is a caching lock and reinstate with new inode */
        md_set_lock_data(sbi->ll_md_exp, &lockh->cookie, inode, NULL);