@@ -70,104 +70,6 @@ iszero(blk_metadata_t *md)
7070 last_md = NULL; \
7171 } while (0)
7272
73- int
74- get_snapshot_zv (zvol_state_t * zv , char * snap_name , zvol_state_t * * snap_zv ,
75- boolean_t fail_exists , boolean_t fail_notexists )
76- {
77- char * dataset ;
78- int ret = 0 ;
79-
80- dataset = kmem_asprintf ("%s@%s" , strchr (zv -> zv_name , '/' ) + 1 ,
81- snap_name );
82-
83- ret = uzfs_open_dataset (zv -> zv_spa , dataset , snap_zv );
84- if (ret == ENOENT ) {
85- if (fail_notexists ) {
86- LOG_ERR ("fail on unavailable snapshot %s" ,
87- dataset );
88- strfree (dataset );
89- ret = SET_ERROR (ENOENT );
90- return (ret );
91- }
92- ret = dmu_objset_snapshot_one (zv -> zv_name , snap_name );
93- if (ret ) {
94- LOG_ERR ("Failed to create snapshot %s: %d" ,
95- dataset , ret );
96- strfree (dataset );
97- return (ret );
98- }
99-
100- ret = uzfs_open_dataset (zv -> zv_spa , dataset , snap_zv );
101- if (ret == 0 ) {
102- ret = uzfs_hold_dataset (* snap_zv );
103- if (ret != 0 ) {
104- LOG_ERR ("Failed to hold snapshot: %s %d" ,
105- dataset , ret );
106- uzfs_close_dataset (* snap_zv );
107- * snap_zv = NULL ;
108- }
109- }
110- else
111- LOG_ERR ("Failed to open snapshot: %d" , ret );
112- } else if (ret == 0 ) {
113- if (fail_exists ) {
114- LOG_ERR ("fail on already available snapshot %s" ,
115- dataset );
116- uzfs_close_dataset (* snap_zv );
117- * snap_zv = NULL ;
118- ret = SET_ERROR (EEXIST );
119- } else {
120- LOG_INFO ("holding already available snapshot %s" ,
121- dataset );
122- ret = uzfs_hold_dataset (* snap_zv );
123- if (ret != 0 ) {
124- LOG_ERR ("Failed to hold already existing "
125- "snapshot %s: %d" , dataset , ret );
126- uzfs_close_dataset (* snap_zv );
127- * snap_zv = NULL ;
128- }
129- }
130- } else {
131- LOG_ERR ("Failed to open snapshot: %d" , ret );
132- }
133-
134- strfree (dataset );
135- return (ret );
136- }
137-
138- /*
139- * Creates internal snapshot on given zv using current time as part of snapname.
140- * If snap already exists, waits and attempts to create again.
141- * Returns zv of snapshot in snap_zv.
142- */
143- int
144- uzfs_zvol_create_internal_snapshot (zvol_state_t * zv , zvol_state_t * * snap_zv ,
145- uint64_t io_num , char * * snap )
146- {
147- int ret = 0 ;
148- char * snap_name ;
149- time_t now ;
150- again :
151- now = time (NULL );
152- snap_name = kmem_asprintf ("%s%llu.%llu" , IO_DIFF_SNAPNAME , io_num , now );
153- ret = get_snapshot_zv (zv , snap_name , snap_zv , B_TRUE , B_FALSE );
154- if (ret == EEXIST ) {
155- strfree (snap_name );
156- sleep (1 );
157- LOG_INFO ("Waiting to create internal snapshot" );
158- goto again ;
159- }
160- if (ret != 0 ) {
161- LOG_ERR ("Failed to get info about %s@%s" ,
162- zv -> zv_name , snap_name );
163- strfree (snap_name );
164- } else {
165- * snap = snap_name ;
166- }
167- return (ret );
168- }
169-
170-
17173void
17274destroy_snapshot_zv (zvol_state_t * zv , char * snap_name )
17375{
@@ -179,15 +81,15 @@ destroy_snapshot_zv(zvol_state_t *zv, char *snap_name)
17981}
18082
18183int
182- uzfs_get_io_diff (zvol_state_t * zv , blk_metadata_t * low ,
84+ uzfs_get_io_diff (zvol_state_t * zv , blk_metadata_t * low , zvol_state_t * snap ,
18385 uzfs_get_io_diff_cb_t * func , off_t lun_offset , size_t lun_len , void * arg )
18486{
18587 uint64_t blocksize = zv -> zv_volmetablocksize ;
18688 uint64_t metadata_read_chunk_size = 10 * blocksize ;
18789 uint64_t metaobjectsize = (zv -> zv_volsize / zv -> zv_metavolblocksize ) *
18890 zv -> zv_volmetadatasize ;
18991 uint64_t metadatasize = zv -> zv_volmetadatasize ;
190- char * buf , * snap_name = NULL ;
92+ char * buf ;
19193 uint64_t i , read ;
19294 uint64_t offset , len , end ;
19395 int ret = 0 ;
@@ -197,7 +99,7 @@ uzfs_get_io_diff(zvol_state_t *zv, blk_metadata_t *low,
19799 zvol_state_t * snap_zv ;
198100 metaobj_blk_offset_t snap_metablk ;
199101
200- if (!func || (lun_offset + lun_len ) > zv -> zv_volsize )
102+ if (!func || (lun_offset + lun_len ) > zv -> zv_volsize || snap == NULL )
201103 return (EINVAL );
202104
203105 get_zv_metaobj_block_details (& snap_metablk , zv , lun_offset , lun_len );
@@ -207,8 +109,7 @@ uzfs_get_io_diff(zvol_state_t *zv, blk_metadata_t *low,
207109 if (end > metaobjectsize )
208110 end = metaobjectsize ;
209111
210- ret = uzfs_zvol_create_internal_snapshot (zv , & snap_zv ,
211- low -> io_num , & snap_name );
112+ snap_zv = snap ;
212113
213114 if (ret != 0 ) {
214115 LOG_ERR ("Failed to create snapshot for vol %s io_num %lu" ,
@@ -292,17 +193,8 @@ uzfs_get_io_diff(zvol_state_t *zv, blk_metadata_t *low,
292193 }
293194 }
294195
295- uzfs_close_dataset (snap_zv );
296-
297- /*
298- * TODO: if we failed to destroy snapshot here then
299- * this should be handled separately from application.
300- */
301- if (end == metaobjectsize )
302- destroy_snapshot_zv (zv , snap_name );
303196
304197 umem_free (buf , metadata_read_chunk_size );
305- strfree (snap_name );
306198 return (ret );
307199}
308200
0 commit comments