]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/RadosDump.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / tools / RadosDump.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2015 Red Hat
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15 #include "RadosDump.h"
16
17 int RadosDump::read_super()
18 {
19 bufferlist ebl;
20 auto ebliter = ebl.cbegin();
21 ssize_t bytes;
22
23 bytes = ebl.read_fd(file_fd, super_header::FIXED_LENGTH);
24 if ((size_t)bytes != super_header::FIXED_LENGTH) {
25 cerr << "Unexpected EOF" << std::endl;
26 return -EFAULT;
27 }
28
29 sh.decode(ebliter);
30
31 return 0;
32 }
33
34
35 int RadosDump::get_header(header *h)
36 {
37 assert (h != NULL);
38
39 bufferlist ebl;
40 auto ebliter = ebl.cbegin();
41 ssize_t bytes;
42
43 bytes = ebl.read_fd(file_fd, sh.header_size);
44 if ((size_t)bytes != sh.header_size) {
45 cerr << "Unexpected EOF" << std::endl;
46 return -EFAULT;
47 }
48
49 h->decode(ebliter);
50
51 return 0;
52 }
53
54 int RadosDump::get_footer(footer *f)
55 {
56 ceph_assert(f != NULL);
57
58 bufferlist ebl;
59 auto ebliter = ebl.cbegin();
60 ssize_t bytes;
61
62 bytes = ebl.read_fd(file_fd, sh.footer_size);
63 if ((size_t)bytes != sh.footer_size) {
64 cerr << "Unexpected EOF" << std::endl;
65 return -EFAULT;
66 }
67
68 f->decode(ebliter);
69
70 if (f->magic != endmagic) {
71 cerr << "Bad footer magic" << std::endl;
72 return -EFAULT;
73 }
74
75 return 0;
76 }
77
78 int RadosDump::read_section(sectiontype_t *type, bufferlist *bl)
79 {
80 header hdr;
81 ssize_t bytes;
82
83 int ret = get_header(&hdr);
84 if (ret)
85 return ret;
86
87 *type = hdr.type;
88
89 bl->clear();
90 bytes = bl->read_fd(file_fd, hdr.size);
91 if (bytes != hdr.size) {
92 cerr << "Unexpected EOF" << std::endl;
93 return -EFAULT;
94 }
95
96 if (hdr.size > 0) {
97 footer ft;
98 ret = get_footer(&ft);
99 if (ret)
100 return ret;
101 }
102
103 return 0;
104 }
105
106
107 int RadosDump::skip_object(bufferlist &bl)
108 {
109 bufferlist ebl;
110 bool done = false;
111 while(!done) {
112 sectiontype_t type;
113 int ret = read_section(&type, &ebl);
114 if (ret)
115 return ret;
116
117 if (type >= END_OF_TYPES) {
118 cout << "Skipping unknown object section type" << std::endl;
119 continue;
120 }
121 switch(type) {
122 case TYPE_DATA:
123 case TYPE_ATTRS:
124 case TYPE_OMAP_HDR:
125 case TYPE_OMAP:
126 #ifdef DIAGNOSTIC
127 cerr << "Skip type " << (int)type << std::endl;
128 #endif
129 break;
130 case TYPE_OBJECT_END:
131 done = true;
132 break;
133 default:
134 cerr << "Can't skip unknown type: " << type << std::endl;
135 return -EFAULT;
136 }
137 }
138 return 0;
139 }
140
141 //Write super_header with its fixed 16 byte length
142 void RadosDump::write_super()
143 {
144 if (dry_run) {
145 return;
146 }
147
148 bufferlist superbl;
149 super_header sh;
150 footer ft;
151
152 header hdr(TYPE_NONE, 0);
153 hdr.encode(superbl);
154
155 sh.magic = super_header::super_magic;
156 sh.version = super_header::super_ver;
157 sh.header_size = superbl.length();
158 superbl.clear();
159 ft.encode(superbl);
160 sh.footer_size = superbl.length();
161 superbl.clear();
162
163 sh.encode(superbl);
164 ceph_assert(super_header::FIXED_LENGTH == superbl.length());
165 superbl.write_fd(file_fd);
166 }