Skip to contentSkip to conversation

snapshot/subvol deletion

DISCUSSION Yan, Zheng 4 participants 8 messages Aug 25, 2009 – Aug 27, 2009 Btrfs file system

lore
Share & tools
lore

Yan, Zheng

author
#0 lore raw

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Regards
Yan, Zheng

#1 lore raw
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

So, we should be able to delete the snapshot without the unmount step. It may create an invalid reference but the code to follow snapshot directory items will have to be changed to deal with that.

If we later on allow root ids to be reused, the directory item pointing to a subvol will again be like a symbolic link. You'll end up in the new subvol instead of the old.

-chris

#2 lore raw
Quoted 21 lines · Chris Mason
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

Quoted 8 lines

So, we should be able to delete the snapshot without the unmount step. It may create an invalid reference but the code to follow snapshot directory items will have to be changed to deal with that.

If we later on allow root ids to be reused, the directory item pointing to a subvol will again be like a symbolic link. You'll end up in the new subvol instead of the old.

So the problem is the directory entry for the snapshot? What if we just went ahead and added an orphan item for the inode, remove the dir index and dir item's so that it doesn't show up on ls and such, and then the next time we mount the orphan entry gets cleaned up. That way we can skip the fsck altogether. Or am I missing something as per usual?

Josef

#3 lore raw
Quoted 31 lines · Josef Bacik
Quoted 21 lines · Chris Mason
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

Quoted 8 lines

So, we should be able to delete the snapshot without the unmount step. It may create an invalid reference but the code to follow snapshot directory items will have to be changed to deal with that.

If we later on allow root ids to be reused, the directory item pointing to a subvol will again be like a symbolic link. You'll end up in the new subvol instead of the old.

Quoted 5 lines

So the problem is the directory entry for the snapshot? What if we just went ahead and added an orphan item for the inode, remove the dir index and dir item's so that it doesn't show up on ls and such, and then the next time we mount the orphan entry gets cleaned up. That way we can skip the fsck altogether. Or am I missing something as per usual?

;) The problem is the directory entry for the snapshot, but its a little more complex. Lets say subvolA has a directory entry for snapshotZ, and then someone wanders in and snapshots subvolA, creating snapshotA'.

This means that both subvolA and snashotA' have a directory entry for snapshotZ. If we delete snapshotZ we have to deal with both directory entries.

We can solve this by expanding the backref code for subvol roots, but then taking a new snapshot becomes O(number of snapshots in the original) for updating backrefs.

Or we could give in and admit that snapshot references in the filesystem are symbolic links. Both methods have disadvantages ;)

-chris

#4 lore raw
Quoted 8 lines · Chris Mason

;) The problem is the directory entry for the snapshot, but its a little more complex. Lets say subvolA has a directory entry for snapshotZ, and then someone wanders in and snapshots subvolA, creating snapshotA'.

This means that both subvolA and snashotA' have a directory entry for snapshotZ. If we delete snapshotZ we have to deal with both directory entries.

I would've expected that, if we delete snapshotZ by IOCTL / rmdir / whatever from within snapshotA', then it still exists until it's also deleted from (the original) subvolA. But maybe I just don't get it.

Is there some end-user-oriented documentation on what the semantics of snapshots and subvolumes are supposed to be? I couldn't find it with a bit of Googling and wiki reading.

--Andy

author
#5 lore raw
In reply to Chris Mason
Quoted 13 lines · Chris Mason
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Quoted 8 lines

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

I don't think so. For each links to a subvolume, there is a separate dentry. For all symbolic links to a directory, there is only one dentry. So the semantics are different, at least from VFS' point of view.

Quoted 8 lines

So, we should be able to delete the snapshot without the unmount step. It may create an invalid reference but the code to follow snapshot directory items will have to be changed to deal with that.

If we later on allow root ids to be reused, the directory item pointing to a subvol will again be like a symbolic link. You'll end up in the new subvol instead of the old.

The extent back reference does not allow reusing objectid of deleted root.

Yan, Zheng

#6 lore raw
Quoted 18 lines · Zheng
Quoted 17 lines · Chris Mason
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

Quoted 8 lines
Quoted 4 lines

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

I don't think so. For each links to a subvolume, there is a separate dentry. For all symbolic links to a directory, there is only one dentry. So the semantics are different, at least from VFS' point of view.

Yes, in terms of how things are implemented in the VFS, it is different. In terms of the behavior seen by users its a symbolic link. We could actually implement them as symlinks, but I didn't like the idea of having to follow links as part of cp -a.

Quoted 5 lines
Quoted 5 lines

So, we should be able to delete the snapshot without the unmount step. It may create an invalid reference but the code to follow snapshot directory items will have to be changed to deal with that.

Quoted 7 lines
Quoted 4 lines

If we later on allow root ids to be reused, the directory item pointing to a subvol will again be like a symbolic link. You'll end up in the new subvol instead of the old.

The extent back reference does not allow reusing objectid of deleted root.

Right, at least not until all tree blocks that have that obectid as a reference are gone.

-chris

author
#7 lore raw
Quoted 24 lines · Chris Mason
Quoted 23 lines · Zheng
Quoted 21 lines · Chris Mason
Quoted 11 lines · Zheng

Hi,

I will send a series patches that add snapshot/subvol deletion soon. But the way to delete snapshot/subvol is far from people's expectancy. To delete a snapshot/subvol, we need four steps: 1) snapshot/subvol deletion ioctl or rmdir; 2) umount; 3) btrfsck; 4) mount the fs.

The reason for this is bug in root back & forward references. In simple terms, the bug prevents us from knowing how many places a snapshot/subvol is referenced. So it's unsafe delete corresponding fs tree immediately after a link to snapshot/subvol is removed.

Thanks for working on this, its a major feature. The problem with the forward/backward reference counting is that our links to a subvolume or snapshot are really more like symbolic links than active references.

If a directory entry points to a subvolume and someone uses rm -rf to delete the files inside that subvolume or snapshot, you get the same kind of semantics as deleting the subvolume with the ioctl.

Quoted 9 lines
Quoted 3 lines

I don't think so. For each links to a subvolume, there is a separate dentry. For all symbolic links to a directory, there is only one dentry. So the semantics are different, at least from VFS' point of view.

Yes, in terms of how things are implemented in the VFS, it is different. In terms of the behavior seen by users its a symbolic link. We could actually implement them as symlinks, but I didn't like the idea of having to follow links as part of cp -a.

I thought about it again. I think we can use vfsmount to simulate symbolic's behavior.

Yan, Zheng