From 9d9b3fa84a5fafe7ea0906b5cdae3be119a62b25 Mon Sep 17 00:00:00 2001 From: Vladimir Saveliev Date: Thu, 22 Apr 2010 12:15:32 -0700 Subject: [PATCH] b=22615 fixes for regressions caused by 11063 set atime to past under PW EOF extent lock fix truncate in liblustre i=vitaly i=ericm --- lustre/liblustre/super.c | 18 ++++++++++-------- lustre/llite/llite_lib.c | 16 ++++++++-------- lustre/llite/vvp_io.c | 19 ++++++++++++------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c index cdd12ec..7be70b9 100644 --- a/lustre/liblustre/super.c +++ b/lustre/liblustre/super.c @@ -840,14 +840,16 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr) 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) diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 142f627..77561d1 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1248,14 +1248,14 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr) 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) { diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 50adc18..74aeb59 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -301,8 +301,10 @@ static int vvp_io_setattr_lock(const struct lu_env *env, 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; @@ -370,22 +372,25 @@ static int vvp_io_setattr_trunc(const struct lu_env *env, 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); @@ -408,7 +413,7 @@ static int vvp_io_setattr_start(const struct lu_env *env, 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, -- 1.8.3.1