Whamcloud - gitweb
b=19387 integrate LST into acc-sm
[fs/lustre-release.git] / lustre / fid / fid_handler.c
index 5af9343..e85d0ef 100644 (file)
@@ -74,7 +74,7 @@ int seq_server_set_cli(struct lu_server_seq *seq,
          * Ask client for new range, assign that range to ->seq_space and write
          * seq state to backing store should be atomic.
          */
-        down(&seq->lss_sem);
+        cfs_down(&seq->lss_sem);
 
         if (cli == NULL) {
                 CDEBUG(D_INFO, "%s: Detached sequence client %s\n",
@@ -96,7 +96,7 @@ int seq_server_set_cli(struct lu_server_seq *seq,
         cli->lcs_space.lsr_mdt = seq->lss_site->ms_node_id;
         EXIT;
 out_up:
-        up(&seq->lss_sem);
+        cfs_up(&seq->lss_sem);
         return rc;
 }
 EXPORT_SYMBOL(seq_server_set_cli);
@@ -185,9 +185,9 @@ int seq_server_alloc_super(struct lu_server_seq *seq,
         int rc;
         ENTRY;
 
-        down(&seq->lss_sem);
+        cfs_down(&seq->lss_sem);
         rc = __seq_server_alloc_super(seq, in, out, env);
-        up(&seq->lss_sem);
+        cfs_up(&seq->lss_sem);
 
         RETURN(rc);
 }
@@ -213,14 +213,12 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq,
                 CDEBUG(D_INFO, "%s: Input seq range: "
                        DRANGE"\n", seq->lss_name, PRANGE(in));
 
-                if (range_is_exhausted(space)) {
+                if (in->lsr_end <= space->lsr_start) {
                         /*
-                         * Server cannot send empty range to client, this is why
-                         * we check here that range from client is "newer" than
-                         * exhausted super.
+                         * Client is replaying a fairly old range, server
+                         * don't need to do any allocation.
                          */
-                        LASSERT(in->lsr_end > space->lsr_start);
-
+                } else if (range_is_exhausted(space)) {
                         /*
                          * Start is set to end of last allocated, because it
                          * *is* already allocated so we take that into account
@@ -258,8 +256,21 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq,
                          * Update super start by end from client's range. Super
                          * end should not be changed if range was not exhausted.
                          */
-                        if (in->lsr_end > space->lsr_start)
-                                space->lsr_start = in->lsr_end;
+                        space->lsr_start = in->lsr_end;
+                }
+
+                /* sending replay_super to update fld as only super sequence
+                 * server can update fld.
+                 * we are sending meta sequence to fld rather than super
+                 * sequence, but fld server can handle range merging. */
+
+                in->lsr_mdt = space->lsr_mdt;
+                rc = seq_client_replay_super(seq->lss_cli, in, env);
+
+                if (rc) {
+                        CERROR("%s: Can't replay super-sequence, "
+                                        "rc %d\n", seq->lss_name, rc);
+                        RETURN(rc);
                 }
 
                 *out = *in;
@@ -320,9 +331,9 @@ int seq_server_alloc_meta(struct lu_server_seq *seq,
         int rc;
         ENTRY;
 
-        down(&seq->lss_sem);
+        cfs_down(&seq->lss_sem);
         rc = __seq_server_alloc_meta(seq, in, out, env);
-        up(&seq->lss_sem);
+        cfs_up(&seq->lss_sem);
 
         RETURN(rc);
 }
@@ -392,7 +403,12 @@ static int seq_req_handle(struct ptlrpc_request *req,
 
                 if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
                         in = tmp;
-                        LASSERT(!range_is_zero(in) && range_is_sane(in));
+
+                        if (range_is_zero(in) || !range_is_sane(in)) {
+                                CERROR("Replayed seq range is invalid: "
+                                       DRANGE"\n", PRANGE(in));
+                                RETURN(err_serious(-EINVAL));
+                        }
                 }
                 /* seq client passed mdt id, we need to pass that using out
                  * range parameter */
@@ -524,7 +540,7 @@ int seq_server_init(struct lu_server_seq *seq,
         seq->lss_type = type;
         seq->lss_site = ms;
         range_init(&seq->lss_space);
-        sema_init(&seq->lss_sem, 1);
+        cfs_sema_init(&seq->lss_sem, 1);
 
         seq->lss_width = is_srv ?
                 LUSTRE_SEQ_META_WIDTH : LUSTRE_SEQ_SUPER_WIDTH;