* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
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,
cl_2queue_init_page(queue, page);
cl_page_clip(env, page, 0, to);
-
+
result = cl_io_submit_sync(env, io, crt, queue, CRP_NORMAL, 0);
LASSERT(cl_page_is_owned(page, io));
cl_page_clip(env, page, 0, CFS_PAGE_SIZE);
ll_inode_size_lock(inode, 0);
if (result == 0) {
- if (size > i_size_read(inode))
+ if (size > i_size_read(inode)) {
cl_isize_write_nolock(inode, size);
+ CDEBUG(D_VFSTRACE, DFID" updating i_size "LPU64"\n",
+ PFID(lu_object_fid(&obj->co_lu)), size);
+ }
cl_page_export(env, pg, 1);
} else {
if (size > i_size_read(inode))