linux/fs/dlm/util.c
<<
>>
Prefs
   1/******************************************************************************
   2*******************************************************************************
   3**
   4**  Copyright (C) 2005-2008 Red Hat, Inc.  All rights reserved.
   5**
   6**  This copyrighted material is made available to anyone wishing to use,
   7**  modify, copy, or redistribute it subject to the terms and conditions
   8**  of the GNU General Public License v.2.
   9**
  10*******************************************************************************
  11******************************************************************************/
  12
  13#include "dlm_internal.h"
  14#include "rcom.h"
  15#include "util.h"
  16
  17#define DLM_ERRNO_EDEADLK               35
  18#define DLM_ERRNO_EBADR                 53
  19#define DLM_ERRNO_EBADSLT               57
  20#define DLM_ERRNO_EPROTO                71
  21#define DLM_ERRNO_EOPNOTSUPP            95
  22#define DLM_ERRNO_ETIMEDOUT            110
  23#define DLM_ERRNO_EINPROGRESS          115
  24
  25static void header_out(struct dlm_header *hd)
  26{
  27        hd->h_version           = cpu_to_le32(hd->h_version);
  28        hd->h_lockspace         = cpu_to_le32(hd->h_lockspace);
  29        hd->h_nodeid            = cpu_to_le32(hd->h_nodeid);
  30        hd->h_length            = cpu_to_le16(hd->h_length);
  31}
  32
  33static void header_in(struct dlm_header *hd)
  34{
  35        hd->h_version           = le32_to_cpu(hd->h_version);
  36        hd->h_lockspace         = le32_to_cpu(hd->h_lockspace);
  37        hd->h_nodeid            = le32_to_cpu(hd->h_nodeid);
  38        hd->h_length            = le16_to_cpu(hd->h_length);
  39}
  40
  41/* higher errno values are inconsistent across architectures, so select
  42   one set of values for on the wire */
  43
  44static int to_dlm_errno(int err)
  45{
  46        switch (err) {
  47        case -EDEADLK:
  48                return -DLM_ERRNO_EDEADLK;
  49        case -EBADR:
  50                return -DLM_ERRNO_EBADR;
  51        case -EBADSLT:
  52                return -DLM_ERRNO_EBADSLT;
  53        case -EPROTO:
  54                return -DLM_ERRNO_EPROTO;
  55        case -EOPNOTSUPP:
  56                return -DLM_ERRNO_EOPNOTSUPP;
  57        case -ETIMEDOUT:
  58                return -DLM_ERRNO_ETIMEDOUT;
  59        case -EINPROGRESS:
  60                return -DLM_ERRNO_EINPROGRESS;
  61        }
  62        return err;
  63}
  64
  65static int from_dlm_errno(int err)
  66{
  67        switch (err) {
  68        case -DLM_ERRNO_EDEADLK:
  69                return -EDEADLK;
  70        case -DLM_ERRNO_EBADR:
  71                return -EBADR;
  72        case -DLM_ERRNO_EBADSLT:
  73                return -EBADSLT;
  74        case -DLM_ERRNO_EPROTO:
  75                return -EPROTO;
  76        case -DLM_ERRNO_EOPNOTSUPP:
  77                return -EOPNOTSUPP;
  78        case -DLM_ERRNO_ETIMEDOUT:
  79                return -ETIMEDOUT;
  80        case -DLM_ERRNO_EINPROGRESS:
  81                return -EINPROGRESS;
  82        }
  83        return err;
  84}
  85
  86void dlm_message_out(struct dlm_message *ms)
  87{
  88        header_out(&ms->m_header);
  89
  90        ms->m_type              = cpu_to_le32(ms->m_type);
  91        ms->m_nodeid            = cpu_to_le32(ms->m_nodeid);
  92        ms->m_pid               = cpu_to_le32(ms->m_pid);
  93        ms->m_lkid              = cpu_to_le32(ms->m_lkid);
  94        ms->m_remid             = cpu_to_le32(ms->m_remid);
  95        ms->m_parent_lkid       = cpu_to_le32(ms->m_parent_lkid);
  96        ms->m_parent_remid      = cpu_to_le32(ms->m_parent_remid);
  97        ms->m_exflags           = cpu_to_le32(ms->m_exflags);
  98        ms->m_sbflags           = cpu_to_le32(ms->m_sbflags);
  99        ms->m_flags             = cpu_to_le32(ms->m_flags);
 100        ms->m_lvbseq            = cpu_to_le32(ms->m_lvbseq);
 101        ms->m_hash              = cpu_to_le32(ms->m_hash);
 102        ms->m_status            = cpu_to_le32(ms->m_status);
 103        ms->m_grmode            = cpu_to_le32(ms->m_grmode);
 104        ms->m_rqmode            = cpu_to_le32(ms->m_rqmode);
 105        ms->m_bastmode          = cpu_to_le32(ms->m_bastmode);
 106        ms->m_asts              = cpu_to_le32(ms->m_asts);
 107        ms->m_result            = cpu_to_le32(to_dlm_errno(ms->m_result));
 108}
 109
 110void dlm_message_in(struct dlm_message *ms)
 111{
 112        header_in(&ms->m_header);
 113
 114        ms->m_type              = le32_to_cpu(ms->m_type);
 115        ms->m_nodeid            = le32_to_cpu(ms->m_nodeid);
 116        ms->m_pid               = le32_to_cpu(ms->m_pid);
 117        ms->m_lkid              = le32_to_cpu(ms->m_lkid);
 118        ms->m_remid             = le32_to_cpu(ms->m_remid);
 119        ms->m_parent_lkid       = le32_to_cpu(ms->m_parent_lkid);
 120        ms->m_parent_remid      = le32_to_cpu(ms->m_parent_remid);
 121        ms->m_exflags           = le32_to_cpu(ms->m_exflags);
 122        ms->m_sbflags           = le32_to_cpu(ms->m_sbflags);
 123        ms->m_flags             = le32_to_cpu(ms->m_flags);
 124        ms->m_lvbseq            = le32_to_cpu(ms->m_lvbseq);
 125        ms->m_hash              = le32_to_cpu(ms->m_hash);
 126        ms->m_status            = le32_to_cpu(ms->m_status);
 127        ms->m_grmode            = le32_to_cpu(ms->m_grmode);
 128        ms->m_rqmode            = le32_to_cpu(ms->m_rqmode);
 129        ms->m_bastmode          = le32_to_cpu(ms->m_bastmode);
 130        ms->m_asts              = le32_to_cpu(ms->m_asts);
 131        ms->m_result            = from_dlm_errno(le32_to_cpu(ms->m_result));
 132}
 133
 134void dlm_rcom_out(struct dlm_rcom *rc)
 135{
 136        header_out(&rc->rc_header);
 137
 138        rc->rc_type             = cpu_to_le32(rc->rc_type);
 139        rc->rc_result           = cpu_to_le32(rc->rc_result);
 140        rc->rc_id               = cpu_to_le64(rc->rc_id);
 141        rc->rc_seq              = cpu_to_le64(rc->rc_seq);
 142        rc->rc_seq_reply        = cpu_to_le64(rc->rc_seq_reply);
 143}
 144
 145void dlm_rcom_in(struct dlm_rcom *rc)
 146{
 147        header_in(&rc->rc_header);
 148
 149        rc->rc_type             = le32_to_cpu(rc->rc_type);
 150        rc->rc_result           = le32_to_cpu(rc->rc_result);
 151        rc->rc_id               = le64_to_cpu(rc->rc_id);
 152        rc->rc_seq              = le64_to_cpu(rc->rc_seq);
 153        rc->rc_seq_reply        = le64_to_cpu(rc->rc_seq_reply);
 154}
 155