if (lock->l_resource->lr_name.name[0] != inode->i_ino ||
lock->l_resource->lr_name.name[1] != inode->i_generation) {
- LDLM_ERROR(lock, "data mismatch with ino %lu/%u",
- inode->i_ino, inode->i_generation);
+ LDLM_ERROR(lock, "data mismatch with ino %lu/%u(%p)",
+ inode->i_ino, inode->i_generation, inode);
}
/* If lookup lock is cancelled, we just drop the dentry and
stat() and similar functions) to renew the data anyway */
if (S_ISDIR(inode->i_mode) &&
(bits & MDS_INODELOCK_UPDATE)) {
- CDEBUG(D_INODE, "invalidating inode %lu\n",
- inode->i_ino);
-
+ CDEBUG(D_INODE, "invalidating inode %lu/%u(%p)\n",
+ inode->i_ino, inode->i_generation, inode);
truncate_inode_pages(inode->i_mapping, 0);
}
if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
ll_i2info(inode)->lli_smd != NULL) {
struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
- struct ost_lvb lvb;
ldlm_error_t rc;
LASSERT(lsm->lsm_object_id != 0);
/* bug 2334: drop MDS lock before acquiring OST lock */
ll_intent_drop_lock(it);
- rc = ll_glimpse_size(inode, &lvb);
+ rc = ll_glimpse_size(inode);
if (rc) {
iput(inode);
RETURN(rc);
}
- inode->i_size = lvb.lvb_size;
}
dentry = *de = ll_find_alias(inode, dentry);
}
#endif
+static void ll_update_times(struct ptlrpc_request *request, int offset,
+ struct inode *inode)
+{
+ struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
+ sizeof(*body));
+ LASSERT(body);
+
+ if (body->valid & OBD_MD_FLMTIME &&
+ body->mtime > LTIME_S(inode->i_mtime)) {
+ CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
+ inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
+ LTIME_S(inode->i_mtime) = body->mtime;
+ }
+ if (body->valid & OBD_MD_FLCTIME &&
+ body->ctime > LTIME_S(inode->i_ctime))
+ LTIME_S(inode->i_ctime) = body->ctime;
+}
+
static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
{
struct ptlrpc_request *request = NULL;
ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
current->fsuid, current->fsgid, rdev, &request);
+ if (err == 0)
+ ll_update_times(request, 0, dir);
ptlrpc_req_finished(request);
break;
case S_IFDIR:
ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
current->fsuid, current->fsgid, rdev, &request);
+ if (err)
+ GOTO(out_err, err);
+
+ ll_update_times(request, 0, dir);
+
err = ll_prep_inode(sbi->ll_osc_exp, sbi->ll_mdc_exp,
&inode, request, 0, child->d_sb);
if (err)
err = md_create(sbi->ll_mdc_exp, &op_data,
tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
current->fsuid, current->fsgid, 0, &request);
+ if (err == 0)
+ ll_update_times(request, 0, dir);
+
ptlrpc_req_finished(request);
RETURN(err);
}
ll_prepare_mdc_op_data(&op_data, src, dir, name, len, 0);
err = md_link(sbi->ll_mdc_exp, &op_data, &request);
+ if (err == 0)
+ ll_update_times(request, 0, dir);
ptlrpc_req_finished(request);
-
RETURN(err);
}
ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
current->fsuid, current->fsgid, 0, &request);
+ if (err == 0)
+ ll_update_times(request, 0, dir);
ptlrpc_req_finished(request);
RETURN(err);
}
ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, S_IFDIR);
rc = md_unlink(ll_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
+ if (rc == 0)
+ ll_update_times(request, 0, dir);
ptlrpc_req_finished(request);
RETURN(rc);
}
rc = md_unlink(ll_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
if (rc)
GOTO(out, rc);
-
+ ll_update_times(request, 0, dir);
+
rc = ll_objects_destroy(request, dir, 2);
- out:
+out:
ptlrpc_req_finished(request);
RETURN(rc);
}
err = md_rename(sbi->ll_mdc_exp, &op_data,
oldname, oldlen, newname, newlen, &request);
if (!err) {
+ ll_update_times(request, 0, src);
+ ll_update_times(request, 0, tgt);
err = ll_objects_destroy(request, src, 3);
}