inode_setattr(inode, attr);
}
- if (ia_valid & (ATTR_SIZE | ATTR_MTIME | ATTR_MTIME_SET)) {
- /* mtime is set to past sending setattr op to osts under PW
- * 0:EOF extent lock (like truncate under PW new_size:EOF), if
- * mtime is not set to past setattr op is not sent to osts */
- if ((ia_valid & ATTR_SIZE) ||
- LTIME_S(attr->ia_mtime) < LTIME_S(attr->ia_ctime))
- rc = cl_setattr_ost(inode, attr, NULL);
- }
+ if (ia_valid & ATTR_SIZE)
+ attr->ia_valid |= ATTR_SIZE;
+ if ((ia_valid & ATTR_SIZE) |
+ ((ia_valid | ATTR_ATIME | ATTR_ATIME_SET) &&
+ LTIME_S(attr->ia_atime) < LTIME_S(attr->ia_ctime)) ||
+ ((ia_valid | ATTR_MTIME | ATTR_MTIME_SET) &&
+ LTIME_S(attr->ia_mtime) < LTIME_S(attr->ia_ctime)))
+ /* perform truncate and setting mtime/atime to past under PW
+ * 0:EOF extent lock (new_size:EOF for truncate) */
+ rc = cl_setattr_ost(inode, attr, NULL);
EXIT;
out:
if (op_data.op_ioepoch)
if (ia_valid & ATTR_SIZE)
attr->ia_valid |= ATTR_SIZE;
- if (ia_valid & (ATTR_SIZE | ATTR_MTIME | ATTR_MTIME_SET)) {
- /* mtime is set to past sending setattr op to osts under PW
- * 0:EOF extent lock (like truncate under PW new_size:EOF), if
- * mtime is not set to past setattr op is not sent to osts */
- if ((ia_valid & ATTR_SIZE) ||
- LTIME_S(attr->ia_mtime) < LTIME_S(attr->ia_ctime))
- rc = ll_setattr_ost(inode, attr);
- }
+ if ((ia_valid & ATTR_SIZE) |
+ ((ia_valid | ATTR_ATIME | ATTR_ATIME_SET) &&
+ LTIME_S(attr->ia_atime) < LTIME_S(attr->ia_ctime)) ||
+ ((ia_valid | ATTR_MTIME | ATTR_MTIME_SET) &&
+ LTIME_S(attr->ia_mtime) < LTIME_S(attr->ia_ctime)))
+ /* perform truncate and setting mtime/atime to past under PW
+ * 0:EOF extent lock (new_size:EOF for truncate) */
+ rc = ll_setattr_ost(inode, attr);
EXIT;
out:
if (op_data) {
if (new_size == 0)
enqflags = CEF_DISCARD_DATA;
} else {
- LASSERT(io->u.ci_setattr.sa_attr.lvb_mtime <
- io->u.ci_setattr.sa_attr.lvb_ctime);
+ LASSERT((io->u.ci_setattr.sa_attr.lvb_mtime <
+ io->u.ci_setattr.sa_attr.lvb_ctime) ||
+ (io->u.ci_setattr.sa_attr.lvb_atime <
+ io->u.ci_setattr.sa_attr.lvb_ctime));
new_size = 0;
}
cio->u.setattr.cui_local_lock = SETATTR_EXTENT_LOCK;
return result;
}
-static int vvp_io_setattr_mtime(const struct lu_env *env,
- const struct cl_io_slice *ios)
+static int vvp_io_setattr_time(const struct lu_env *env,
+ const struct cl_io_slice *ios)
{
struct cl_io *io = ios->cis_io;
struct cl_object *obj = io->ci_obj;
struct cl_attr *attr = ccc_env_thread_attr(env);
int result;
- unsigned valid = CAT_MTIME | CAT_CTIME;
+ unsigned valid = CAT_CTIME;
cl_object_attr_lock(obj);
- attr->cat_mtime = io->u.ci_setattr.sa_attr.lvb_mtime;
attr->cat_ctime = io->u.ci_setattr.sa_attr.lvb_ctime;
if (io->u.ci_setattr.sa_valid & ATTR_ATIME_SET) {
attr->cat_atime = io->u.ci_setattr.sa_attr.lvb_atime;
valid |= CAT_ATIME;
}
+ if (io->u.ci_setattr.sa_valid & ATTR_MTIME_SET) {
+ attr->cat_mtime = io->u.ci_setattr.sa_attr.lvb_mtime;
+ valid |= CAT_MTIME;
+ }
result = cl_object_attr_set(env, obj, attr, valid);
cl_object_attr_unlock(obj);
return vvp_io_setattr_trunc(env, ios, inode,
io->u.ci_setattr.sa_attr.lvb_size);
else
- return vvp_io_setattr_mtime(env, ios);
+ return vvp_io_setattr_time(env, ios);
}
static void vvp_io_setattr_end(const struct lu_env *env,