void *rdev_mmap(const struct region_device *rd, size_t offset, size_t size) { const struct region_device *rdev; struct region req = { .offset = offset, .size = size, }; if (!normalize_and_ok(&rd->region, &req)) return NULL; rdev = rdev_root(rd); return rdev->ops->mmap(rdev, req.offset, req.size); }
ssize_t rdev_readat(const struct region_device *rd, void *b, size_t offset, size_t size) { const struct region_device *rdev; struct region req = { .offset = offset, .size = size, }; if (!normalize_and_ok(&rd->region, &req)) return -1; rdev = rdev_root(rd); return rdev->ops->readat(rdev, b, req.offset, req.size); }
int rdev_chain(struct region_device *child, const struct region_device *parent, size_t offset, size_t size) { struct region req = { .offset = offset, .size = size, }; if (!normalize_and_ok(&parent->region, &req)) return -1; /* Keep track of root region device. Note the offsets are relative * to the root device. */ child->root = rdev_root(parent); child->ops = NULL; child->region.offset = req.offset; child->region.size = req.size; return 0; }
ssize_t rdev_eraseat(const struct region_device *rd, size_t offset, size_t size) { const struct region_device *rdev; struct region req = { .offset = offset, .size = size, }; if (!normalize_and_ok(&rd->region, &req)) return -1; rdev = rdev_root(rd); /* If the eraseat ptr is NULL we assume that the erase * function was completed successfully. */ if (rdev->ops->eraseat == NULL) return size; return rdev->ops->eraseat(rdev, req.offset, req.size); }