adds LO_FLAGS_AUTOCLEAR for loop device of zram backing device

Userdata spaces leak when zram writeback is enable and repeatedly kill
system_server(restart android).
The reason is that per_boot‘s inode is hold by loop device
although per_boot is deleted by user which become orphan inode in system.

Adds LO_FLAGS_AUTOCLEAR for loop device of zram backing device,
so loop device can release resouce.

Bug: 200904398

Change-Id: Ifeee9c0b58b10cdf7698077fbcaf54d5faccc3b1
Signed-off-by: Liangcai Fan <liangcai.fan@unisoc.com>
Signed-off-by: Hongyu Jin <hongyu.jin@unisoc.com>
Signed-off-by: Jing Xia <jing.xia@unisoc.com>
This commit is contained in:
Liangcai Fan 2021-09-06 17:56:18 +08:00
parent e0e160c54b
commit d884ba5916
3 changed files with 16 additions and 0 deletions

View file

@ -2119,6 +2119,9 @@ static bool PrepareZramBackingDevice(off64_t size) {
PERROR << "Cannot open " << loop_device;
return false;
}
if (!LoopControl::SetAutoClearStatus(loop_fd.get())) {
PERROR << "Failed set LO_FLAGS_AUTOCLEAR for " << loop_device;
}
if (!LoopControl::EnableDirectIo(loop_fd.get())) {
return false;
}

View file

@ -46,6 +46,9 @@ class LoopControl final {
// Enable Direct I/O on a loop device. This requires kernel 4.9+.
static bool EnableDirectIo(int fd);
// Set LO_FLAGS_AUTOCLEAR on a loop device.
static bool SetAutoClearStatus(int fd);
LoopControl(const LoopControl&) = delete;
LoopControl& operator=(const LoopControl&) = delete;
LoopControl& operator=(LoopControl&&) = default;

View file

@ -133,6 +133,16 @@ bool LoopControl::EnableDirectIo(int fd) {
return true;
}
bool LoopControl::SetAutoClearStatus(int fd) {
struct loop_info64 info = {};
info.lo_flags |= LO_FLAGS_AUTOCLEAR;
if (ioctl(fd, LOOP_SET_STATUS64, &info)) {
return false;
}
return true;
}
LoopDevice::LoopDevice(android::base::borrowed_fd fd, const std::chrono::milliseconds& timeout_ms,
bool auto_close)
: fd_(fd), owned_fd_(-1) {