@@ -2930,15 +2930,41 @@ func (s *store) Unmount(id string, force bool) (bool, error) {
2930
2930
}
2931
2931
2932
2932
func (s * store ) Changes (from , to string ) ([]archive.Change , error ) {
2933
- if res , done , err := readAllLayerStores (s , func (store roLayerStore ) ([]archive.Change , bool , error ) {
2934
- if store .Exists (to ) {
2935
- res , err := store .Changes (from , to )
2936
- return res , true , err
2937
- }
2938
- return nil , false , nil
2939
- }); done {
2933
+ // NaiveDiff could cause mounts to happen without a lock, so be safe
2934
+ // and treat the .Diff operation as a Mount.
2935
+ // We need to make sure the home mount is present when the Mount is done, which happens by possibly reinitializing the graph driver
2936
+ // in startUsingGraphDriver().
2937
+ if err := s .startUsingGraphDriver (); err != nil {
2938
+ return nil , err
2939
+ }
2940
+ defer s .stopUsingGraphDriver ()
2941
+
2942
+ rlstore , lstores , err := s .bothLayerStoreKindsLocked ()
2943
+ if err != nil {
2944
+ return nil , err
2945
+ }
2946
+ if err := rlstore .startWriting (); err != nil {
2947
+ return nil , err
2948
+ }
2949
+ if rlstore .Exists (to ) {
2950
+ res , err := rlstore .Changes (from , to )
2951
+ rlstore .stopWriting ()
2940
2952
return res , err
2941
2953
}
2954
+ rlstore .stopWriting ()
2955
+
2956
+ for _ , s := range lstores {
2957
+ store := s
2958
+ if err := store .startReading (); err != nil {
2959
+ return nil , err
2960
+ }
2961
+ exists := store .Exists (to )
2962
+ store .stopReading ()
2963
+ if exists {
2964
+ return nil , fmt .Errorf ("mounting read/only store images is not allowed: %w" , ErrLayerUnknown )
2965
+
2966
+ }
2967
+ }
2942
2968
return nil , ErrLayerUnknown
2943
2969
}
2944
2970
@@ -2968,30 +2994,40 @@ func (s *store) Diff(from, to string, options *DiffOptions) (io.ReadCloser, erro
2968
2994
}
2969
2995
defer s .stopUsingGraphDriver ()
2970
2996
2971
- layerStores , err := s .allLayerStoresLocked ()
2997
+ rlstore , lstores , err := s .bothLayerStoreKindsLocked ()
2972
2998
if err != nil {
2973
2999
return nil , err
2974
3000
}
2975
3001
2976
- for _ , s := range layerStores {
3002
+ if err := rlstore .startWriting (); err != nil {
3003
+ return nil , err
3004
+ }
3005
+ if rlstore .Exists (to ) {
3006
+ rc , err := rlstore .Diff (from , to , options )
3007
+ if rc != nil && err == nil {
3008
+ wrapped := ioutils .NewReadCloserWrapper (rc , func () error {
3009
+ err := rc .Close ()
3010
+ rlstore .stopWriting ()
3011
+ return err
3012
+ })
3013
+ return wrapped , nil
3014
+ }
3015
+ rlstore .stopWriting ()
3016
+ return rc , err
3017
+ }
3018
+ rlstore .stopWriting ()
3019
+
3020
+ for _ , s := range lstores {
2977
3021
store := s
2978
3022
if err := store .startReading (); err != nil {
2979
3023
return nil , err
2980
3024
}
2981
- if store .Exists (to ) {
2982
- rc , err := store .Diff (from , to , options )
2983
- if rc != nil && err == nil {
2984
- wrapped := ioutils .NewReadCloserWrapper (rc , func () error {
2985
- err := rc .Close ()
2986
- store .stopReading ()
2987
- return err
2988
- })
2989
- return wrapped , nil
2990
- }
2991
- store .stopReading ()
2992
- return rc , err
2993
- }
3025
+ exists := store .Exists (to )
2994
3026
store .stopReading ()
3027
+ if exists {
3028
+ return nil , fmt .Errorf ("mounting read/only store images is not allowed: %w" , ErrLayerUnknown )
3029
+
3030
+ }
2995
3031
}
2996
3032
return nil , ErrLayerUnknown
2997
3033
}
0 commit comments