Whamcloud - gitweb
LU-1338 hsm: HSM flags feature
[fs/lustre-release.git] / lustre / mdt / mdt_open.c
index 4d87ae4..81375ed 100644 (file)
@@ -704,7 +704,13 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p,
                         repbody->ioepoch = o->mot_ioepoch;
                 }
         } else if (flags & MDS_FMODE_EXEC) {
-                rc = mdt_write_deny(o);
+               /* if file is released, we can't deny write because we must
+                * restore (write) it to access it.*/
+               if ((ma->ma_valid & MA_HSM) &&
+                   (ma->ma_hsm.mh_flags & HS_RELEASED))
+                       rc = 0;
+               else
+                       rc = mdt_write_deny(o);
         }
         if (rc)
                 RETURN(rc);
@@ -996,7 +1002,7 @@ void mdt_reconstruct_open(struct mdt_thread_info *info,
         ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD);
         ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD,
                                                RCL_SERVER);
-        ma->ma_need = MA_INODE;
+       ma->ma_need = MA_INODE | MA_HSM;
         if (ma->ma_lmm_size > 0)
                 ma->ma_need |= MA_LOV;
 
@@ -1121,19 +1127,23 @@ static int mdt_object_open_lock(struct mdt_thread_info *info,
                                struct mdt_lock_handle *lhc,
                                __u64 *ibits)
 {
-       struct md_attr *ma = &info->mti_attr;
-       __u64 open_flags = info->mti_spec.sp_cr_flags;
-       ldlm_mode_t lm = LCK_CR;
-       bool try_layout = false;
-       bool create_layout = false;
-       int rc = 0;
+       struct md_attr  *ma = &info->mti_attr;
+       __u64            open_flags = info->mti_spec.sp_cr_flags;
+       ldlm_mode_t      lm = LCK_CR;
+       bool             try_layout = false;
+       bool             create_layout = false;
+       int              rc = 0;
        ENTRY;
 
        *ibits = 0;
        if (open_flags & MDS_OPEN_LOCK) {
                if (open_flags & FMODE_WRITE)
                        lm = LCK_CW;
-               else if (open_flags & MDS_FMODE_EXEC)
+               /* if file is released, we can't deny write because we must
+                * restore (write) it to access it. */
+               else if ((open_flags & MDS_FMODE_EXEC) &&
+                        !((ma->ma_valid & MA_HSM) &&
+                          (ma->ma_hsm.mh_flags & HS_RELEASED)))
                        lm = LCK_PR;
                else
                        lm = LCK_CR;
@@ -1564,7 +1574,8 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                 }
                 created = 1;
         } else {
-                /* We have to get attr & lov ea for this object */
+               /* We have to get attr & LOV EA, HSM bits for this object */
+               ma->ma_need |= MA_HSM;
                result = mdt_attr_get_complex(info, child, ma);
                 /*
                  * The object is on remote node, return its FID for remote open.