have_backtrace = false;
}
+ InodeStore dentry;
+ build_file_dentry(obj_name_ino, file_size, file_mtime, guessed_layout, &dentry);
+
// Inject inode to the metadata pool
if (have_backtrace) {
inode_backpointer_t root_bp = *(backtrace.ancestors.rbegin());
/* Special case for strays: even if we have a good backtrace,
* don't put it in the stray dir, because while that would technically
* give it linkage it would still be invisible to the user */
- r = driver->inject_lost_and_found(
- obj_name_ino, file_size, file_mtime, guessed_layout);
+ r = driver->inject_lost_and_found(obj_name_ino, dentry);
if (r < 0) {
dout(4) << "Error injecting 0x" << std::hex << backtrace.ino
<< std::dec << " into lost+found: " << cpp_strerror(r) << dendl;
}
} else {
/* Happy case: we will inject a named dentry for this inode */
- r = driver->inject_with_backtrace(
- backtrace, file_size, file_mtime, guessed_layout);
+ r = driver->inject_with_backtrace(backtrace, dentry);
if (r < 0) {
dout(4) << "Error injecting 0x" << std::hex << backtrace.ino
<< std::dec << " with backtrace: " << cpp_strerror(r) << dendl;
} else {
/* Backtrace-less case: we will inject a lost+found dentry */
r = driver->inject_lost_and_found(
- obj_name_ino, file_size, file_mtime, guessed_layout);
+ obj_name_ino, dentry);
if (r < 0) {
dout(4) << "Error injecting 0x" << std::hex << obj_name_ino
<< std::dec << " into lost+found: " << cpp_strerror(r) << dendl;
return 0;
}
-int MetadataDriver::inject_lost_and_found(inodeno_t ino, uint64_t file_size,
- time_t file_mtime, const ceph_file_layout &layout)
+int MetadataDriver::inject_lost_and_found(
+ inodeno_t ino, const InodeStore &dentry)
{
// Create lost+found if doesn't exist
bool created = false;
}
InodeStore recovered_ino;
- recovered_ino.inode.mode = 0500 | S_IFREG;
- recovered_ino.inode.size = file_size;
- recovered_ino.inode.max_size_ever = file_size;
- recovered_ino.inode.mtime.tv.tv_sec = file_mtime;
- recovered_ino.inode.atime.tv.tv_sec = file_mtime;
- recovered_ino.inode.ctime.tv.tv_sec = file_mtime;
-
- recovered_ino.inode.layout = layout;
-
- recovered_ino.inode.truncate_seq = 1;
- recovered_ino.inode.truncate_size = -1ull;
- recovered_ino.inode.inline_data.version = CEPH_INLINE_NONE;
-
- recovered_ino.inode.nlink = 1;
- recovered_ino.inode.ino = ino;
- recovered_ino.inode.version = 1;
- recovered_ino.inode.backtrace_version = 1;
- recovered_ino.inode.uid = g_conf->mds_root_ino_uid;
- recovered_ino.inode.gid = g_conf->mds_root_ino_gid;
const std::string dname = lost_found_dname(ino);
// Write dentry into lost+found dirfrag
- return inject_linkage(lf_ino.inode.ino, dname, frag_t(), recovered_ino);
+ return inject_linkage(lf_ino.inode.ino, dname, frag_t(), dentry);
}
int MetadataDriver::inject_with_backtrace(
- const inode_backtrace_t &backtrace, uint64_t file_size, time_t file_mtime,
- const ceph_file_layout &layout)
+ const inode_backtrace_t &backtrace, const InodeStore &dentry)
{
<< dname << " already exists but points to 0x"
<< std::hex << existing_dentry.inode.ino << std::dec << dendl;
// Fall back to lost+found!
- return inject_lost_and_found(backtrace.ino, file_size, file_mtime,
- layout);
+ return inject_lost_and_found(backtrace.ino, dentry);
}
}
// Inject linkage
// ==============
+
if (write_dentry) {
- InodeStore dentry;
if (i == backtrace.ancestors.begin()) {
- // This is the linkage for a file
- dentry.inode.mode = 0500 | S_IFREG;
+ // This is the linkage for the file of interest
dout(10) << "Linking inode 0x" << std::hex << ino
<< " at 0x" << parent_ino << "/" << dname << std::dec
- << " with size=" << file_size << " bytes" << dendl;
+ << " with size=" << dentry.inode.size << " bytes" << dendl;
- // The file size and mtime we learned by scanning globally
- dentry.inode.size = file_size;
- dentry.inode.max_size_ever = file_size;
- dentry.inode.mtime.tv.tv_sec = file_mtime;
- dentry.inode.atime.tv.tv_sec = file_mtime;
- dentry.inode.ctime.tv.tv_sec = file_mtime;
-
- dentry.inode.layout = layout;
-
- dentry.inode.truncate_seq = 1;
- dentry.inode.truncate_size = -1ull;
-
- dentry.inode.inline_data.version = CEPH_INLINE_NONE;
+ r = inject_linkage(parent_ino, dname, fragment, dentry);
} else {
- // This is the linkage for a directory
- dentry.inode.mode = 0755 | S_IFDIR;
+ // This is the linkage for an ancestor directory
+ InodeStore ancestor_dentry;
+ ancestor_dentry.inode.mode = 0755 | S_IFDIR;
// Set nfiles to something non-zero, to fool any other code
// that tries to ignore 'empty' directories. This won't be
// accurate, but it should avoid functional issues.
- dentry.inode.dirstat.nfiles = 1;
- dentry.inode.size = 1;
-
+ ancestor_dentry.inode.dirstat.nfiles = 1;
+ ancestor_dentry.inode.size = 1;
+
+ ancestor_dentry.inode.nlink = 1;
+ ancestor_dentry.inode.ino = ino;
+ ancestor_dentry.inode.uid = g_conf->mds_root_ino_uid;
+ ancestor_dentry.inode.gid = g_conf->mds_root_ino_gid;
+ ancestor_dentry.inode.version = 1;
+ ancestor_dentry.inode.backtrace_version = 1;
+ r = inject_linkage(parent_ino, dname, fragment, ancestor_dentry);
}
- dentry.inode.nlink = 1;
- dentry.inode.ino = ino;
- dentry.inode.uid = g_conf->mds_root_ino_uid;
- dentry.inode.gid = g_conf->mds_root_ino_gid;
- dentry.inode.version = 1;
- dentry.inode.backtrace_version = 1;
- r = inject_linkage(parent_ino, dname, fragment, dentry);
+
if (r < 0) {
return r;
}
int LocalFileDriver::inject_with_backtrace(
const inode_backtrace_t &bt,
- uint64_t size,
- time_t mtime,
- const ceph_file_layout &layout)
+ const InodeStore &dentry)
{
std::string path_builder = path;
if (is_file) {
// FIXME: inject_data won't cope with interesting (i.e. striped)
// layouts (need a librados-compatible Filer to read these)
- inject_data(path_builder, size, layout.fl_object_size, bt.ino);
+ inject_data(path_builder, dentry.inode.size, dentry.inode.layout.fl_object_size, bt.ino);
} else {
int r = mkdir(path_builder.c_str(), 0755);
if (r != 0 && r != -EPERM) {
int LocalFileDriver::inject_lost_and_found(
inodeno_t ino,
- uint64_t size,
- time_t mtime,
- const ceph_file_layout &layout)
+ const InodeStore &dentry)
{
std::string lf_path = path + "/lost+found";
int r = mkdir(lf_path.c_str(), 0755);
}
std::string file_path = lf_path + "/" + lost_found_dname(ino);
- return inject_data(file_path, size, layout.fl_object_size, ino);
+ return inject_data(file_path, dentry.inode.size, dentry.inode.layout.fl_object_size, ino);
}
int LocalFileDriver::init_roots(int64_t data_pool_id)
return 0;
}
+void DataScan::build_file_dentry(
+ inodeno_t ino, uint64_t file_size, time_t file_mtime,
+ const ceph_file_layout &layout, InodeStore *out)
+{
+ assert(out != NULL);
+
+ out->inode.mode = 0500 | S_IFREG;
+ out->inode.size = file_size;
+ out->inode.max_size_ever = file_size;
+ out->inode.mtime.tv.tv_sec = file_mtime;
+ out->inode.atime.tv.tv_sec = file_mtime;
+ out->inode.ctime.tv.tv_sec = file_mtime;
+
+ out->inode.layout = layout;
+
+ out->inode.truncate_seq = 1;
+ out->inode.truncate_size = -1ull;
+
+ out->inode.inline_data.version = CEPH_INLINE_NONE;
+
+ out->inode.nlink = 1;
+ out->inode.ino = ino;
+ out->inode.version = 1;
+ out->inode.backtrace_version = 1;
+ out->inode.uid = g_conf->mds_root_ino_uid;
+ out->inode.gid = g_conf->mds_root_ino_gid;
+}
+
*/
virtual int inject_with_backtrace(
const inode_backtrace_t &bt,
- uint64_t size,
- time_t mtime,
- const ceph_file_layout &layout) = 0;
+ const InodeStore &dentry) = 0;
/**
* Inject an inode + dentry into the lost+found directory,
*/
virtual int inject_lost_and_found(
inodeno_t ino,
- uint64_t size,
- time_t mtime,
- const ceph_file_layout &layout) = 0;
+ const InodeStore &dentry) = 0;
/**
* Create any missing roots (i.e. mydir, strays, root inode)
int inject_with_backtrace(
const inode_backtrace_t &bt,
- uint64_t size,
- time_t mtime,
- ceph_file_layout const &layout);
+ const InodeStore &dentry);
int inject_lost_and_found(
inodeno_t ino,
- uint64_t size,
- time_t mtime,
- ceph_file_layout const &layout);
+ const InodeStore &dentry);
int init_roots(int64_t data_pool_id);
int inject_with_backtrace(
const inode_backtrace_t &bt,
- uint64_t size,
- time_t mtime,
- ceph_file_layout const &layout);
+ const InodeStore &dentry);
int inject_lost_and_found(
inodeno_t ino,
- uint64_t size,
- time_t mtime,
- ceph_file_layout const &layout);
+ const InodeStore &dentry);
int init_roots(int64_t data_pool_id);
const std::vector<const char*> &arg,
std::vector<const char *>::const_iterator &i);
+ void build_file_dentry(
+ inodeno_t ino, uint64_t file_size, time_t file_mtime,
+ const ceph_file_layout &layout,
+ InodeStore *out);
+
+
public:
void usage();
int main(const std::vector<const char *> &args);