Whamcloud - gitweb
LU-5823 llite: Remove access of stripe in ll_setattr_raw 14/13514/10
authorJinshan Xiong <jinshan.xiong@intel.com>
Sun, 21 Jun 2015 18:29:20 +0000 (14:29 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 29 Jun 2015 22:11:29 +0000 (22:11 +0000)
In ll_setattr_raw(), it needs to know if a file is released
when the file is being truncated. It used to get this information
by accessing lov_stripe_md. This turns out not necessary. This
patch removes the access of lov_stripe_md and solves the problem
in lov_io_init_released().

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: I05b532fd137889d13e8ecb35585f4d1b09958583
Reviewed-on: http://review.whamcloud.com/13514
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Henri Doreau <henri.doreau@cea.fr>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/cl_object.h
lustre/llite/file.c
lustre/llite/lcommon_cl.c
lustre/llite/llite_internal.h
lustre/llite/llite_lib.c
lustre/llite/vvp_io.c
lustre/lov/lov_io.c
lustre/lov/lov_object.c

index 2d5b5ee..1465c6a 100644 (file)
@@ -317,10 +317,6 @@ struct cl_layout {
        size_t          cl_size;
        /** Layout generation. */
        u32             cl_layout_gen;
        size_t          cl_size;
        /** Layout generation. */
        u32             cl_layout_gen;
-       /** True if this is a released file.
-        * Temporarily added for released file truncate in ll_setattr_raw().
-        * It will be removed later. -Jinshan */
-       bool            cl_is_released;
 };
 
 /**
 };
 
 /**
index 20b8f95..97f0754 100644 (file)
@@ -2009,7 +2009,7 @@ free:
        RETURN(rc);
 }
 
        RETURN(rc);
 }
 
-static int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss)
+int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss)
 {
        struct md_op_data       *op_data;
        int                      rc;
 {
        struct md_op_data       *op_data;
        int                      rc;
index 251bb40..fa5e77a 100644 (file)
@@ -88,6 +88,7 @@ int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
 
        io = vvp_env_thread_io(env);
        io->ci_obj = obj;
 
        io = vvp_env_thread_io(env);
        io->ci_obj = obj;
+       io->ci_verify_layout = 1;
 
        io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime);
        io->u.ci_setattr.sa_attr.lvb_mtime = LTIME_S(attr->ia_mtime);
 
        io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime);
        io->u.ci_setattr.sa_attr.lvb_mtime = LTIME_S(attr->ia_mtime);
@@ -113,12 +114,7 @@ again:
         cl_io_fini(env, io);
        if (unlikely(io->ci_need_restart))
                goto again;
         cl_io_fini(env, io);
        if (unlikely(io->ci_need_restart))
                goto again;
-       /* HSM import case: file is released, cannot be restored
-        * no need to fail except if restore registration failed
-        * with -ENODATA */
-       if (result == -ENODATA && io->ci_restore_needed &&
-           io->ci_result != -ENODATA)
-               result = 0;
+
        cl_env_put(env, &refcheck);
        RETURN(result);
 }
        cl_env_put(env, &refcheck);
        RETURN(result);
 }
index a2b00ca..b4af770 100644 (file)
@@ -874,6 +874,7 @@ int ll_merge_attr(const struct lu_env *env, struct inode *inode);
 int ll_fid2path(struct inode *inode, void __user *arg);
 int ll_data_version(struct inode *inode, __u64 *data_version, int flags);
 int ll_hsm_release(struct inode *inode);
 int ll_fid2path(struct inode *inode, void __user *arg);
 int ll_data_version(struct inode *inode, __u64 *data_version, int flags);
 int ll_hsm_release(struct inode *inode);
+int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss);
 
 /* llite/dcache.c */
 
 
 /* llite/dcache.c */
 
index 2b04fd5..90176b5 100644 (file)
@@ -1489,7 +1489,11 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data)
        /* inode size will be in ll_setattr_ost, can't do it now since dirty
         * cache is not cleared yet. */
        op_data->op_attr.ia_valid &= ~(TIMES_SET_FLAGS | ATTR_SIZE);
        /* inode size will be in ll_setattr_ost, can't do it now since dirty
         * cache is not cleared yet. */
        op_data->op_attr.ia_valid &= ~(TIMES_SET_FLAGS | ATTR_SIZE);
+       if (S_ISREG(inode->i_mode))
+               mutex_lock(&inode->i_mutex);
        rc = simple_setattr(dentry, &op_data->op_attr);
        rc = simple_setattr(dentry, &op_data->op_attr);
+       if (S_ISREG(inode->i_mode))
+               mutex_unlock(&inode->i_mutex);
        op_data->op_attr.ia_valid = ia_valid;
 
        rc = ll_update_inode(inode, &md);
        op_data->op_attr.ia_valid = ia_valid;
 
        rc = ll_update_inode(inode, &md);
@@ -1518,7 +1522,6 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
         struct inode *inode = dentry->d_inode;
         struct ll_inode_info *lli = ll_i2info(inode);
         struct md_op_data *op_data = NULL;
         struct inode *inode = dentry->d_inode;
         struct ll_inode_info *lli = ll_i2info(inode);
         struct md_op_data *op_data = NULL;
-       bool file_is_released = false;
        int rc = 0;
        ENTRY;
 
        int rc = 0;
        ENTRY;
 
@@ -1575,72 +1578,33 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
                        LTIME_S(attr->ia_mtime), LTIME_S(attr->ia_ctime),
                        cfs_time_current_sec());
 
                        LTIME_S(attr->ia_mtime), LTIME_S(attr->ia_ctime),
                        cfs_time_current_sec());
 
-        /* We always do an MDS RPC, even if we're only changing the size;
-         * only the MDS knows whether truncate() should fail with -ETXTBUSY */
-
-        OBD_ALLOC_PTR(op_data);
-        if (op_data == NULL)
-                RETURN(-ENOMEM);
-
-       if (!S_ISDIR(inode->i_mode)) {
+       if (S_ISREG(inode->i_mode)) {
                if (attr->ia_valid & ATTR_SIZE)
                        inode_dio_write_done(inode);
                mutex_unlock(&inode->i_mutex);
        }
 
                if (attr->ia_valid & ATTR_SIZE)
                        inode_dio_write_done(inode);
                mutex_unlock(&inode->i_mutex);
        }
 
-       /* truncate on a released file must failed with -ENODATA,
-        * so size must not be set on MDS for released file
-        * but other attributes must be set
-        */
-       if (S_ISREG(inode->i_mode)) {
-               struct cl_layout cl = {
-                       .cl_is_released = false,
-               };
-               struct lu_env *env;
-               int refcheck;
-               __u32 gen;
+       /* We always do an MDS RPC, even if we're only changing the size;
+        * only the MDS knows whether truncate() should fail with -ETXTBUSY */
 
 
-               rc = ll_layout_refresh(inode, &gen);
-               if (rc < 0)
-                       GOTO(out, rc);
-
-               /* XXX: the only place we need to know the layout type,
-                * this will be removed by a later patch. -Jinshan */
-               env = cl_env_get(&refcheck);
-               if (IS_ERR(env))
-                       GOTO(out, rc = PTR_ERR(env));
-
-               rc = cl_object_layout_get(env, lli->lli_clob, &cl);
-               cl_env_put(env, &refcheck);
-               if (rc < 0)
-                       GOTO(out, rc);
-
-               file_is_released = cl.cl_is_released;
+       OBD_ALLOC_PTR(op_data);
+       if (op_data == NULL)
+               GOTO(out, rc = -ENOMEM);
 
 
-               if (!hsm_import && attr->ia_valid & ATTR_SIZE) {
-                       if (file_is_released) {
-                               rc = ll_layout_restore(inode, 0, attr->ia_size);
-                               if (rc < 0)
-                                       GOTO(out, rc);
+       op_data->op_attr = *attr;
 
 
-                               file_is_released = false;
-                               ll_layout_refresh(inode, &gen);
-                       }
-
-                       /* If we are changing file size, file content is
-                        * modified, flag it. */
-                       attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
-                       op_data->op_bias |= MDS_DATA_MODIFIED;
-               }
+       if (!hsm_import && attr->ia_valid & ATTR_SIZE) {
+               /* If we are changing file size, file content is
+                * modified, flag it. */
+               attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
+               op_data->op_bias |= MDS_DATA_MODIFIED;
        }
 
        }
 
-       memcpy(&op_data->op_attr, attr, sizeof(*attr));
-
        rc = ll_md_setattr(dentry, op_data);
        if (rc)
                GOTO(out, rc);
 
        rc = ll_md_setattr(dentry, op_data);
        if (rc)
                GOTO(out, rc);
 
-       if (!S_ISREG(inode->i_mode) || file_is_released)
+       if (!S_ISREG(inode->i_mode) || hsm_import)
                GOTO(out, rc = 0);
 
        if (attr->ia_valid & (ATTR_SIZE |
                GOTO(out, rc = 0);
 
        if (attr->ia_valid & (ATTR_SIZE |
@@ -1654,12 +1618,39 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
                 * time de-synchronization between MDT inode and OST objects */
                rc = cl_setattr_ost(lli->lli_clob, attr, 0);
        }
                 * time de-synchronization between MDT inode and OST objects */
                rc = cl_setattr_ost(lli->lli_clob, attr, 0);
        }
+
+       /* If the file was restored, it needs to set dirty flag.
+        *
+        * We've already sent MDS_DATA_MODIFIED flag in
+        * ll_md_setattr() for truncate. However, the MDT refuses to
+        * set the HS_DIRTY flag on released files, so we have to set
+        * it again if the file has been restored. Please check how
+        * LLIF_DATA_MODIFIED is set in vvp_io_setattr_fini().
+        *
+        * Please notice that if the file is not released, the previous
+        * MDS_DATA_MODIFIED has taken effect and usually
+        * LLIF_DATA_MODIFIED is not set(see vvp_io_setattr_fini()).
+        * This way we can save an RPC for common open + trunc
+        * operation. */
+       if (ll_file_test_and_clear_flag(lli, LLIF_DATA_MODIFIED)) {
+               struct hsm_state_set hss = {
+                       .hss_valid = HSS_SETMASK,
+                       .hss_setmask = HS_DIRTY,
+               };
+               int rc2;
+
+               rc2 = ll_hsm_state_set(inode, &hss);
+               if (rc2 < 0)
+                       CERROR(DFID "HSM set dirty failed: rc2 = %d\n",
+                              PFID(ll_inode2fid(inode)), rc2);
+       }
+
        EXIT;
 out:
        if (op_data != NULL)
                ll_finish_md_op_data(op_data);
 
        EXIT;
 out:
        if (op_data != NULL)
                ll_finish_md_op_data(op_data);
 
-       if (!S_ISDIR(inode->i_mode)) {
+       if (S_ISREG(inode->i_mode)) {
                mutex_lock(&inode->i_mutex);
                if ((attr->ia_valid & ATTR_SIZE) && !hsm_import)
                        inode_dio_wait(inode);
                mutex_lock(&inode->i_mutex);
                if ((attr->ia_valid & ATTR_SIZE) && !hsm_import)
                        inode_dio_wait(inode);
index fb1cd65..9871e80 100644 (file)
@@ -310,7 +310,7 @@ static void vvp_io_fini(const struct lu_env *env, const struct cl_io_slice *ios)
               io->ci_ignore_layout, io->ci_verify_layout,
               vio->vui_layout_gen, io->ci_restore_needed);
 
               io->ci_ignore_layout, io->ci_verify_layout,
               vio->vui_layout_gen, io->ci_restore_needed);
 
-       if (io->ci_restore_needed == 1) {
+       if (io->ci_restore_needed) {
                int     rc;
 
                /* file was detected release, we need to restore it
                int     rc;
 
                /* file was detected release, we need to restore it
@@ -736,7 +736,15 @@ static void vvp_io_setattr_end(const struct lu_env *env,
 static void vvp_io_setattr_fini(const struct lu_env *env,
                                const struct cl_io_slice *ios)
 {
 static void vvp_io_setattr_fini(const struct lu_env *env,
                                const struct cl_io_slice *ios)
 {
+       bool restore_needed = ios->cis_io->ci_restore_needed;
+       struct inode *inode = vvp_object_inode(ios->cis_obj);
+
        vvp_io_fini(env, ios);
        vvp_io_fini(env, ios);
+
+       if (restore_needed && !ios->cis_io->ci_restore_needed) {
+               /* restore finished, set data modified flag for HSM */
+               ll_file_set_flag(ll_i2info(inode), LLIF_DATA_MODIFIED);
+       }
 }
 
 static int vvp_io_read_start(const struct lu_env *env,
 }
 
 static int vvp_io_read_start(const struct lu_env *env,
index 81d5d75..cf1ccfe 100644 (file)
@@ -1095,9 +1095,11 @@ int lov_io_init_released(const struct lu_env *env, struct cl_object *obj,
                 * - in setattr, for truncate
                 */
                /* the truncate is for size > 0 so triggers a restore */
                 * - in setattr, for truncate
                 */
                /* the truncate is for size > 0 so triggers a restore */
-               if (cl_io_is_trunc(io))
+               if (cl_io_is_trunc(io)) {
                        io->ci_restore_needed = 1;
                        io->ci_restore_needed = 1;
-               result = -ENODATA;
+                       result = -ENODATA;
+               } else
+                       result = 1;
                break;
        case CIT_READ:
        case CIT_WRITE:
                break;
        case CIT_READ:
        case CIT_WRITE:
index d32ecd1..a1fce2f 100644 (file)
@@ -1486,14 +1486,12 @@ static int lov_object_layout_get(const struct lu_env *env,
        if (lsm == NULL) {
                cl->cl_size = 0;
                cl->cl_layout_gen = CL_LAYOUT_GEN_EMPTY;
        if (lsm == NULL) {
                cl->cl_size = 0;
                cl->cl_layout_gen = CL_LAYOUT_GEN_EMPTY;
-               cl->cl_is_released = false;
 
                RETURN(0);
        }
 
        cl->cl_size = lov_mds_md_size(lsm->lsm_stripe_count, lsm->lsm_magic);
        cl->cl_layout_gen = lsm->lsm_layout_gen;
 
                RETURN(0);
        }
 
        cl->cl_size = lov_mds_md_size(lsm->lsm_stripe_count, lsm->lsm_magic);
        cl->cl_layout_gen = lsm->lsm_layout_gen;
-       cl->cl_is_released = lsm_is_released(lsm);
 
        rc = lov_lsm_pack(lsm, buf->lb_buf, buf->lb_len);
        lov_lsm_put(lsm);
 
        rc = lov_lsm_pack(lsm, buf->lb_buf, buf->lb_len);
        lov_lsm_put(lsm);