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;
//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],
lvb->lvb_ctime, new->lvb_ctime);
lvb->lvb_ctime = new->lvb_ctime;
}
+ unlock_res(res);
}
/* Update the LVB from the disk inode */
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],
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: