Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20c3be0e authored by Mike Lockwood's avatar Mike Lockwood
Browse files

MTP: Add support for reserve storage setting to avoid low storage situations.



Set resource config_mtpReserveSpaceMegabytes to number of megabytes to reserve.
If MTP has dedicated storage this value should be zero, but if MTP is
sharing storage with the rest of the system, set this to a positive value
to ensure that MTP activity does not result in the storage being
too close to full.

BUG: 3250924

Change-Id: I881c87240da268bad1ea1b99ad03673ab85ffdbf
Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 8d45a37f
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -104,10 +104,10 @@ MtpServer::MtpServer(int fd, MtpDatabase* database,
MtpServer::~MtpServer() {
}

void MtpServer::addStorage(const char* filePath) {
void MtpServer::addStorage(const char* filePath, uint64_t reserveSpace) {
    int index = mStorages.size() + 1;
    index |= index << 16;   // set high and low part to our index
    MtpStorage* storage = new MtpStorage(index, filePath, mDatabase);
    MtpStorage* storage = new MtpStorage(index, filePath, reserveSpace);
    addStorage(storage);
}

@@ -687,6 +687,10 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
    if (access(path, R_OK) == 0)
        return MTP_RESPONSE_GENERAL_ERROR;

    // check space first
    if (mSendObjectFileSize > storage->getFreeSpace())
        return MTP_RESPONSE_STORAGE_FULL;

    MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
            format, parent, storageID, mSendObjectFileSize, modifiedTime);
    if (handle == kInvalidObjectHandle) {
+1 −1
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ public:
                                    int fileGroup, int filePerm, int directoryPerm);
    virtual             ~MtpServer();

    void                addStorage(const char* filePath);
    void                addStorage(const char* filePath, uint64_t reserveSpace);
    inline void         addStorage(MtpStorage* storage) { mStorages.push(storage); }
    MtpStorage*         getStorage(MtpStorageID id);
    void                run();
+5 −4
Original line number Diff line number Diff line
@@ -32,11 +32,11 @@

namespace android {

MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, MtpDatabase* db)
MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, uint64_t reserveSpace)
    :   mStorageID(id),
        mFilePath(filePath),
        mDatabase(db),
        mMaxCapacity(0)
        mMaxCapacity(0),
        mReserveSpace(reserveSpace)
{
    LOGD("MtpStorage id: %d path: %s\n", id, filePath);
}
@@ -70,7 +70,8 @@ uint64_t MtpStorage::getFreeSpace() {
    struct statfs   stat;
    if (statfs(mFilePath, &stat))
        return -1;
    return (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
    uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
    return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0);
}

const char* MtpStorage::getDescription() const {
+4 −2
Original line number Diff line number Diff line
@@ -28,11 +28,13 @@ class MtpStorage {
private:
    MtpStorageID            mStorageID;
    const char*             mFilePath;
    MtpDatabase*            mDatabase;
    uint64_t                mMaxCapacity;
    // amount of free space to leave unallocated
    uint64_t                mReserveSpace;

public:
                            MtpStorage(MtpStorageID id, const char* filePath, MtpDatabase* db);
                            MtpStorage(MtpStorageID id, const char* filePath,
                                    uint64_t reserveSpace);
    virtual                 ~MtpStorage();

    inline MtpStorageID     getStorageID() const { return mStorageID; }