xref: /reactos/base/services/nfsd/pnfs_debug.c (revision d2aeaba5)
1 /* NFSv4.1 client for Windows
2  * Copyright � 2012 The Regents of the University of Michigan
3  *
4  * Olga Kornievskaia <aglo@umich.edu>
5  * Casey Bodley <cbodley@umich.edu>
6  *
7  * This library is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * without any warranty; without even the implied warranty of merchantability
14  * or fitness for a particular purpose.  See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  */
21 
22 #include <winsock2.h>
23 #include <strsafe.h>
24 #include "pnfs.h"
25 #include "daemon_debug.h"
26 
27 
28 const char* pnfs_error_string(enum pnfs_status status)
29 {
30     switch (status) {
31     case PNFS_SUCCESS:          return "PNFS_SUCCESS";
32     case PNFS_PENDING:          return "PNFS_PENDING";
33     case PNFS_READ_EOF:         return "PNFS_READ_EOF";
34     case PNFSERR_NOT_SUPPORTED: return "PNFSERR_NOT_SUPPORTED";
35     case PNFSERR_NOT_CONNECTED: return "PNFSERR_NOT_CONNECTED";
36     case PNFSERR_IO:            return "PNFSERR_IO";
37     case PNFSERR_NO_DEVICE:     return "PNFSERR_NO_DEVICE";
38     case PNFSERR_NO_LAYOUT:     return "PNFSERR_NO_LAYOUT";
39     case PNFSERR_INVALID_FH_LIST: return "PNFSERR_INVALID_FH_LIST";
40     case PNFSERR_INVALID_DS_INDEX: return "PNFSERR_INVALID_DS_INDEX";
41     case PNFSERR_RESOURCES:     return "PNFSERR_RESOURCES";
42     case PNFSERR_LAYOUT_RECALLED: return "PNFSERR_LAYOUT_RECALLED";
43     case PNFSERR_LAYOUT_CHANGED: return "PNFSERR_LAYOUT_CHANGED";
44     default:                    return "Invalid pnfs status";
45     }
46 }
47 
48 const char* pnfs_layout_type_string(enum pnfs_layout_type type)
49 {
50     switch (type) {
51     case PNFS_LAYOUTTYPE_FILE:  return "PNFS_LAYOUTTYPE_FILE";
52     case PNFS_LAYOUTTYPE_OBJECT: return "PNFS_LAYOUTTYPE_OBJECT";
53     case PNFS_LAYOUTTYPE_BLOCK: return "PNFS_LAYOUTTYPE_BLOCK";
54     default:                    return "Invalid layout type";
55     }
56 }
57 
58 const char* pnfs_iomode_string(enum pnfs_iomode iomode)
59 {
60     switch (iomode) {
61     case PNFS_IOMODE_READ:      return "PNFS_IOMODE_READ";
62     case PNFS_IOMODE_RW:        return "PNFS_IOMODE_RW";
63     case PNFS_IOMODE_ANY:       return "PNFS_IOMODE_ANY";
64     default:                    return "Invalid io mode";
65     }
66 }
67 
68 void dprint_deviceid(
69     IN int level,
70     IN const char *title,
71     IN const unsigned char *deviceid)
72 {
73     /* deviceid is 16 bytes, so print it as 4 uints */
74     uint32_t *p = (uint32_t*)deviceid;
75     dprintf(level, "%s%08X.%08X.%08X.%08X\n",
76         title, htonl(p[0]), htonl(p[1]), htonl(p[2]), htonl(p[3]));
77 }
78 
79 void dprint_layout(
80     IN int level,
81     IN const pnfs_file_layout *layout)
82 {
83     dprintf(level, "  type:             %s\n", pnfs_layout_type_string(layout->layout.type));
84     dprintf(level, "  iomode:           %s\n", pnfs_iomode_string(layout->layout.iomode));
85     dprint_deviceid(level, "  deviceid:         ", layout->deviceid);
86     dprintf(level, "  offset:           %llu\n", layout->layout.offset);
87     dprintf(level, "  length:           %llu\n", layout->layout.length);
88     dprintf(level, "  pattern_offset:   %llu\n", layout->pattern_offset);
89     dprintf(level, "  first_index:      %u\n", layout->first_index);
90     dprintf(level, "  dense:            %u\n", is_dense(layout));
91     dprintf(level, "  commit_to_mds:    %u\n", should_commit_to_mds(layout));
92     dprintf(level, "  stripe_unit_size: %u\n", layout_unit_size(layout));
93     dprintf(level, "  file handles:     %u\n", layout->filehandles.count);
94 }
95 
96 #define MULTI_ADDR_BUFFER_LEN \
97     (NFS41_ADDRS_PER_SERVER*(NFS41_UNIVERSAL_ADDR_LEN+1)+1)
98 
99 static void dprint_multi_addr(
100     IN int level,
101     IN uint32_t index,
102     IN const multi_addr4 *addrs)
103 {
104     char buffer[MULTI_ADDR_BUFFER_LEN] = "";
105     uint32_t i;
106     for (i = 0; i < addrs->count; i++) {
107         StringCchCatA(buffer, MULTI_ADDR_BUFFER_LEN, addrs->arr[i].uaddr);
108         StringCchCatA(buffer, MULTI_ADDR_BUFFER_LEN, " ");
109     }
110     dprintf(level, "  servers[%d]:       [ %s]\n", index, buffer);
111 }
112 
113 void dprint_device(
114     IN int level,
115     IN const pnfs_file_device *device)
116 {
117     uint32_t i;
118     dprint_deviceid(level, "  deviceid:         ", device->device.deviceid);
119     dprintf(level, "  type:             %s\n", pnfs_layout_type_string(device->device.type));
120     dprintf(level, "  stripes:          %u\n", device->stripes.count);
121     for (i = 0; i < device->servers.count; i++)
122         dprint_multi_addr(level, i, &device->servers.arr[i].addrs);
123 }
124