Whamcloud - gitweb
LU-14677 sec: migrate/extend/split on encrypted file
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index c11da6c..d0597f2 100644 (file)
@@ -187,6 +187,7 @@ static struct ll_sb_info *ll_init_sbi(void)
        sbi->ll_flags |= LL_SBI_AGL_ENABLED;
        sbi->ll_flags |= LL_SBI_FAST_READ;
        sbi->ll_flags |= LL_SBI_TINY_WRITE;
+       sbi->ll_flags |= LL_SBI_PARALLEL_DIO;
        ll_sbi_set_encrypt(sbi, true);
 
        /* root squash */
@@ -336,7 +337,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                                   OBD_CONNECT2_CRUSH | OBD_CONNECT2_LSEEK |
                                   OBD_CONNECT2_GETATTR_PFID |
                                   OBD_CONNECT2_DOM_LVB |
-                                  OBD_CONNECT2_REP_MBITS;
+                                  OBD_CONNECT2_REP_MBITS |
+                                  OBD_CONNECT2_ATOMIC_OPEN_LOCK;
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
         if (sbi->ll_flags & LL_SBI_LRU_RESIZE)
@@ -663,8 +665,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                GOTO(out_lock_cn_cb, err);
        }
 
-       err = md_get_lustre_md(sbi->ll_md_exp, request, sbi->ll_dt_exp,
-                              sbi->ll_md_exp, &lmd);
+       err = md_get_lustre_md(sbi->ll_md_exp, &request->rq_pill,
+                              sbi->ll_dt_exp, sbi->ll_md_exp, &lmd);
        if (err) {
                CERROR("failed to understand root inode md: rc = %d\n", err);
                ptlrpc_req_finished(request);
@@ -1478,12 +1480,15 @@ static struct inode *ll_iget_anon_dir(struct super_block *sb,
                                      const struct lu_fid *fid,
                                      struct lustre_md *md)
 {
-       struct ll_sb_info       *sbi = ll_s2sbi(sb);
-       struct mdt_body         *body = md->body;
-       struct inode            *inode;
-       ino_t                   ino;
+       struct ll_sb_info *sbi = ll_s2sbi(sb);
+       struct ll_inode_info *lli;
+       struct mdt_body *body = md->body;
+       struct inode *inode;
+       ino_t ino;
+
        ENTRY;
 
+       LASSERT(md->lmv);
        ino = cl_fid_build_ino(fid, sbi->ll_flags & LL_SBI_32BIT_API);
        inode = iget_locked(sb, ino);
        if (inode == NULL) {
@@ -1492,10 +1497,8 @@ static struct inode *ll_iget_anon_dir(struct super_block *sb,
                RETURN(ERR_PTR(-ENOENT));
        }
 
+       lli = ll_i2info(inode);
        if (inode->i_state & I_NEW) {
-               struct ll_inode_info *lli = ll_i2info(inode);
-               struct lmv_stripe_md *lsm = md->lmv;
-
                inode->i_mode = (inode->i_mode & ~S_IFMT) |
                                (body->mbo_mode & S_IFMT);
                LASSERTF(S_ISDIR(inode->i_mode), "Not slave inode "DFID"\n",
@@ -1516,12 +1519,17 @@ static struct inode *ll_iget_anon_dir(struct super_block *sb,
                lli->lli_fid = *fid;
                ll_lli_init(lli);
 
-               LASSERT(lsm != NULL);
                /* master object FID */
                lli->lli_pfid = body->mbo_fid1;
                CDEBUG(D_INODE, "lli %p slave "DFID" master "DFID"\n",
                       lli, PFID(fid), PFID(&lli->lli_pfid));
                unlock_new_inode(inode);
+       } else {
+               /* in directory restripe/auto-split, a directory will be
+                * transformed to a stripe if it's plain, set its pfid here,
+                * otherwise ll_lock_cancel_bits() can't find the master inode.
+                */
+               lli->lli_pfid = body->mbo_fid1;
        }
 
        RETURN(inode);
@@ -1630,6 +1638,12 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
        if (md->default_lmv)
                ll_update_default_lsm_md(inode, md);
 
+       /* after dir migration/restripe, a stripe may be turned into a
+        * directory, in this case, zero out its lli_pfid.
+        */
+       if (unlikely(fid_is_norm(&lli->lli_pfid)))
+               fid_zero(&lli->lli_pfid);
+
        /*
         * no striped information from request, lustre_md from req does not
         * include stripeEA, see ll_md_setattr()
@@ -1812,8 +1826,8 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data)
                RETURN(rc);
        }
 
-        rc = md_get_lustre_md(sbi->ll_md_exp, request, sbi->ll_dt_exp,
-                              sbi->ll_md_exp, &md);
+       rc = md_get_lustre_md(sbi->ll_md_exp, &request->rq_pill, sbi->ll_dt_exp,
+                             sbi->ll_md_exp, &md);
         if (rc) {
                 ptlrpc_req_finished(request);
                 RETURN(rc);
@@ -2133,8 +2147,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
                         * it is necessary due to possible time
                         * de-synchronization between MDT inode and OST objects
                         */
-                       if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode) &&
-                           attr->ia_valid & ATTR_SIZE) {
+                       if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) {
                                xvalid |= OP_XVALID_FLAGS;
                                flags = LUSTRE_ENCRYPT_FL;
                                /* Call to ll_io_zero_page is not necessary if
@@ -2143,7 +2156,8 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
                                 * In case of Direct IO, all we need is to set
                                 * new size.
                                 */
-                               if (attr->ia_size & ~PAGE_MASK &&
+                               if (attr->ia_valid & ATTR_SIZE &&
+                                   attr->ia_size & ~PAGE_MASK &&
                                    !(attr->ia_valid & ATTR_FILE &&
                                      attr->ia_file->f_flags & O_DIRECT)) {
                                        pgoff_t offset =
@@ -2702,7 +2716,8 @@ int ll_iocontrol(struct inode *inode, struct file *file,
                if (flags & LUSTRE_PROJINHERIT_FL)
                        fa.fsx_xflags = FS_XFLAG_PROJINHERIT;
 
-               rc = ll_ioctl_check_project(inode, &fa);
+               rc = ll_ioctl_check_project(inode, fa.fsx_xflags,
+                                           fa.fsx_projid);
                if (rc)
                        RETURN(rc);
 
@@ -2859,7 +2874,7 @@ int ll_remount_fs(struct super_block *sb, int *flags, char *data)
  * \param[in] sb       super block for this file-system
  * \param[in] open_req pointer to the original open request
  */
-void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req)
+void ll_open_cleanup(struct super_block *sb, struct req_capsule *pill)
 {
        struct mdt_body                 *body;
        struct md_op_data               *op_data;
@@ -2867,7 +2882,7 @@ void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req)
        struct obd_export               *exp       = ll_s2sbi(sb)->ll_md_exp;
        ENTRY;
 
-       body = req_capsule_server_get(&open_req->rq_pill, &RMF_MDT_BODY);
+       body = req_capsule_server_get(pill, &RMF_MDT_BODY);
        OBD_ALLOC_PTR(op_data);
        if (op_data == NULL) {
                CWARN("%s: cannot allocate op_data to release open handle for "
@@ -2886,7 +2901,7 @@ void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req)
        EXIT;
 }
 
-int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req,
+int ll_prep_inode(struct inode **inode, struct req_capsule *pill,
                  struct super_block *sb, struct lookup_intent *it)
 {
        struct ll_sb_info *sbi = NULL;
@@ -2898,7 +2913,7 @@ int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req,
 
        LASSERT(*inode || sb);
        sbi = sb ? ll_s2sbi(sb) : ll_i2sbi(*inode);
-       rc = md_get_lustre_md(sbi->ll_md_exp, req, sbi->ll_dt_exp,
+       rc = md_get_lustre_md(sbi->ll_md_exp, pill, sbi->ll_dt_exp,
                              sbi->ll_md_exp, &md);
        if (rc != 0)
                GOTO(out, rc);
@@ -2988,7 +3003,7 @@ out:
 
        if (rc != 0 && it != NULL && it->it_op & IT_OPEN) {
                ll_intent_drop_lock(it);
-               ll_open_cleanup(sb != NULL ? sb : (*inode)->i_sb, req);
+               ll_open_cleanup(sb != NULL ? sb : (*inode)->i_sb, pill);
        }
 
        return rc;