Skip to content

Commit b4201b5

Browse files
committed
Merge patch series "Convert ecryptfs to use folios"
Matthew Wilcox (Oracle) <willy@infradead.org> says: The next step in the folio project is to remove page->index. This patchset does that for ecryptfs. As an unloved filesystem, I haven't made any effort to support large folios; this is just "keep it working". I have only compile tested this, but since it's a straightforward conversion I'm not expecting any problems beyond my fat fingers. * patches from https://lore.kernel.org/r/20241025190822.1319162-1-willy@infradead.org: ecryptfs: Pass the folio index to crypt_extent() ecryptfs: Convert lower_offset_for_page() to take a folio ecryptfs: Convert ecryptfs_decrypt_page() to take a folio ecryptfs: Convert ecryptfs_encrypt_page() to take a folio ecryptfs: Convert ecryptfs_write_lower_page_segment() to take a folio ecryptfs: Convert ecryptfs_write() to use a folio ecryptfs: Convert ecryptfs_read_lower_page_segment() to take a folio ecryptfs: Convert ecryptfs_copy_up_encrypted_with_header() to take a folio ecryptfs: Use a folio throughout ecryptfs_read_folio() ecryptfs: Convert ecryptfs_writepage() to ecryptfs_writepages() Link: https://lore.kernel.org/r/20241025190822.1319162-1-willy@infradead.org Signed-off-by: Christian Brauner <brauner@kernel.org>
2 parents 8198375 + 9b4bb82 commit b4201b5

File tree

4 files changed

+105
-125
lines changed

4 files changed

+105
-125
lines changed

fs/ecryptfs/crypto.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,10 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
328328
* Convert an eCryptfs page index into a lower byte offset
329329
*/
330330
static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat,
331-
struct page *page)
331+
struct folio *folio)
332332
{
333333
return ecryptfs_lower_header_size(crypt_stat) +
334-
((loff_t)page->index << PAGE_SHIFT);
334+
(loff_t)folio->index * PAGE_SIZE;
335335
}
336336

337337
/**
@@ -340,6 +340,7 @@ static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat,
340340
* encryption operation
341341
* @dst_page: The page to write the result into
342342
* @src_page: The page to read from
343+
* @page_index: The offset in the file (in units of PAGE_SIZE)
343344
* @extent_offset: Page extent offset for use in generating IV
344345
* @op: ENCRYPT or DECRYPT to indicate the desired operation
345346
*
@@ -350,9 +351,9 @@ static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat,
350351
static int crypt_extent(struct ecryptfs_crypt_stat *crypt_stat,
351352
struct page *dst_page,
352353
struct page *src_page,
354+
pgoff_t page_index,
353355
unsigned long extent_offset, int op)
354356
{
355-
pgoff_t page_index = op == ENCRYPT ? src_page->index : dst_page->index;
356357
loff_t extent_base;
357358
char extent_iv[ECRYPTFS_MAX_IV_BYTES];
358359
struct scatterlist src_sg, dst_sg;
@@ -392,7 +393,7 @@ static int crypt_extent(struct ecryptfs_crypt_stat *crypt_stat,
392393

393394
/**
394395
* ecryptfs_encrypt_page
395-
* @page: Page mapped from the eCryptfs inode for the file; contains
396+
* @folio: Folio mapped from the eCryptfs inode for the file; contains
396397
* decrypted content that needs to be encrypted (to a temporary
397398
* page; not in place) and written out to the lower file
398399
*
@@ -406,7 +407,7 @@ static int crypt_extent(struct ecryptfs_crypt_stat *crypt_stat,
406407
*
407408
* Returns zero on success; negative on error
408409
*/
409-
int ecryptfs_encrypt_page(struct page *page)
410+
int ecryptfs_encrypt_page(struct folio *folio)
410411
{
411412
struct inode *ecryptfs_inode;
412413
struct ecryptfs_crypt_stat *crypt_stat;
@@ -416,7 +417,7 @@ int ecryptfs_encrypt_page(struct page *page)
416417
loff_t lower_offset;
417418
int rc = 0;
418419

419-
ecryptfs_inode = page->mapping->host;
420+
ecryptfs_inode = folio->mapping->host;
420421
crypt_stat =
421422
&(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat);
422423
BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED));
@@ -431,16 +432,17 @@ int ecryptfs_encrypt_page(struct page *page)
431432
for (extent_offset = 0;
432433
extent_offset < (PAGE_SIZE / crypt_stat->extent_size);
433434
extent_offset++) {
434-
rc = crypt_extent(crypt_stat, enc_extent_page, page,
435-
extent_offset, ENCRYPT);
435+
rc = crypt_extent(crypt_stat, enc_extent_page,
436+
folio_page(folio, 0), folio->index,
437+
extent_offset, ENCRYPT);
436438
if (rc) {
437439
printk(KERN_ERR "%s: Error encrypting extent; "
438440
"rc = [%d]\n", __func__, rc);
439441
goto out;
440442
}
441443
}
442444

443-
lower_offset = lower_offset_for_page(crypt_stat, page);
445+
lower_offset = lower_offset_for_page(crypt_stat, folio);
444446
enc_extent_virt = kmap_local_page(enc_extent_page);
445447
rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt, lower_offset,
446448
PAGE_SIZE);
@@ -461,7 +463,7 @@ int ecryptfs_encrypt_page(struct page *page)
461463

462464
/**
463465
* ecryptfs_decrypt_page
464-
* @page: Page mapped from the eCryptfs inode for the file; data read
466+
* @folio: Folio mapped from the eCryptfs inode for the file; data read
465467
* and decrypted from the lower file will be written into this
466468
* page
467469
*
@@ -475,7 +477,7 @@ int ecryptfs_encrypt_page(struct page *page)
475477
*
476478
* Returns zero on success; negative on error
477479
*/
478-
int ecryptfs_decrypt_page(struct page *page)
480+
int ecryptfs_decrypt_page(struct folio *folio)
479481
{
480482
struct inode *ecryptfs_inode;
481483
struct ecryptfs_crypt_stat *crypt_stat;
@@ -484,13 +486,13 @@ int ecryptfs_decrypt_page(struct page *page)
484486
loff_t lower_offset;
485487
int rc = 0;
486488

487-
ecryptfs_inode = page->mapping->host;
489+
ecryptfs_inode = folio->mapping->host;
488490
crypt_stat =
489491
&(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat);
490492
BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED));
491493

492-
lower_offset = lower_offset_for_page(crypt_stat, page);
493-
page_virt = kmap_local_page(page);
494+
lower_offset = lower_offset_for_page(crypt_stat, folio);
495+
page_virt = kmap_local_folio(folio, 0);
494496
rc = ecryptfs_read_lower(page_virt, lower_offset, PAGE_SIZE,
495497
ecryptfs_inode);
496498
kunmap_local(page_virt);
@@ -504,8 +506,9 @@ int ecryptfs_decrypt_page(struct page *page)
504506
for (extent_offset = 0;
505507
extent_offset < (PAGE_SIZE / crypt_stat->extent_size);
506508
extent_offset++) {
507-
rc = crypt_extent(crypt_stat, page, page,
508-
extent_offset, DECRYPT);
509+
struct page *page = folio_page(folio, 0);
510+
rc = crypt_extent(crypt_stat, page, page, folio->index,
511+
extent_offset, DECRYPT);
509512
if (rc) {
510513
printk(KERN_ERR "%s: Error decrypting extent; "
511514
"rc = [%d]\n", __func__, rc);

fs/ecryptfs/ecryptfs_kernel.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,8 @@ void ecryptfs_destroy_mount_crypt_stat(
569569
struct ecryptfs_mount_crypt_stat *mount_crypt_stat);
570570
int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat);
571571
int ecryptfs_write_inode_size_to_metadata(struct inode *ecryptfs_inode);
572-
int ecryptfs_encrypt_page(struct page *page);
573-
int ecryptfs_decrypt_page(struct page *page);
572+
int ecryptfs_encrypt_page(struct folio *folio);
573+
int ecryptfs_decrypt_page(struct folio *folio);
574574
int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
575575
struct inode *ecryptfs_inode);
576576
int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry);
@@ -653,16 +653,15 @@ int ecryptfs_keyring_auth_tok_for_sig(struct key **auth_tok_key,
653653
int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
654654
loff_t offset, size_t size);
655655
int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode,
656-
struct page *page_for_lower,
656+
struct folio *folio_for_lower,
657657
size_t offset_in_page, size_t size);
658658
int ecryptfs_write(struct inode *inode, char *data, loff_t offset, size_t size);
659659
int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
660660
struct inode *ecryptfs_inode);
661-
int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs,
661+
int ecryptfs_read_lower_page_segment(struct folio *folio_for_ecryptfs,
662662
pgoff_t page_index,
663663
size_t offset_in_page, size_t size,
664664
struct inode *ecryptfs_inode);
665-
struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index);
666665
int ecryptfs_parse_packet_length(unsigned char *data, size_t *size,
667666
size_t *length_size);
668667
int ecryptfs_write_packet_length(char *dest, size_t size,

0 commit comments

Comments
 (0)