]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/RadosDump.cc
add subtree-ish sources for 12.0.3
[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 bufferlist::iterator ebliter = ebl.begin();
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 bufferlist::iterator ebliter = ebl.begin();
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 assert(f != NULL);
57
58 bufferlist ebl;
59 bufferlist::iterator ebliter = ebl.begin();
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::iterator ebliter = bl.begin();
110 bufferlist ebl;
111 bool done = false;
112 while(!done) {
113 sectiontype_t type;
114 int ret = read_section(&type, &ebl);
115 if (ret)
116 return ret;
117
118 ebliter = ebl.begin();
119 if (type >= END_OF_TYPES) {
120 cout << "Skipping unknown object section type" << std::endl;
121 continue;
122 }
123 switch(type) {
124 case TYPE_DATA:
125 case TYPE_ATTRS:
126 case TYPE_OMAP_HDR:
127 case TYPE_OMAP:
128 #ifdef DIAGNOSTIC
129 cerr << "Skip type " << (int)type << std::endl;
130 #endif
131 break;
132 case TYPE_OBJECT_END:
133 done = true;
134 break;
135 default:
136 cerr << "Can't skip unknown type: " << type << std::endl;
137 return -EFAULT;
138 }
139 }
140 return 0;
141 }
142
143 //Write super_header with its fixed 16 byte length
144 void RadosDump::write_super()
145 {
146 if (dry_run) {
147 return;
148 }
149
150 bufferlist superbl;
151 super_header sh;
152 footer ft;
153
154 header hdr(TYPE_NONE, 0);
155 hdr.encode(superbl);
156
157 sh.magic = super_header::super_magic;
158 sh.version = super_header::super_ver;
159 sh.header_size = superbl.length();
160 superbl.clear();
161 ft.encode(superbl);
162 sh.footer_size = superbl.length();
163 superbl.clear();
164
165 sh.encode(superbl);
166 assert(super_header::FIXED_LENGTH == superbl.length());
167 superbl.write_fd(file_fd);
168 }