Whamcloud - gitweb
Add functions to map (rather arbitrary) between LDLM error codes and standard
authornikita <nikita>
Sat, 18 Oct 2008 17:01:23 +0000 (17:01 +0000)
committernikita <nikita>
Sat, 18 Oct 2008 17:01:23 +0000 (17:01 +0000)
errno values. CLIO needs this to prevent LDLM specific constants from escaping
ldlm and osc.
b=16450

lustre/ChangeLog
lustre/ldlm/ldlm_lib.c

index 7ba9637..4cceacd 100644 (file)
@@ -1527,7 +1527,14 @@ Details    : CLIO posts ENQUEUE requests asynchronously through ptlrpcd---a
             case that stock ldlm_completion_ast() cannot handle as it waits
             until lock is granted. Introduce new ldlm_completion_ast_async()
             for this. Also comment ldlm_completion_ast().
-       
+
+Severity   : normal
+Bugzilla   : 16450
+Description: ldlm_error <-> errno conversion.
+Details    : Add functions to map (rather arbitrary) between LDLM error codes
+            and standard errno values. CLIO needs this to prevent LDLM specific
+            constants from escaping ldlm and osc.
+
 --------------------------------------------------------------------------------
 
 2007-08-10         Cluster File Systems, Inc. <info@clusterfs.com>
index 6a6022c..1b21a8d 100644 (file)
@@ -2247,3 +2247,82 @@ ldlm_mode_t lck_compat_array[] = {
         [LCK_NL] LCK_COMPAT_NL,
         [LCK_GROUP] LCK_COMPAT_GROUP
 };
+
+/**
+ * Rather arbitrary mapping from LDLM error codes to errno values. This should
+ * not escape to the user level.
+ */
+int ldlm_error2errno(ldlm_error_t error)
+{
+        int result;
+
+        switch (error) {
+        case ELDLM_OK:
+                result = 0;
+                break;
+        case ELDLM_LOCK_CHANGED:
+                result = -ESTALE;
+                break;
+        case ELDLM_LOCK_ABORTED:
+                result = -ENAVAIL;
+                break;
+        case ELDLM_LOCK_REPLACED:
+                result = -ESRCH;
+                break;
+        case ELDLM_NO_LOCK_DATA:
+                result = -ENOENT;
+                break;
+        case ELDLM_NAMESPACE_EXISTS:
+                result = -EEXIST;
+                break;
+        case ELDLM_BAD_NAMESPACE:
+                result = -EBADF;
+                break;
+        default:
+                if (((int)error) < 0)  /* cast to signed type */
+                        result = error; /* as ldlm_error_t can be unsigned */
+                else {
+                        CERROR("Invalid DLM result code: %i\n", error);
+                        result = -EPROTO;
+                }
+        }
+        return result;
+}
+EXPORT_SYMBOL(ldlm_error2errno);
+
+/**
+ * Dual to ldlm_error2errno(): maps errno values back to ldlm_error_t.
+ */
+ldlm_error_t ldlm_errno2error(int err_no)
+{
+        int error;
+
+        switch (err_no) {
+        case 0:
+                error = ELDLM_OK;
+                break;
+        case -ESTALE:
+                error = ELDLM_LOCK_CHANGED;
+                break;
+        case -ENAVAIL:
+                error = ELDLM_LOCK_ABORTED;
+                break;
+        case -ESRCH:
+                error = ELDLM_LOCK_REPLACED;
+                break;
+        case -ENOENT:
+                error = ELDLM_NO_LOCK_DATA;
+                break;
+        case -EEXIST:
+                error = ELDLM_NAMESPACE_EXISTS;
+                break;
+        case -EBADF:
+                error = ELDLM_BAD_NAMESPACE;
+                break;
+        default:
+                error = err_no;
+        }
+        return error;
+}
+EXPORT_SYMBOL(ldlm_errno2error);
+