Whamcloud - gitweb
LU-3536 lod: cancel update log after all committed
[fs/lustre-release.git] / lustre / fid / fid_handler.c
index fe94281..1046b3c 100644 (file)
@@ -258,17 +258,27 @@ static int range_alloc_set(const struct lu_env *env,
         RETURN(rc);
 }
 
-static int __seq_server_alloc_meta(struct lu_server_seq *seq,
-                                   struct lu_seq_range *out,
-                                   const struct lu_env *env)
+/**
+ * Check if the sequence server has sequence avaible
+ *
+ * Check if the sequence server has sequence avaible, if not, then
+ * allocating super sequence from sequence manager (MDT0).
+ *
+ * \param[in] env      execution environment
+ * \param[in] seq      server sequence
+ *
+ * \retval             negative errno if allocating new sequence fails
+ * \retval             0 if there is enough sequence or allocating
+ *                      new sequence succeeds
+ */
+int seq_server_check_and_alloc_super(const struct lu_env *env,
+                                    struct lu_server_seq *seq)
 {
        struct lu_seq_range *space = &seq->lss_space;
        int rc = 0;
 
        ENTRY;
 
-       LASSERT(range_is_sane(space));
-
        /* Check if available space ends and allocate new super seq */
        if (range_is_exhausted(space)) {
                if (!seq->lss_cli) {
@@ -279,8 +289,8 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq,
 
                rc = seq_client_alloc_super(seq->lss_cli, env);
                if (rc) {
-                       CERROR("%s: Can't allocate super-sequence, rc %d\n",
-                              seq->lss_name, rc);
+                       CDEBUG(D_HA, "%s: Can't allocate super-sequence:"
+                             " rc %d\n", seq->lss_name, rc);
                        RETURN(rc);
                }
 
@@ -298,6 +308,31 @@ static int __seq_server_alloc_meta(struct lu_server_seq *seq,
                }
        }
 
+       if (range_is_zero(&seq->lss_lowater_set))
+               __seq_set_init(env, seq);
+
+       RETURN(rc);
+}
+EXPORT_SYMBOL(seq_server_check_and_alloc_super);
+
+static int __seq_server_alloc_meta(struct lu_server_seq *seq,
+                                  struct lu_seq_range *out,
+                                  const struct lu_env *env)
+{
+       struct lu_seq_range *space = &seq->lss_space;
+       int rc = 0;
+
+       ENTRY;
+
+       LASSERT(range_is_sane(space));
+
+       rc = seq_server_check_and_alloc_super(env, seq);
+       if (rc < 0) {
+               CERROR("%s: Allocated super-sequence failed: rc = %d\n",
+                       seq->lss_name, rc);
+               RETURN(rc);
+       }
+
        rc = range_alloc_set(env, out, seq);
        if (rc != 0) {
                CERROR("%s: Allocated meta-sequence failed: rc = %d\n",
@@ -324,6 +359,7 @@ int seq_server_alloc_meta(struct lu_server_seq *seq,
 
         RETURN(rc);
 }
+EXPORT_SYMBOL(seq_server_alloc_meta);
 
 static int seq_server_handle(struct lu_site *site,
                              const struct lu_env *env,