Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix 'zfs rollback' on mounted file systems #1214

Closed
wants to merge 1 commit into from

Commits on Jan 17, 2013

  1. Fix 'zfs rollback' on mounted file systems

    Rolling back a mounted filesystem with open file handles and
    cached dentries+inodes never worked properly in ZoL.  The
    major issue was that Linux provides no easy mechanism for
    modules to invalidate the inode cache for a file system.
    
    Because of this it was possible that an inode from the previous
    filesystem would not get properly dropped from the cache during
    rolling back.  Then a new inode with the same inode number would
    be create and collide with the existing cached inode.  Ideally
    this would trigger an VERIFY() but in practice the error wasn't
    handled and it would just NULL reference.
    
    Luckily, this issue can be resolved by sprucing up the existing
    Solaris zfs_rezget() functionality for the Linux VFS.
    
    The way it works now is that when a file system is rolled back
    all the cached inodes will be traversed and refetched from disk.
    If a version of the cached inode exists on disk the in-core
    copy will be updated accordingly.  If there is no match for that
    object on disk it will be unhashed from the inode cache and
    marked as stale.
    
    This will effectively make the inode unfindable for lookups
    allowing the inode number to be immediately recycled.  The inode
    will then only be accessible from the cached dentries.  Subsequent
    dentry lookups which reference a stale inode will result in the
    dentry being invalidated.  Once invalidated the dentry will drop
    its reference on the inode allowing it to be safely pruned from
    the cache.
    
    Special care is taken for negative dentries since they do not
    reference any inode.  These dentires will be invalidate based
    on when they were added to the dentry cache.  Entries added
    before the last rollback will be invalidate to prevent them
    from masking real files in the dataset.
    
    Two nice side effects of this fix are:
    
    * Removes the dependency on spl_invalidate_inodes(), it can now
      be safely removed from the SPL when we choose to do so.
    
    * zfs_znode_alloc() no longer requires a dentry to be passed.
      This effectively reverts this portition of the code to its
      upstream counterpart.  The dentry is not instantiated more
      correctly in the Linux ZPL layer.
    
    Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
    Issue openzfs#795
    behlendorf committed Jan 17, 2013
    Configuration menu
    Copy the full SHA
    7a71ff5 View commit details
    Browse the repository at this point in the history