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

Commit b7597d64 authored by Arve Hjønnevåg's avatar Arve Hjønnevåg Committed by Automerger Merge Worker
Browse files

Merge "storageproxyd: Added support for getting max size of file" am:...

Merge "storageproxyd: Added support for getting max size of file" am: 67bd5b01 am: 9dafddd4 am: dd3bd8da

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2305672



Change-Id: I7fa380e647df4c7824794d6d1a859b12925c8825
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents e6125622 dd3bd8da
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -136,6 +136,10 @@ static int handle_req(struct storage_msg* msg, const void* req, size_t req_len)
            rc = storage_file_set_size(msg, req, req_len);
            break;

        case STORAGE_FILE_GET_MAX_SIZE:
            rc = storage_file_get_max_size(msg, req, req_len);
            break;

        case STORAGE_RPMB_SEND:
            rc = rpmb_send(msg, req, req_len);
            break;
+43 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <fcntl.h>
#include <inttypes.h>
#include <libgen.h>
#include <linux/fs.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -36,6 +37,9 @@

#define ALTERNATE_DATA_DIR "alternate/"

/* Maximum file size for filesystem backed storage (i.e. not block dev backed storage) */
#define MAX_FILE_SIZE (0x10000000000)

enum sync_state {
    SS_UNUSED = -1,
    SS_CLEAN =  0,
@@ -549,6 +553,45 @@ err_response:
    return ipc_respond(msg, NULL, 0);
}

int storage_file_get_max_size(struct storage_msg* msg, const void* r, size_t req_len) {
    const struct storage_file_get_max_size_req* req = r;
    struct storage_file_get_max_size_resp resp = {0};
    uint64_t max_size = 0;

    if (req_len != sizeof(*req)) {
        ALOGE("%s: invalid request length (%zd != %zd)\n", __func__, req_len, sizeof(*req));
        msg->result = STORAGE_ERR_NOT_VALID;
        goto err_response;
    }

    struct stat stat;
    int fd = lookup_fd(req->handle, false);
    int rc = fstat(fd, &stat);
    if (rc < 0) {
        ALOGE("%s: error stat'ing file (fd=%d): %s\n", __func__, fd, strerror(errno));
        goto err_response;
    }

    if ((stat.st_mode & S_IFMT) == S_IFBLK) {
        rc = ioctl(fd, BLKGETSIZE64, &max_size);
        if (rc < 0) {
            rc = errno;
            ALOGE("%s: error calling ioctl on file (fd=%d): %s\n", __func__, fd, strerror(errno));
            msg->result = translate_errno(rc);
            goto err_response;
        }
    } else {
        max_size = MAX_FILE_SIZE;
    }

    resp.max_size = max_size;
    msg->result = STORAGE_NO_ERROR;
    return ipc_respond(msg, &resp, sizeof(resp));

err_response:
    return ipc_respond(msg, NULL, 0);
}

int storage_init(const char *dirname)
{
    /* If there is an active DSU image, use the alternate fs mode. */
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ int storage_file_get_size(struct storage_msg *msg,
int storage_file_set_size(struct storage_msg *msg,
                          const void *req, size_t req_len);

int storage_file_get_max_size(struct storage_msg* msg, const void* req, size_t req_len);

int storage_init(const char *dirname);

int storage_sync_checkpoint(void);