Whamcloud - gitweb
b=22615 fixes for regressions caused by 11063
authorVladimir Saveliev <Vladimir.Saveliev@sun.com>
Thu, 22 Apr 2010 19:15:32 +0000 (12:15 -0700)
committerRobert Read <robert.read@oracle.com>
Thu, 22 Apr 2010 19:15:32 +0000 (12:15 -0700)
set atime to past under PW EOF extent lock
fix truncate in liblustre

i=vitaly
i=ericm

lustre/liblustre/super.c
lustre/llite/llite_lib.c
lustre/llite/vvp_io.c

index cdd12ec..7be70b9 100644 (file)
@@ -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)
index 142f627..77561d1 100644 (file)
@@ -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) {
index 50adc18..74aeb59 100644 (file)
@@ -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,