1. 12 Aug, 2015 1 commit
    • Jeff Sharkey's avatar
      Request specific tags from blkid. · eddf9bd6
      Jeff Sharkey authored
      Otherwise blkid can emit tags like SEC_TYPE which mess with the value
      extraction code.
      
      Bug: 23069906
      Change-Id: Id2a588ff43a538747d1e44cd8218c96ebd0192c2
      eddf9bd6
  2. 01 Jul, 2015 1 commit
    • Jeff Sharkey's avatar
      Trim both internal and adopted private storage. · c86ab6f5
      Jeff Sharkey authored
      Refactor fstrim code to be encapsulated in unique task object, and
      give it option of benchmarking when finished.  Trimming now includes
      both storage from fstab and adopted private volumes.  Cleaner timing
      stats are logged for each unique volume.
      
      Add wakelock during ongoing async move tasks.  Push disk sysfs path
      to framework so it can parse any SD card registers as desired.
      
      Bug: 21831325
      Change-Id: I76577685f5cae4929c251ad314ffdaeb5eb1c8bf
      c86ab6f5
  3. 26 Jun, 2015 1 commit
    • Jeff Sharkey's avatar
      Let's reinvent storage, yet again! · 66270a21
      Jeff Sharkey authored
      Now that we're treating storage as a runtime permission, we need to
      grant read/write access without killing the app.  This is really
      tricky, since we had been using GIDs for access control, and they're
      set in stone once Zygote drops privileges.
      
      The only thing left that can change dynamically is the filesystem
      itself, so let's do that.  This means changing the FUSE daemon to
      present itself as three different views:
      
      /mnt/runtime_default/foo - view for apps with no access
      /mnt/runtime_read/foo - view for apps with read access
      /mnt/runtime_write/foo - view for apps with write access
      
      There is still a single location for all the backing files, and
      filesystem permissions are derived the same way for each view, but
      the file modes are masked off differently for each mountpoint.
      
      During Zygote fork, it wires up the appropriate storage access into
      an isolated mount namespace based on the current app permissions.  When
      the app is granted permissions dynamically at runtime, the sy...
      66270a21
  4. 22 Jun, 2015 1 commit
    • Jeff Sharkey's avatar
      Add method to forget private partition keys. · bc40cc8f
      Jeff Sharkey authored
      Report both the disk and the partition GUID for private volumes to
      userspace, and offer to forget the encryption key for a given
      partition GUID.
      
      Bug: 21782268
      Change-Id: Ie77a3a58e47bf3563cdb3e4b0edfab1de4d0e6b4
      bc40cc8f
  5. 09 Jun, 2015 1 commit
    • Jeff Sharkey's avatar
      Add f2fs support for private volumes. · d0640f63
      Jeff Sharkey authored
      When formatting volumes, pass along fsType string which can be "auto"
      to let the volume select the best choice.  For now, private volumes
      assume that MMC devices (like SD cards) are best off using f2fs when
      both kernel support and tools are present, otherwise fall back to
      ext4.  Use blkid when mounting to pick the right set of tools.
      
      Move filesystem utility methods into namespaces and place in separate
      directory to be more organized.
      
      Bug: 20275581
      Change-Id: Id5f82d8672dda2e9f68c35b075f28232b0b55ed4
      d0640f63
  6. 16 May, 2015 1 commit
  7. 29 Apr, 2015 1 commit
  8. 24 Apr, 2015 1 commit
    • Jeff Sharkey's avatar
      Migrate primary external storage. · 1d6fbcc3
      Jeff Sharkey authored
      When requested, kick off a thread that will migrate storage contents
      between two locations.  This is performed in several steps that
      also interact with the framework:
      
      1. Take old and new volumes offline during migration
      2. Wipe new location clean (10% of progress)
      3. Copy files from old to new (60% of progress)
      4. Inform framework that move was successful so it can persist
      5. Wipe old location clean (15% of progress)
      
      Derives a hacky progress estimate by using a rough proxy of free
      disk space changes while a cp/rm is taking place.
      
      Add new internal path for direct access to volumes to bypass any
      FUSE emulation overhead, and send it to framework.  Remove mutex
      around various exec calls since setexeccon() is already per-thread.
      
      Bug: 19993667
      Change-Id: Ibcb4f6fe0126d05b2365f316f53e71dc3e79a2b8
      1d6fbcc3
  9. 11 Apr, 2015 1 commit
    • Jeff Sharkey's avatar
      Exclusive exec() path, format after partition. · ce6a913a
      Jeff Sharkey authored
      Sadly setexeccon() is process global, so we need to carefully ensure
      that all exec() are mutually exclusive to avoid transitioning into
      unwanted domains.  Also, because we have several threads floating
      around, we need to guard all our FDs with O_CLOEXEC.
      
      Format all newly created volumes immediately after partitioning,
      but silence all events emitted from those volumes to prevent the
      framework from getting all excited.  Unify all notify events under a
      single codepath to make them easy to silence.
      
      Sent SIGINT before escalating to SIGTERM when unmounting.
      
      Bug: 19993667
      Change-Id: Idc6c806afc7919a004a93e2240b42884f6b52d6b
      ce6a913a
  10. 07 Apr, 2015 1 commit
    • Jeff Sharkey's avatar
      Updates for expanded storage. · f0121c57
      Jeff Sharkey authored
      Mount private volumes at /mnt/expand, which is where we have new
      SELinux policy waiting for us.  Also ensure that foundational
      directories are ready when mounting.
      
      Create local fs_prepare_dir() wrapper that sets SELinux context
      based on path, avoiding the need for a later restorecon.
      
      Use UUID as directory name for public volumes.  Wait a few seconds
      before issuing first signal when force unmounting.
      
      Bug: 19993667
      Change-Id: If22595380faaae321705b06c87d877419620da48
      f0121c57
  11. 01 Apr, 2015 2 commits
    • Jeff Sharkey's avatar
      Different blkid and fsck execution domains. · 95c87cce
      Jeff Sharkey authored
      vold works with two broad classes of block devices: untrusted devices
      that come in from the wild, and trusted devices like PrivateVolume
      which are encrypted.
      
      When running blkid and fsck, we pick which SELinux execution domain
      to use based on which class the device belongs to.
      
      Bug: 19993667
      Change-Id: I2695f028710a4863f0c3b2ed6da437f466401272
      95c87cce
    • Jeff Sharkey's avatar
      Support for private (adopted) volumes. · 9c48498f
      Jeff Sharkey authored
      This adds support for private volumes which is just a filesystem
      wrapped in a dm-crypt layer.  For now we're using the exact same
      configuration as internal encryption (aes-cbc-essiv:sha256), but we
      don't store any key material on the removable media.  Instead, we
      store the key on internal storage, and use the GPT partition GUID
      to identify which key should be used.
      
      This means that private external storage is effectively as secure as
      the internal storage of the device.  That is, if the internal storage
      is encrypted, then our external storage key is also encrypted.
      
      When partitioning disks, we now support a "private" mode which has
      a PrivateVolume partition, and a currently unused 16MB metadata
      partition reserved for future use.  It also supports a "mixed" mode
      which creates both a PublicVolume and PrivateVolume on the same
      disk.  Mixed mode is currently experimental.
      
      For now, just add ext4 support to PrivateVolume; we'll look at f2fs
      in a future change.  Add VolumeBase lifecycle for setting up crypto
      mappings, and extract blkid logic into shared method.  Sprinkle some
      more "static" around the cryptfs code to improve invariants.
      
      Bug: 19993667
      Change-Id: Ibd1df6250735b706959a1eb9d9f7219ea85912a0
      9c48498f
  12. 31 Mar, 2015 1 commit
    • Jeff Sharkey's avatar
      Progress towards dynamic storage support. · 36801ccc
      Jeff Sharkey authored
      Wire up new Disk and VolumeBase objects and events to start replacing
      older DirectVolume code.  Use filesystem UUID as visible PublicVolume
      name to be more deterministic.
      
      When starting, create DiskSource instances based on fstab, and watch
      for kernel devices to appear.  Turn matching devices into Disk
      objects, scan for partitions, and create any relevant VolumeBase
      objects.  Broadcast all of these events towards userspace so the
      framework can decide what to mount.
      
      Keep track of the primary VolumeBase, and update the new per-user
      /storage/self/primary symlink for all started users.
      
      Provide a reset command that framework uses to start from a known
      state when runtime is restarted.  When vold is unexpectedly killed,
      try recovering by unmounting everything under /mnt and /storage
      before moving forward.
      
      Remove UMS sharing support for now, since no current devices support
      it; MTP is the recommended solution going forward because it offers
      better multi-user support.
      
      Switch killProcessesWithOpenFiles() to directly take signal.  Fix
      one SOCK_CLOEXEC bug, but SELinux says there are more lurking.
      
      Bug: 19993667
      Change-Id: I2dad1303aa4667ec14c52f774e2a28b3c1c1ff6d
      36801ccc
  13. 16 Mar, 2015 1 commit
  14. 13 Mar, 2015 1 commit
    • Jeff Sharkey's avatar
      Checkpoint of better dynamic device support. · deb24057
      Jeff Sharkey authored
      This is the first in a series of changes that are designed to
      introduce better support for dynamic block devices.
      
      It starts by defining a new Volume object which represents a storage
      endpoint that knows how to mount, unmount, and format itself.  This
      could be a filesystem directly on a partition, or it could be an
      emulated FUSE filesystem, an ASEC, or an OBB.
      
      These new volumes can be "stacked" so that unmounting a volume will
      also unmount any volumes stacked above it.  Volumes that provide
      shared storage can also be asked to present themselves (through bind
      mounts) into user-specific mount areas.
      
      This change also adds a Disk class which is created based on block
      kernel netlink events.  Instead of waiting for partition events from
      the kernel, it uses gptfdisk to read partition details and creates
      the relevant Volume objects.
      
      Change-Id: I0e8bc1f8f9dcb24405f5e795c0658998e22ae2f7
      deb24057