return 0;
}
+// sync the mode of the remote dir_root with that of the local dir_root
+int PeerReplayer::sync_perms(const std::string& path) {
+ int r = 0;
+ struct ceph_statx tstx;
+
+ r = ceph_statx(m_local_mount, path.c_str(), &tstx, CEPH_STATX_MODE,
+ AT_STATX_DONT_SYNC | AT_SYMLINK_NOFOLLOW);
+ if (r < 0) {
+ derr << ": failed to fetch stat for local path: "
+ << cpp_strerror(r) << dendl;
+ return r;
+ }
+ r = ceph_chmod(m_remote_mount, path.c_str(), tstx.stx_mode);
+ if (r < 0) {
+ derr << ": failed to set mode for remote path: "
+ << cpp_strerror(r) << dendl;
+ return r;
+ }
+ return 0;
+}
+
void PeerReplayer::post_sync_close_handles(const FHandles &fh) {
dout(20) << dendl;
dout(5) << ": picked dir_root=" << *dir_root << dendl;
int r = register_directory(*dir_root, replayer);
if (r == 0) {
- sync_snaps(*dir_root, locker);
- unregister_directory(*dir_root);
+ r = sync_perms(*dir_root);
+ if (r < 0) {
+ _inc_failed_count(*dir_root);
+ } else {
+ sync_snaps(*dir_root, locker);
+ }
+ unregister_directory(*dir_root);
}
}