blob: f49aa39c9b580403ff8c089cc1307e1f7cff76ab [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cros-disks/mount_point.h"
#include <utility>
#include <base/logging.h>
#include "cros-disks/error_logger.h"
#include "cros-disks/mounter.h"
#include "cros-disks/quote.h"
namespace cros_disks {
namespace {
class LeakingMountPoint : public MountPoint {
public:
explicit LeakingMountPoint(const base::FilePath& path) : MountPoint(path) {}
LeakingMountPoint(const LeakingMountPoint&) = delete;
LeakingMountPoint& operator=(const LeakingMountPoint&) = delete;
~LeakingMountPoint() override { DestructorUnmount(); }
protected:
// MountPoint overrides.
MountErrorType UnmountImpl() override { return MOUNT_ERROR_PATH_NOT_MOUNTED; }
};
} // namespace
// static
std::unique_ptr<MountPoint> MountPoint::CreateLeaking(
const base::FilePath& path) {
return std::make_unique<LeakingMountPoint>(path);
}
MountPoint::MountPoint(const base::FilePath& path) : path_(path) {
DCHECK(!path_.empty());
}
MountPoint::~MountPoint() {
// Verify that subclasses call DestructorUnmount().
DCHECK(unmounted_on_destruction_)
<< "MountPoint subclasses MUST call DestructorUnmount() in their "
<< "destructor";
}
void MountPoint::Release() {
released_ = true;
}
MountErrorType MountPoint::Unmount() {
if (released_) {
// TODO(amistry): "not mounted" and "already unmounted" are logically
// different and should be treated differently. Introduce a new error code
// to represent this distinction.
return MOUNT_ERROR_PATH_NOT_MOUNTED;
}
MountErrorType error = UnmountImpl();
if (error == MOUNT_ERROR_NONE) {
released_ = true;
}
return error;
}
void MountPoint::DestructorUnmount() {
if (unmounted_on_destruction_) {
return;
}
unmounted_on_destruction_ = true;
MountErrorType error = Unmount();
if (error != MOUNT_ERROR_NONE && error != MOUNT_ERROR_PATH_NOT_MOUNTED) {
LOG(WARNING) << "Unmount error while destroying MountPoint("
<< quote(path()) << "): " << error;
}
}
} // namespace cros_disks