int VolumeManager::unshareVolume(const char *label, const char *method) { Volume *v = lookupVolume(label); if (!v) { errno = ENOENT; return -1; } if (strcmp(method, "ums")) { errno = ENOSYS; return -1; } if (v->getState() != Volume::State_Shared) { errno = EINVAL; return -1; } int fd; int lun_number; // /mnt/sdcard to lun0 and anything else to lun1. Fix this. if (v->isPrimaryStorage()) { lun_number = 0; } else { lun_number = SECOND_LUN_NUM; } if ((fd = openLun(lun_number)) < 0) { return -1; } char ch = 0; if (write(fd, &ch, 1) < 0) { SLOGE("Unable to write to ums lunfile (%s)", strerror(errno)); close(fd); return -1; } close(fd); v->handleVolumeUnshared(); if (--mUmsSharingCount == 0 && mSavedDirtyRatio != -1) { FILE* fp; if ((fp = fopen("/proc/sys/vm/dirty_ratio", "r+"))) { fprintf(fp, "%d\n", mSavedDirtyRatio); fclose(fp); } else { SLOGE("Failed to open /proc/sys/vm/dirty_ratio (%s)", strerror(errno)); } mSavedDirtyRatio = -1; } return 0; }
int VolumeManager::shareVolume(const char *label, const char *method) { Volume *v = lookupVolume(label); if (!v) { errno = ENOENT; return -1; } /* * Eventually, we'll want to support additional share back-ends, * some of which may work while the media is mounted. For now, * we just support UMS */ if (strcmp(method, "ums")) { errno = ENOSYS; return -1; } if (v->getState() == Volume::State_NoMedia) { errno = ENODEV; return -1; } if (v->getState() != Volume::State_Idle) { // You need to unmount manually befoe sharing errno = EBUSY; return -1; } if (mVolManagerDisabled) { errno = EBUSY; return -1; } dev_t d = v->getShareDevice(); if ((MAJOR(d) == 0) && (MINOR(d) == 0)) { // This volume does not support raw disk access errno = EINVAL; return -1; } #ifdef VOLD_EMMC_SHARES_DEV_MAJOR // If emmc and sdcard share dev major number, vold may pick // incorrectly based on partition nodes alone. Use device nodes instead. v->getDeviceNodes((dev_t *) &d, 1); if ((MAJOR(d) == 0) && (MINOR(d) == 0)) { // This volume does not support raw disk access errno = EINVAL; return -1; } #endif int fd; char nodepath[255]; int written = snprintf(nodepath, sizeof(nodepath), "/dev/block/vold/%d:%d", MAJOR(d), MINOR(d)); if ((written < 0) || (size_t(written) >= sizeof(nodepath))) { SLOGE("shareVolume failed: couldn't construct nodepath"); return -1; } if ((fd = openLun(v->getLunNumber())) < 0) { return -1; } if (write(fd, nodepath, strlen(nodepath)) < 0) { SLOGE("Unable to write to ums lunfile (%s)", strerror(errno)); close(fd); return -1; } close(fd); v->handleVolumeShared(); if (mUmsSharingCount++ == 0) { FILE* fp; mSavedDirtyRatio = -1; // in case we fail if ((fp = fopen("/proc/sys/vm/dirty_ratio", "r+"))) { char line[16]; if (fgets(line, sizeof(line), fp) && sscanf(line, "%d", &mSavedDirtyRatio)) { fprintf(fp, "%d\n", mUmsDirtyRatio); } else { SLOGE("Failed to read dirty_ratio (%s)", strerror(errno)); } fclose(fp); } else { SLOGE("Failed to open /proc/sys/vm/dirty_ratio (%s)", strerror(errno)); } } return 0; }