snapshots/devmapper: do not stop snapshot GC when one snapshot removing fails
snapshots/devmapper: do not stop snapshot GC when one snapshot removing fails

Snapshots GC takes use of pruneBranch() function to remove snapshots,
but GC will stop if snapshotter.Remove() returns error and the error
number is not ErrFailedPrecondition. This results in thousands of
dm snapshots not deleted if one snapshot is not deleted, due to
errors like "contains a filesystem in use".

So return ErrFailedPrecondition error number in Remove() function where
appropriate, and let GC process go on collecting other snapshots.

Fix: #3923
Signed-off-by: Eryu Guan <269587f4234b28aff6655a07e628f4841352f404@linux.alibaba.com>
Signed-off-by: Eric Ren <02873835a239bc7cf69114715549edada89d1f2f@linux.alibaba.com>

mikebrow/containerd,vdemeester/containerd,mikebrow/containerd,crosbymichael/containerd,thaJeztah/containerd,containerd/containerd,dmcgowan/containerd,vdemeester/containerd,estesp/containerd,estesp/containerd,containerd/containerd,dmcgowan/containerd,thaJeztah/containerd,crosbymichael/containerd