• Sage Weil's avatar
    Btrfs: transaction ioctls · 6bf13c0c
    Sage Weil authored
    These ioctls let a user application hold a transaction open while it
    performs a series of operations.  A final ioctl does a sync on the fs
    (closing the current transaction).  This is the main requirement for
    Ceph's OSD to be able to keep the data it's storing in a btrfs volume
    consistent, and AFAICS it works just fine.  The application would do
    something like
    
    	fd = ::open("some/file", O_RDONLY);
    	::ioctl(fd, BTRFS_IOC_TRANS_START);
    	/* do a bunch of stuff */
    	::ioctl(fd, BTRFS_IOC_TRANS_END);
    or just
    	::close(fd);
    
    And to ensure it commits to disk,
    
    	::ioctl(fd, BTRFS_IOC_SYNC);
    
    When a transaction is held open, the trans_handle is attached to the
    struct file (via private_data) so that it will get cleaned up if the
    process dies unexpectedly.  A held transaction is also ended on fsync() to
    avoid a deadlock.
    
    A misbehaving application could also deliberately hold a transaction open,
    effectively locking up the FS, so it may make sense to restrict something
    like this to root or something.
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    6bf13c0c
file.c 27.9 KB