blob: 954e5e5a663c77ba537ddaad6e6f3a0f42092d4f [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080016
17#ifndef UPDATE_ENGINE_MTD_FILE_DESCRIPTOR_H_
18#define UPDATE_ENGINE_MTD_FILE_DESCRIPTOR_H_
19
20// This module defines file descriptors that deal with NAND media. We are
21// concerned with raw NAND access (as MTD device), and through UBI layer.
22
23#include <mtdutils.h>
24
25#include "update_engine/file_descriptor.h"
26
27namespace chromeos_update_engine {
28
29// A class defining the file descriptor API for raw MTD device. This file
30// descriptor supports either random read, or sequential write but not both at
31// once.
32class MtdFileDescriptor : public EintrSafeFileDescriptor {
33 public:
34 MtdFileDescriptor();
35
36 static bool IsMtd(const char* path);
37
38 bool Open(const char* path, int flags, mode_t mode) override;
39 bool Open(const char* path, int flags) override;
40 ssize_t Read(void* buf, size_t count) override;
41 ssize_t Write(const void* buf, size_t count) override;
42 off64_t Seek(off64_t offset, int whence) override;
Alex Deymo79715ad2015-10-02 14:27:53 -070043 bool BlkIoctl(int request,
44 uint64_t start,
45 uint64_t length,
46 int* result) override {
47 return false;
48 }
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080049 bool Close() override;
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080050
51 private:
52 std::unique_ptr<MtdReadContext, decltype(&mtd_read_close)> read_ctx_;
53 std::unique_ptr<MtdWriteContext, decltype(&mtd_write_close)> write_ctx_;
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080054 uint64_t nr_written_;
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080055};
56
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080057struct UbiVolumeInfo {
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080058 // Number of eraseblocks.
59 uint64_t reserved_ebs;
60 // Size of each eraseblock.
61 uint64_t eraseblock_size;
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080062};
63
64// A file descriptor to update a UBI volume, similar to MtdFileDescriptor.
65// Once the file descriptor is opened for write, the volume is marked as being
66// updated. The volume will not be usable until an update is completed. See
67// UBI_IOCVOLUP ioctl operation.
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080068class UbiFileDescriptor : public EintrSafeFileDescriptor {
69 public:
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080070 // Perform some queries about |path| to see if it is a UBI volume.
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080071 static bool IsUbi(const char* path);
72
73 bool Open(const char* path, int flags, mode_t mode) override;
74 bool Open(const char* path, int flags) override;
75 ssize_t Read(void* buf, size_t count) override;
76 ssize_t Write(const void* buf, size_t count) override;
77 off64_t Seek(off64_t offset, int whence) override;
Alex Deymo79715ad2015-10-02 14:27:53 -070078 bool BlkIoctl(int request,
79 uint64_t start,
80 uint64_t length,
81 int* result) override {
82 return false;
83 }
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080084 bool Close() override;
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080085
86 private:
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080087 enum Mode {
88 kReadOnly,
89 kWriteOnly
90 };
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080091
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080092 uint64_t usable_eb_blocks_;
93 uint64_t eraseblock_size_;
94 uint64_t volume_size_;
95 uint64_t nr_written_;
96
97 Mode mode_;
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080098};
99
100} // namespace chromeos_update_engine
101
102#endif // UPDATE_ENGINE_MTD_FILE_DESCRIPTOR_H_