]> git.proxmox.com Git - ceph.git/blame - ceph/src/tools/RadosDump.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / tools / RadosDump.cc
CommitLineData
7c673cae
FG
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
20effc67
TL
17using std::cerr;
18using std::cout;
19
7c673cae
FG
20int RadosDump::read_super()
21{
22 bufferlist ebl;
11fdf7f2 23 auto ebliter = ebl.cbegin();
7c673cae
FG
24 ssize_t bytes;
25
26 bytes = ebl.read_fd(file_fd, super_header::FIXED_LENGTH);
27 if ((size_t)bytes != super_header::FIXED_LENGTH) {
28 cerr << "Unexpected EOF" << std::endl;
29 return -EFAULT;
30 }
31
32 sh.decode(ebliter);
33
34 return 0;
35}
36
37
38int RadosDump::get_header(header *h)
39{
40 assert (h != NULL);
41
42 bufferlist ebl;
11fdf7f2 43 auto ebliter = ebl.cbegin();
7c673cae
FG
44 ssize_t bytes;
45
46 bytes = ebl.read_fd(file_fd, sh.header_size);
47 if ((size_t)bytes != sh.header_size) {
48 cerr << "Unexpected EOF" << std::endl;
49 return -EFAULT;
50 }
51
52 h->decode(ebliter);
53
54 return 0;
55}
56
57int RadosDump::get_footer(footer *f)
58{
11fdf7f2 59 ceph_assert(f != NULL);
7c673cae
FG
60
61 bufferlist ebl;
11fdf7f2 62 auto ebliter = ebl.cbegin();
7c673cae
FG
63 ssize_t bytes;
64
65 bytes = ebl.read_fd(file_fd, sh.footer_size);
66 if ((size_t)bytes != sh.footer_size) {
67 cerr << "Unexpected EOF" << std::endl;
68 return -EFAULT;
69 }
70
71 f->decode(ebliter);
72
73 if (f->magic != endmagic) {
74 cerr << "Bad footer magic" << std::endl;
75 return -EFAULT;
76 }
77
78 return 0;
79}
80
81int RadosDump::read_section(sectiontype_t *type, bufferlist *bl)
82{
83 header hdr;
84 ssize_t bytes;
85
86 int ret = get_header(&hdr);
87 if (ret)
88 return ret;
89
90 *type = hdr.type;
91
92 bl->clear();
93 bytes = bl->read_fd(file_fd, hdr.size);
94 if (bytes != hdr.size) {
95 cerr << "Unexpected EOF" << std::endl;
96 return -EFAULT;
97 }
98
99 if (hdr.size > 0) {
100 footer ft;
101 ret = get_footer(&ft);
102 if (ret)
103 return ret;
104 }
105
106 return 0;
107}
108
109
110int RadosDump::skip_object(bufferlist &bl)
111{
7c673cae
FG
112 bufferlist ebl;
113 bool done = false;
114 while(!done) {
115 sectiontype_t type;
116 int ret = read_section(&type, &ebl);
117 if (ret)
118 return ret;
119
7c673cae
FG
120 if (type >= END_OF_TYPES) {
121 cout << "Skipping unknown object section type" << std::endl;
122 continue;
123 }
124 switch(type) {
125 case TYPE_DATA:
126 case TYPE_ATTRS:
127 case TYPE_OMAP_HDR:
128 case TYPE_OMAP:
129#ifdef DIAGNOSTIC
130 cerr << "Skip type " << (int)type << std::endl;
131#endif
132 break;
133 case TYPE_OBJECT_END:
134 done = true;
135 break;
136 default:
137 cerr << "Can't skip unknown type: " << type << std::endl;
138 return -EFAULT;
139 }
140 }
141 return 0;
142}
143
144//Write super_header with its fixed 16 byte length
145void RadosDump::write_super()
146{
147 if (dry_run) {
148 return;
149 }
150
151 bufferlist superbl;
152 super_header sh;
153 footer ft;
154
155 header hdr(TYPE_NONE, 0);
156 hdr.encode(superbl);
157
158 sh.magic = super_header::super_magic;
159 sh.version = super_header::super_ver;
160 sh.header_size = superbl.length();
161 superbl.clear();
162 ft.encode(superbl);
163 sh.footer_size = superbl.length();
164 superbl.clear();
165
166 sh.encode(superbl);
11fdf7f2 167 ceph_assert(super_header::FIXED_LENGTH == superbl.length());
7c673cae
FG
168 superbl.write_fd(file_fd);
169}