Whamcloud - gitweb
- landed b_hd_mdref (mostly WB cache fixes)
[fs/lustre-release.git] / lustre / obdfilter / filter_lvb.c
index 500ff07..b1ac24c 100644 (file)
@@ -79,7 +79,11 @@ static int filter_lvbo_init(struct ldlm_resource *res)
         if (dentry->d_inode == NULL) {
                 lvb->lvb_size = 0;
                 lvb->lvb_blocks = 0;
-                lvb->lvb_mtime = LTIME_S(CURRENT_TIME);
+
+                /* making client use MDS mtime as this one is zero, bigger one
+                 * will be taken and this does not break POSIX. Thanks to
+                 * Andreas. --umka */
+                lvb->lvb_mtime = 0;
         } else {
                 lvb->lvb_size = dentry->d_inode->i_size;
                 lvb->lvb_blocks = dentry->d_inode->i_blocks;
@@ -138,6 +142,8 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
                         //GOTO(out, rc = -EPROTO);
                         GOTO(out, rc = 0);
                 }
+
+                lock_res(res);
                 if (new->lvb_size > lvb->lvb_size || !increase) {
                         CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb size: "
                                LPU64" -> "LPU64"\n", res->lr_name.name[0],
@@ -162,6 +168,7 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
                                lvb->lvb_ctime, new->lvb_ctime);
                         lvb->lvb_ctime = new->lvb_ctime;
                 }
+                unlock_res(res);
         }
 
         /* Update the LVB from the disk inode */
@@ -183,6 +190,7 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
         oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
         obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS);
 
+        lock_res(res);
         if (dentry->d_inode->i_size > lvb->lvb_size || !increase) {
                 CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb size from disk: "
                        LPU64" -> %llu\n", res->lr_name.name[0],
@@ -212,6 +220,7 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
                LPU64" -> %lu\n", res->lr_name.name[0],
                lvb->lvb_blocks, dentry->d_inode->i_blocks);
         lvb->lvb_blocks = dentry->d_inode->i_blocks;
+        unlock_res(res);
 
         f_dput(dentry);
 out: