@@ -24,7 +24,6 @@ import (
24
24
"fmt"
25
25
"net/http"
26
26
"os"
27
- "syscall"
28
27
"time"
29
28
30
29
"github.com/google/uuid"
@@ -52,6 +51,7 @@ const (
52
51
53
52
var (
54
53
errInvalidConversionHealthzURL = errors .New ("the `--conversion-webhook-healthz-url` flag is unset/empty" )
54
+ errMountFailure = errors .New ("could not mount the drive" )
55
55
)
56
56
57
57
func waitForConversionWebhook () error {
@@ -101,31 +101,32 @@ func waitForConversionWebhook() error {
101
101
return nil
102
102
}
103
103
104
- func checkXFS (ctx context.Context ) ( bool , error ) {
104
+ func checkXFS (ctx context.Context , reflinkSupport bool ) error {
105
105
mountPoint , err := os .MkdirTemp ("" , "xfs.check.mnt." )
106
106
if err != nil {
107
- return false , err
107
+ return err
108
108
}
109
109
defer os .Remove (mountPoint )
110
110
111
111
file , err := os .CreateTemp ("" , "xfs.check.file." )
112
112
if err != nil {
113
- return false , err
113
+ return err
114
114
}
115
115
defer os .Remove (file .Name ())
116
116
file .Close ()
117
117
118
118
if err = os .Truncate (file .Name (), sys .MinSupportedDeviceSize ); err != nil {
119
- return false , err
119
+ return err
120
120
}
121
121
122
- if err = xfs .MakeFS (ctx , file .Name (), uuid .New ().String (), false , true ); err != nil {
123
- return false , err
122
+ if err = xfs .MakeFS (ctx , file .Name (), uuid .New ().String (), false , reflinkSupport ); err != nil {
123
+ klog .V (3 ).ErrorS (err , "failed to format" , "reflink" , reflinkSupport )
124
+ return err
124
125
}
125
126
126
127
loopDevice , err := losetup .Attach (file .Name (), 0 , false )
127
128
if err != nil {
128
- return false , err
129
+ return err
129
130
}
130
131
131
132
defer func () {
@@ -135,13 +136,11 @@ func checkXFS(ctx context.Context) (bool, error) {
135
136
}()
136
137
137
138
if err = mount .Mount (loopDevice .Path (), mountPoint , "xfs" , nil , "" ); err != nil {
138
- if errors .Is (err , syscall .EINVAL ) {
139
- err = nil
140
- }
141
- return false , err
139
+ klog .V (3 ).ErrorS (err , "failed to mount" , "reflink" , reflinkSupport )
140
+ return errMountFailure
142
141
}
143
142
144
- return true , mount .Unmount (mountPoint , true , true , false )
143
+ return mount .Unmount (mountPoint , true , true , false )
145
144
}
146
145
147
146
func run (ctx context.Context , args []string ) error {
@@ -169,9 +168,22 @@ func run(ctx context.Context, args []string) error {
169
168
170
169
var nodeSrv csi.NodeServer
171
170
if driver {
172
- reflinkSupport , err := checkXFS (ctx )
173
- if err != nil {
174
- return err
171
+
172
+ var reflinkSupport bool
173
+ // try with reflink enabled
174
+ if err := checkXFS (ctx , true ); err == nil {
175
+ reflinkSupport = true
176
+ klog .V (3 ).Infof ("enabled reflink while formatting" )
177
+ } else {
178
+ if ! errors .Is (err , errMountFailure ) {
179
+ return err
180
+ }
181
+ // try with reflink disabled
182
+ if err := checkXFS (ctx , false ); err != nil {
183
+ return err
184
+ }
185
+ reflinkSupport = false
186
+ klog .V (3 ).Infof ("disabled reflink while formatting" )
175
187
}
176
188
177
189
if ! dynamicDriveDiscovery {
0 commit comments