@@ -122,98 +122,6 @@ static inline size_t read_compress_length(const char *buf)
122122 return le32_to_cpu (dlen );
123123}
124124
125- /*
126- * Will do:
127- *
128- * - Write a segment header into the destination
129- * - Copy the compressed buffer into the destination
130- * - Make sure we have enough space in the last sector to fit a segment header
131- * If not, we will pad at most (LZO_LEN (4)) - 1 bytes of zeros.
132- *
133- * Will allocate new pages when needed.
134- */
135- static int copy_compressed_data_to_page (struct btrfs_fs_info * fs_info ,
136- char * compressed_data ,
137- size_t compressed_size ,
138- struct folio * * out_folios ,
139- unsigned long max_nr_folio ,
140- u32 * cur_out )
141- {
142- const u32 sectorsize = fs_info -> sectorsize ;
143- const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
144- u32 sector_bytes_left ;
145- u32 orig_out ;
146- struct folio * cur_folio ;
147- char * kaddr ;
148-
149- if ((* cur_out >> min_folio_shift ) >= max_nr_folio )
150- return - E2BIG ;
151-
152- /*
153- * We never allow a segment header crossing sector boundary, previous
154- * run should ensure we have enough space left inside the sector.
155- */
156- ASSERT ((* cur_out / sectorsize ) == (* cur_out + LZO_LEN - 1 ) / sectorsize );
157-
158- cur_folio = out_folios [* cur_out >> min_folio_shift ];
159- /* Allocate a new page */
160- if (!cur_folio ) {
161- cur_folio = btrfs_alloc_compr_folio (fs_info );
162- if (!cur_folio )
163- return - ENOMEM ;
164- out_folios [* cur_out >> min_folio_shift ] = cur_folio ;
165- }
166-
167- kaddr = kmap_local_folio (cur_folio , offset_in_folio (cur_folio , * cur_out ));
168- write_compress_length (kaddr , compressed_size );
169- * cur_out += LZO_LEN ;
170-
171- orig_out = * cur_out ;
172-
173- /* Copy compressed data */
174- while (* cur_out - orig_out < compressed_size ) {
175- u32 copy_len = min_t (u32 , sectorsize - * cur_out % sectorsize ,
176- orig_out + compressed_size - * cur_out );
177-
178- kunmap_local (kaddr );
179-
180- if ((* cur_out >> min_folio_shift ) >= max_nr_folio )
181- return - E2BIG ;
182-
183- cur_folio = out_folios [* cur_out >> min_folio_shift ];
184- /* Allocate a new page */
185- if (!cur_folio ) {
186- cur_folio = btrfs_alloc_compr_folio (fs_info );
187- if (!cur_folio )
188- return - ENOMEM ;
189- out_folios [* cur_out >> min_folio_shift ] = cur_folio ;
190- }
191- kaddr = kmap_local_folio (cur_folio , 0 );
192-
193- memcpy (kaddr + offset_in_folio (cur_folio , * cur_out ),
194- compressed_data + * cur_out - orig_out , copy_len );
195-
196- * cur_out += copy_len ;
197- }
198-
199- /*
200- * Check if we can fit the next segment header into the remaining space
201- * of the sector.
202- */
203- sector_bytes_left = round_up (* cur_out , sectorsize ) - * cur_out ;
204- if (sector_bytes_left >= LZO_LEN || sector_bytes_left == 0 )
205- goto out ;
206-
207- /* The remaining size is not enough, pad it with zeros */
208- memset (kaddr + offset_in_page (* cur_out ), 0 ,
209- sector_bytes_left );
210- * cur_out += sector_bytes_left ;
211-
212- out :
213- kunmap_local (kaddr );
214- return 0 ;
215- }
216-
217125/*
218126 * Write data into @out_folio and queue it into @out_bio.
219127 *
@@ -365,102 +273,6 @@ static int copy_compressed_data_to_bio(struct btrfs_fs_info *fs_info,
365273 return write_and_queue_folio (out_bio , out_folio , total_out , sector_bytes_left );
366274}
367275
368- int lzo_compress_folios (struct list_head * ws , struct btrfs_inode * inode ,
369- u64 start , struct folio * * folios , unsigned long * out_folios ,
370- unsigned long * total_in , unsigned long * total_out )
371- {
372- struct btrfs_fs_info * fs_info = inode -> root -> fs_info ;
373- struct workspace * workspace = list_entry (ws , struct workspace , list );
374- const u32 sectorsize = fs_info -> sectorsize ;
375- const u32 min_folio_size = btrfs_min_folio_size (fs_info );
376- struct address_space * mapping = inode -> vfs_inode .i_mapping ;
377- struct folio * folio_in = NULL ;
378- char * sizes_ptr ;
379- const unsigned long max_nr_folio = * out_folios ;
380- int ret = 0 ;
381- /* Points to the file offset of input data */
382- u64 cur_in = start ;
383- /* Points to the current output byte */
384- u32 cur_out = 0 ;
385- u32 len = * total_out ;
386-
387- ASSERT (max_nr_folio > 0 );
388- * out_folios = 0 ;
389- * total_out = 0 ;
390- * total_in = 0 ;
391-
392- /*
393- * Skip the header for now, we will later come back and write the total
394- * compressed size
395- */
396- cur_out += LZO_LEN ;
397- while (cur_in < start + len ) {
398- char * data_in ;
399- const u32 sectorsize_mask = sectorsize - 1 ;
400- u32 sector_off = (cur_in - start ) & sectorsize_mask ;
401- u32 in_len ;
402- size_t out_len ;
403-
404- /* Get the input page first */
405- if (!folio_in ) {
406- ret = btrfs_compress_filemap_get_folio (mapping , cur_in , & folio_in );
407- if (ret < 0 )
408- goto out ;
409- }
410-
411- /* Compress at most one sector of data each time */
412- in_len = min_t (u32 , start + len - cur_in , sectorsize - sector_off );
413- ASSERT (in_len );
414- data_in = kmap_local_folio (folio_in , offset_in_folio (folio_in , cur_in ));
415- ret = lzo1x_1_compress (data_in , in_len ,
416- workspace -> cbuf , & out_len ,
417- workspace -> mem );
418- kunmap_local (data_in );
419- if (unlikely (ret < 0 )) {
420- /* lzo1x_1_compress never fails. */
421- ret = - EIO ;
422- goto out ;
423- }
424-
425- ret = copy_compressed_data_to_page (fs_info , workspace -> cbuf , out_len ,
426- folios , max_nr_folio ,
427- & cur_out );
428- if (ret < 0 )
429- goto out ;
430-
431- cur_in += in_len ;
432-
433- /*
434- * Check if we're making it bigger after two sectors. And if
435- * it is so, give up.
436- */
437- if (cur_in - start > sectorsize * 2 && cur_in - start < cur_out ) {
438- ret = - E2BIG ;
439- goto out ;
440- }
441-
442- /* Check if we have reached folio boundary. */
443- if (IS_ALIGNED (cur_in , min_folio_size )) {
444- folio_put (folio_in );
445- folio_in = NULL ;
446- }
447- }
448-
449- /* Store the size of all chunks of compressed data */
450- sizes_ptr = kmap_local_folio (folios [0 ], 0 );
451- write_compress_length (sizes_ptr , cur_out );
452- kunmap_local (sizes_ptr );
453-
454- ret = 0 ;
455- * total_out = cur_out ;
456- * total_in = cur_in - start ;
457- out :
458- if (folio_in )
459- folio_put (folio_in );
460- * out_folios = DIV_ROUND_UP (cur_out , min_folio_size );
461- return ret ;
462- }
463-
464276int lzo_compress_bio (struct list_head * ws , struct compressed_bio * cb )
465277{
466278 struct btrfs_inode * inode = cb -> bbio .inode ;
0 commit comments