[CRIU] [PATCH 5/5] sk-unix: Don't fail if socket path lays on btrfs volume

Cyrill Gorcunov gorcunov at gmail.com
Fri Nov 29 03:15:39 PST 2013


On Fri, Nov 29, 2013 at 02:49:11PM +0400, Pavel Emelyanov wrote:
> 
> > 			if ((st.st_ino != uv->udiag_vfs_ino) ||
> > -			    (st.st_dev != kdev_to_odev(uv->udiag_vfs_dev))) {
> > +			    ((st.st_dev != kdev_to_odev(uv->udiag_vfs_dev) &&
> > +			      !btrfs_dev_match(name, st.st_dev)))) {
> 
> Why do we do name matching? Let's imagine we have a btrfs on disk with 2 subvols
> and have a unix socket on either of them.
> 
> Let the disk's device be D, subvol 1 id be V1, subvol 2 id be V2.
> In this if (), let the st.st_ino is S and uv->udiag_vfs_dev is U.
> 
> If the socket is on the btrfs disk, then we'll have S != U, U == D and 
> (S == V1 || S == V2), right? In order to fix the devices comparison we need
> a btrfs_vol_to_dev() function that will convert V1 -> D, V2 -> D and any other
> number to 0. This is valid, since D, V1 and V2 cannot match any other dev_t 
> in the system.
> 
> Thus the proper if should look like this
> 
> if (S != U) {
> 	int btrfs_dev;
> 
> 	/* S == V1 || S == V2 */
> 	btrfs_dev = btrfs_vol_to_dev(S);
> 	/* now btrfs_dev is D for btrfs and 0 otherwise */
> 	if (btrfs_dev != U)
> 		goto mismatch;
> }

Actually no, inode returned by diag module should match the one
obtained from stat call, since it's not mangled by btrfs if only
I'm not missing something obvious.

So the only thing which may differ is a device number itself.
Gimme somethime, I've had a scenario in my head to claim why
longest path matching is needed but can't recall now...


More information about the CRIU mailing list