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 <eguan@linux.alibaba.com> Signed-off-by: Eric Ren <renzhen.rz@linux.alibaba.com>