Whamcloud - gitweb
use special macro for print time_t, cleanup in includes.
[fs/lustre-release.git] / lustre / mdt / mdt_recovery.c
index 61c2092..04376af 100644 (file)
@@ -177,42 +177,34 @@ static inline void mcd_cpu_to_le(struct mdt_client_data *mcd,
         buf->mcd_last_close_result  = cpu_to_le32(mcd->mcd_last_close_result);
 }
 
-static int mdt_last_rcvd_header_read(const struct lu_env *env,
-                                     struct mdt_device *mdt,
-                                     struct mdt_server_data *msd)
+static inline int mdt_last_rcvd_header_read(const struct lu_env *env,
+                                            struct mdt_device *mdt)
 {
         struct mdt_thread_info *mti;
-        struct mdt_server_data *tmp;
-        loff_t *off;
         int rc;
 
         mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
-        /* temporary stuff for read */
-        tmp = &mti->mti_msd;
-        off = &mti->mti_off;
-        *off = 0;
+
+        mti->mti_off = 0;
         rc = mdt_record_read(env, mdt->mdt_last_rcvd,
-                             mdt_buf(env, tmp, sizeof(*tmp)), off);
+                             mdt_buf(env, &mti->mti_msd, sizeof(mti->mti_msd)),
+                             &mti->mti_off);
         if (rc == 0)
-                msd_le_to_cpu(tmp, msd);
+                msd_le_to_cpu(&mti->mti_msd, &mdt->mdt_msd);
 
         CDEBUG(D_INFO, "read last_rcvd header rc = %d:\n"
                        "uuid = %s\n"
                        "last_transno = "LPU64"\n",
-                        rc,
-                        msd->msd_uuid,
-                        msd->msd_last_transno);
+                        rc, mdt->mdt_msd.msd_uuid,
+                        mdt->mdt_msd.msd_last_transno);
         return rc;
 }
 
-static int mdt_last_rcvd_header_write(const struct lu_env *env,
-                                      struct mdt_device *mdt,
-                                      struct mdt_server_data *msd)
+static inline int mdt_last_rcvd_header_write(const struct lu_env *env,
+                                             struct mdt_device *mdt)
 {
         struct mdt_thread_info *mti;
-        struct mdt_server_data *tmp;
         struct thandle *th;
-        loff_t *off;
         int rc;
         ENTRY;
 
@@ -222,21 +214,18 @@ static int mdt_last_rcvd_header_write(const struct lu_env *env,
         if (IS_ERR(th))
                 RETURN(PTR_ERR(th));
 
-        /* temporary stuff for read */
-        tmp = &mti->mti_msd;
-        off = &mti->mti_off;
-        *off = 0;
-
-        msd_cpu_to_le(msd, tmp);
+        mti->mti_off = 0;        
+        msd_cpu_to_le(&mdt->mdt_msd, &mti->mti_msd);
 
         rc = mdt_record_write(env, mdt->mdt_last_rcvd,
-                              mdt_buf_const(env, tmp, sizeof(*tmp)), off, th);
+                              mdt_buf_const(env, &mti->mti_msd, sizeof(mti->mti_msd)),
+                              &mti->mti_off, th);
 
         mdt_trans_stop(env, mdt, th);
 
         CDEBUG(D_INFO, "write last_rcvd header rc = %d:\n"
                "uuid = %s\nlast_transno = "LPU64"\n",
-               rc, msd->msd_uuid, msd->msd_last_transno);
+               rc, mdt->mdt_msd.msd_uuid, mdt->mdt_msd.msd_last_transno);
         
         RETURN(rc);
 }
@@ -460,7 +449,7 @@ static int mdt_server_data_init(const struct lu_env *env,
                                                        OBD_INCOMPAT_COMMON_LR;
         } else {
                 LCONSOLE_WARN("%s: used disk, loading\n", obd->obd_name);
-                rc = mdt_last_rcvd_header_read(env, mdt, msd);
+                rc = mdt_last_rcvd_header_read(env, mdt);
                 if (rc) {
                         CERROR("error reading MDS %s: rc %d\n", LAST_RCVD, rc);
                         GOTO(out, rc);
@@ -535,7 +524,6 @@ out:
 static int mdt_server_data_update(const struct lu_env *env,
                                   struct mdt_device *mdt)
 {
-        struct mdt_server_data *msd = &mdt->mdt_msd;
         int rc = 0;
         ENTRY;
 
@@ -543,7 +531,7 @@ static int mdt_server_data_update(const struct lu_env *env,
                mdt->mdt_mount_count, mdt->mdt_last_transno);
 
         spin_lock(&mdt->mdt_transno_lock);
-        msd->msd_last_transno = mdt->mdt_last_transno;
+        mdt->mdt_msd.msd_last_transno = mdt->mdt_last_transno;
         spin_unlock(&mdt->mdt_transno_lock);
 
         /*
@@ -551,7 +539,7 @@ static int mdt_server_data_update(const struct lu_env *env,
          * mdt->mdt_last_rcvd may be NULL that time.
          */
         if (mdt->mdt_last_rcvd != NULL)
-                rc = mdt_last_rcvd_header_write(env, mdt, msd);
+                rc = mdt_last_rcvd_header_write(env, mdt);
         RETURN(rc);
 }
 
@@ -593,7 +581,7 @@ int mdt_client_new(const struct lu_env *env, struct mdt_device *mdt)
         spin_lock(&mdt->mdt_client_bitmap_lock);
         cl_idx = find_first_zero_bit(bitmap, LR_MAX_CLIENTS);
         if (cl_idx >= LR_MAX_CLIENTS ||
-            MDT_FAIL_CHECK_ONCE(OBD_FAIL_MDS_CLIENT_ADD)) {
+            OBD_FAIL_CHECK(OBD_FAIL_MDS_CLIENT_ADD)) {
                 CERROR("no room for %u clients - fix LR_MAX_CLIENTS\n",
                        cl_idx);
                 spin_unlock(&mdt->mdt_client_bitmap_lock);
@@ -949,14 +937,15 @@ int mdt_fs_setup(const struct lu_env *env, struct mdt_device *mdt,
         int rc = 0;
         ENTRY;
 
-        OBD_FAIL_RETURN(OBD_FAIL_MDS_FS_SETUP, -ENOENT);
+        if (OBD_FAIL_CHECK(OBD_FAIL_MDS_FS_SETUP))
+                RETURN(-ENOENT);
 
         /* prepare transactions callbacks */
         mdt->mdt_txn_cb.dtc_txn_start = mdt_txn_start_cb;
         mdt->mdt_txn_cb.dtc_txn_stop = mdt_txn_stop_cb;
         mdt->mdt_txn_cb.dtc_txn_commit = mdt_txn_commit_cb;
         mdt->mdt_txn_cb.dtc_cookie = mdt;
-        INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
+        CFS_INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
 
         dt_txn_callback_add(mdt->mdt_bottom, &mdt->mdt_txn_cb);
 
@@ -1033,8 +1022,8 @@ void mdt_req_from_mcd(struct ptlrpc_request *req,
         mds_steal_ack_locks(req);
 }
 
-static void mdt_reconstruct_generic(struct mdt_thread_info *mti,
-                                    struct mdt_lock_handle *lhc)
+void mdt_reconstruct_generic(struct mdt_thread_info *mti,
+                             struct mdt_lock_handle *lhc)
 {
         struct ptlrpc_request *req = mdt_info_req(mti);
         struct mdt_export_data *med = &req->rq_export->exp_mdt_data;
@@ -1060,7 +1049,7 @@ static void mdt_reconstruct_create(struct mdt_thread_info *mti,
         child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2);
         LASSERT(!IS_ERR(child));
 
-        body = req_capsule_server_get(&mti->mti_pill, &RMF_MDT_BODY);
+        body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
         rc = mo_attr_get(mti->mti_env, mdt_object_child(child), &mti->mti_attr);
         if (rc == -EREMOTE) {
                 /* object was created on remote server */
@@ -1084,29 +1073,36 @@ static void mdt_reconstruct_setattr(struct mdt_thread_info *mti,
         if (req->rq_status)
                 return;
 
-        body = req_capsule_server_get(&mti->mti_pill, &RMF_MDT_BODY);
+        body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
         obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1);
         LASSERT(!IS_ERR(obj));
         mo_attr_get(mti->mti_env, mdt_object_child(obj), &mti->mti_attr);
-        mdt_pack_attr2body(mti, body, &mti->mti_attr.ma_attr, mdt_object_fid(obj));
+        mdt_pack_attr2body(mti, body, &mti->mti_attr.ma_attr,
+                           mdt_object_fid(obj));
+        if (mti->mti_epoch && (mti->mti_epoch->flags & MF_EPOCH_OPEN)) {
+                struct mdt_file_data *mfd;
+                struct mdt_body *repbody;
+
+                repbody = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
+                repbody->ioepoch = obj->mot_ioepoch;
+                spin_lock(&med->med_open_lock);
+                list_for_each_entry(mfd, &med->med_open_head, mfd_list) {
+                        if (mfd->mfd_xid == req->rq_xid)
+                                break;
+                }
+                LASSERT(&mfd->mfd_list != &med->med_open_head);
+                spin_unlock(&med->med_open_lock);
+                repbody->handle.cookie = mfd->mfd_handle.h_cookie;
+        }
 
-        /* Don't return OST-specific attributes if we didn't just set them */
-/*
-        if (rec->ur_iattr.ia_valid & ATTR_SIZE)
-                body->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
-        if (rec->ur_iattr.ia_valid & (ATTR_MTIME | ATTR_MTIME_SET))
-                body->valid |= OBD_MD_FLMTIME;
-        if (rec->ur_iattr.ia_valid & (ATTR_ATIME | ATTR_ATIME_SET))
-                body->valid |= OBD_MD_FLATIME;
-*/
         mdt_object_put(mti->mti_env, obj);
 }
 
-static void mdt_reconstruct_with_shrink(struct mdt_thread_info *mti,
-                                        struct mdt_lock_handle *lhc)
+static void mdt_reconstruct_setxattr(struct mdt_thread_info *mti,
+                                     struct mdt_lock_handle *lhc)
 {
-        mdt_reconstruct_generic(mti, lhc);
-        mdt_shrink_reply(mti);
+        /* reply nothing */
+        req_capsule_shrink(mti->mti_pill, &RMF_EADATA, 0, RCL_SERVER);
 }
 
 typedef void (*mdt_reconstructor)(struct mdt_thread_info *mti,
@@ -1116,9 +1112,10 @@ static mdt_reconstructor reconstructors[REINT_MAX] = {
         [REINT_SETATTR]  = mdt_reconstruct_setattr,
         [REINT_CREATE]   = mdt_reconstruct_create,
         [REINT_LINK]     = mdt_reconstruct_generic,
-        [REINT_UNLINK]   = mdt_reconstruct_with_shrink,
-        [REINT_RENAME]   = mdt_reconstruct_with_shrink,
-        [REINT_OPEN]     = mdt_reconstruct_open
+        [REINT_UNLINK]   = mdt_reconstruct_generic,
+        [REINT_RENAME]   = mdt_reconstruct_generic,
+        [REINT_OPEN]     = mdt_reconstruct_open,
+        [REINT_SETXATTR] = mdt_reconstruct_setxattr
 };
 
 void mdt_reconstruct(struct mdt_thread_info *mti,
@@ -1128,4 +1125,3 @@ void mdt_reconstruct(struct mdt_thread_info *mti,
         reconstructors[mti->mti_rr.rr_opcode](mti, lhc);
         EXIT;
 }
-