@@ -2930,15 +2930,40 @@ 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" , ErrStoreIsReadOnly )
2965
+ }
2966
+ }
2942
2967
return nil , ErrLayerUnknown
2943
2968
}
2944
2969
@@ -2968,30 +2993,39 @@ func (s *store) Diff(from, to string, options *DiffOptions) (io.ReadCloser, erro
2968
2993
}
2969
2994
defer s .stopUsingGraphDriver ()
2970
2995
2971
- layerStores , err := s .allLayerStoresLocked ()
2996
+ rlstore , lstores , err := s .bothLayerStoreKindsLocked ()
2972
2997
if err != nil {
2973
2998
return nil , err
2974
2999
}
2975
3000
2976
- for _ , s := range layerStores {
3001
+ if err := rlstore .startWriting (); err != nil {
3002
+ return nil , err
3003
+ }
3004
+ if rlstore .Exists (to ) {
3005
+ rc , err := rlstore .Diff (from , to , options )
3006
+ if rc != nil && err == nil {
3007
+ wrapped := ioutils .NewReadCloserWrapper (rc , func () error {
3008
+ err := rc .Close ()
3009
+ rlstore .stopWriting ()
3010
+ return err
3011
+ })
3012
+ return wrapped , nil
3013
+ }
3014
+ rlstore .stopWriting ()
3015
+ return rc , err
3016
+ }
3017
+ rlstore .stopWriting ()
3018
+
3019
+ for _ , s := range lstores {
2977
3020
store := s
2978
3021
if err := store .startReading (); err != nil {
2979
3022
return nil , err
2980
3023
}
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
- }
3024
+ exists := store .Exists (to )
2994
3025
store .stopReading ()
3026
+ if exists {
3027
+ return nil , fmt .Errorf ("mounting read/only store images is not allowed: %w" , ErrStoreIsReadOnly )
3028
+ }
2995
3029
}
2996
3030
return nil , ErrLayerUnknown
2997
3031
}
0 commit comments