@@ -97,38 +97,41 @@ static uint_t zfs_vdev_open_timeout_ms = 1000;
97
97
98
98
static unsigned int zfs_vdev_failfast_mask = 1 ;
99
99
100
+ /*
101
+ * Convert SPA mode flags into bdev open mode flags.
102
+ */
100
103
#ifdef HAVE_BLK_MODE_T
101
- static blk_mode_t
104
+ typedef blk_mode_t vdev_bdev_mode_t ;
105
+ #define VDEV_BDEV_MODE_READ BLK_OPEN_READ
106
+ #define VDEV_BDEV_MODE_WRITE BLK_OPEN_WRITE
107
+ #define VDEV_BDEV_MODE_EXCL BLK_OPEN_EXCL
108
+ #define VDEV_BDEV_MODE_MASK (BLK_OPEN_READ|BLK_OPEN_WRITE|BLK_OPEN_EXCL)
102
109
#else
103
- static fmode_t
110
+ typedef fmode_t vdev_bdev_mode_t ;
111
+ #define VDEV_BDEV_MODE_READ FMODE_READ
112
+ #define VDEV_BDEV_MODE_WRITE FMODE_WRITE
113
+ #define VDEV_BDEV_MODE_EXCL FMODE_EXCL
114
+ #define VDEV_BDEV_MODE_MASK (FMODE_READ|FMODE_WRITE|FMODE_EXCL)
104
115
#endif
105
- vdev_bdev_mode (spa_mode_t spa_mode , boolean_t exclusive )
106
- {
107
- #ifdef HAVE_BLK_MODE_T
108
- blk_mode_t mode = 0 ;
109
-
110
- if (spa_mode & SPA_MODE_READ )
111
- mode |= BLK_OPEN_READ ;
112
116
113
- if (spa_mode & SPA_MODE_WRITE )
114
- mode |= BLK_OPEN_WRITE ;
117
+ static vdev_bdev_mode_t
118
+ vdev_bdev_mode (spa_mode_t smode )
119
+ {
120
+ ASSERT3U (smode , != , SPA_MODE_UNINIT );
121
+ ASSERT0 (smode & ~(SPA_MODE_READ |SPA_MODE_WRITE ));
115
122
116
- if (exclusive )
117
- mode |= BLK_OPEN_EXCL ;
118
- #else
119
- fmode_t mode = 0 ;
123
+ vdev_bdev_mode_t bmode = VDEV_BDEV_MODE_EXCL ;
120
124
121
- if (spa_mode & SPA_MODE_READ )
122
- mode |= FMODE_READ ;
125
+ if (smode & SPA_MODE_READ )
126
+ bmode |= VDEV_BDEV_MODE_READ ;
123
127
124
- if (spa_mode & SPA_MODE_WRITE )
125
- mode |= FMODE_WRITE ;
128
+ if (smode & SPA_MODE_WRITE )
129
+ bmode |= VDEV_BDEV_MODE_WRITE ;
126
130
127
- if (exclusive )
128
- mode |= FMODE_EXCL ;
129
- #endif
131
+ ASSERT (bmode & VDEV_BDEV_MODE_MASK );
132
+ ASSERT0 (bmode & ~VDEV_BDEV_MODE_MASK );
130
133
131
- return (mode );
134
+ return (bmode );
132
135
}
133
136
134
137
/*
@@ -235,30 +238,28 @@ vdev_disk_kobj_evt_post(vdev_t *v)
235
238
}
236
239
237
240
static zfs_bdev_handle_t *
238
- vdev_blkdev_get_by_path (const char * path , spa_mode_t mode , void * holder )
241
+ vdev_blkdev_get_by_path (const char * path , spa_mode_t smode , void * holder )
239
242
{
243
+ vdev_bdev_mode_t bmode = vdev_bdev_mode (smode );
244
+
240
245
#if defined(HAVE_BDEV_OPEN_BY_PATH )
241
- return (bdev_open_by_path (path ,
242
- vdev_bdev_mode (mode , B_TRUE ), holder , NULL ));
246
+ return (bdev_open_by_path (path , bmode , holder , NULL ));
243
247
#elif defined(HAVE_BLKDEV_GET_BY_PATH_4ARG )
244
- return (blkdev_get_by_path (path ,
245
- vdev_bdev_mode (mode , B_TRUE ), holder , NULL ));
248
+ return (blkdev_get_by_path (path , bmode , holder , NULL ));
246
249
#else
247
- return (blkdev_get_by_path (path ,
248
- vdev_bdev_mode (mode , B_TRUE ), holder ));
250
+ return (blkdev_get_by_path (path , bmode , holder ));
249
251
#endif
250
252
}
251
253
252
254
static void
253
- vdev_blkdev_put (zfs_bdev_handle_t * bdh , spa_mode_t mode , void * holder )
255
+ vdev_blkdev_put (zfs_bdev_handle_t * bdh , spa_mode_t smode , void * holder )
254
256
{
255
257
#if defined(HAVE_BDEV_RELEASE )
256
258
return (bdev_release (bdh ));
257
259
#elif defined(HAVE_BLKDEV_PUT_HOLDER )
258
260
return (blkdev_put (BDH_BDEV (bdh ), holder ));
259
261
#else
260
- return (blkdev_put (BDH_BDEV (bdh ),
261
- vdev_bdev_mode (mode , B_TRUE )));
262
+ return (blkdev_put (BDH_BDEV (bdh ), vdev_bdev_mode (smode )));
262
263
#endif
263
264
}
264
265
@@ -267,11 +268,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
267
268
uint64_t * logical_ashift , uint64_t * physical_ashift )
268
269
{
269
270
zfs_bdev_handle_t * bdh ;
270
- #ifdef HAVE_BLK_MODE_T
271
- blk_mode_t mode = vdev_bdev_mode (spa_mode (v -> vdev_spa ), B_FALSE );
272
- #else
273
- fmode_t mode = vdev_bdev_mode (spa_mode (v -> vdev_spa ), B_FALSE );
274
- #endif
271
+ spa_mode_t smode = spa_mode (v -> vdev_spa );
275
272
hrtime_t timeout = MSEC2NSEC (zfs_vdev_open_timeout_ms );
276
273
vdev_disk_t * vd ;
277
274
@@ -322,16 +319,16 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
322
319
reread_part = B_TRUE ;
323
320
}
324
321
325
- vdev_blkdev_put (bdh , mode , zfs_vdev_holder );
322
+ vdev_blkdev_put (bdh , smode , zfs_vdev_holder );
326
323
}
327
324
328
325
if (reread_part ) {
329
- bdh = vdev_blkdev_get_by_path (disk_name , mode ,
326
+ bdh = vdev_blkdev_get_by_path (disk_name , smode ,
330
327
zfs_vdev_holder );
331
328
if (!BDH_IS_ERR (bdh )) {
332
329
int error =
333
330
vdev_bdev_reread_part (BDH_BDEV (bdh ));
334
- vdev_blkdev_put (bdh , mode , zfs_vdev_holder );
331
+ vdev_blkdev_put (bdh , smode , zfs_vdev_holder );
335
332
if (error == 0 ) {
336
333
timeout = MSEC2NSEC (
337
334
zfs_vdev_open_timeout_ms * 2 );
@@ -376,7 +373,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
376
373
hrtime_t start = gethrtime ();
377
374
bdh = BDH_ERR_PTR (- ENXIO );
378
375
while (BDH_IS_ERR (bdh ) && ((gethrtime () - start ) < timeout )) {
379
- bdh = vdev_blkdev_get_by_path (v -> vdev_path , mode ,
376
+ bdh = vdev_blkdev_get_by_path (v -> vdev_path , smode ,
380
377
zfs_vdev_holder );
381
378
if (unlikely (BDH_PTR_ERR (bdh ) == - ENOENT )) {
382
379
/*
0 commit comments