Skip to content

Commit bdbc90f

Browse files
Yunlong SongJaegeuk Kim
authored andcommitted
f2fs: don't put dentry page in pagecache into highmem
Previous dentry page uses highmem, which will cause panic in platforms using highmem (such as arm), since the address space of dentry pages from highmem directly goes into the decryption path via the function fscrypt_fname_disk_to_usr. But sg_init_one assumes the address is not from highmem, and then cause panic since it doesn't call kmap_high but kunmap_high is triggered at the end. To fix this problem in a simple way, this patch avoids to put dentry page in pagecache into highmem. Signed-off-by: Yunlong Song <[email protected]> Reviewed-by: Chao Yu <[email protected]> [Jaegeuk Kim: fix coding style] Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 3664ce2 commit bdbc90f

File tree

7 files changed

+20
-58
lines changed

7 files changed

+20
-58
lines changed

fs/f2fs/dir.c

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,12 @@ static struct f2fs_dir_entry *find_in_block(struct page *dentry_page,
9494
struct f2fs_dir_entry *de;
9595
struct f2fs_dentry_ptr d;
9696

97-
dentry_blk = (struct f2fs_dentry_block *)kmap(dentry_page);
97+
dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
9898

9999
make_dentry_ptr_block(NULL, &d, dentry_blk);
100100
de = find_target_dentry(fname, namehash, max_slots, &d);
101101
if (de)
102102
*res_page = dentry_page;
103-
else
104-
kunmap(dentry_page);
105103

106104
return de;
107105
}
@@ -287,7 +285,6 @@ ino_t f2fs_inode_by_name(struct inode *dir, const struct qstr *qstr,
287285
de = f2fs_find_entry(dir, qstr, page);
288286
if (de) {
289287
res = le32_to_cpu(de->ino);
290-
f2fs_dentry_kunmap(dir, *page);
291288
f2fs_put_page(*page, 0);
292289
}
293290

@@ -302,7 +299,6 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
302299
f2fs_wait_on_page_writeback(page, type, true);
303300
de->ino = cpu_to_le32(inode->i_ino);
304301
set_de_type(de, inode->i_mode);
305-
f2fs_dentry_kunmap(dir, page);
306302
set_page_dirty(page);
307303

308304
dir->i_mtime = dir->i_ctime = current_time(dir);
@@ -350,13 +346,11 @@ static int make_empty_dir(struct inode *inode,
350346
if (IS_ERR(dentry_page))
351347
return PTR_ERR(dentry_page);
352348

353-
dentry_blk = kmap_atomic(dentry_page);
349+
dentry_blk = page_address(dentry_page);
354350

355351
make_dentry_ptr_block(NULL, &d, dentry_blk);
356352
do_make_empty_dir(inode, parent, &d);
357353

358-
kunmap_atomic(dentry_blk);
359-
360354
set_page_dirty(dentry_page);
361355
f2fs_put_page(dentry_page, 1);
362356
return 0;
@@ -547,13 +541,12 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
547541
if (IS_ERR(dentry_page))
548542
return PTR_ERR(dentry_page);
549543

550-
dentry_blk = kmap(dentry_page);
544+
dentry_blk = page_address(dentry_page);
551545
bit_pos = room_for_filename(&dentry_blk->dentry_bitmap,
552546
slots, NR_DENTRY_IN_BLOCK);
553547
if (bit_pos < NR_DENTRY_IN_BLOCK)
554548
goto add_dentry;
555549

556-
kunmap(dentry_page);
557550
f2fs_put_page(dentry_page, 1);
558551
}
559552

@@ -588,7 +581,6 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
588581
if (inode)
589582
up_write(&F2FS_I(inode)->i_sem);
590583

591-
kunmap(dentry_page);
592584
f2fs_put_page(dentry_page, 1);
593585

594586
return err;
@@ -642,7 +634,6 @@ int __f2fs_add_link(struct inode *dir, const struct qstr *name,
642634
F2FS_I(dir)->task = NULL;
643635
}
644636
if (de) {
645-
f2fs_dentry_kunmap(dir, page);
646637
f2fs_put_page(page, 0);
647638
err = -EEXIST;
648639
} else if (IS_ERR(page)) {
@@ -730,7 +721,6 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
730721
bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
731722
NR_DENTRY_IN_BLOCK,
732723
0);
733-
kunmap(page); /* kunmap - pair of f2fs_find_entry */
734724
set_page_dirty(page);
735725

736726
dir->i_ctime = dir->i_mtime = current_time(dir);
@@ -775,15 +765,14 @@ bool f2fs_empty_dir(struct inode *dir)
775765
return false;
776766
}
777767

778-
dentry_blk = kmap_atomic(dentry_page);
768+
dentry_blk = page_address(dentry_page);
779769
if (bidx == 0)
780770
bit_pos = 2;
781771
else
782772
bit_pos = 0;
783773
bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
784774
NR_DENTRY_IN_BLOCK,
785775
bit_pos);
786-
kunmap_atomic(dentry_blk);
787776

788777
f2fs_put_page(dentry_page, 1);
789778

@@ -901,19 +890,17 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)
901890
}
902891
}
903892

904-
dentry_blk = kmap(dentry_page);
893+
dentry_blk = page_address(dentry_page);
905894

906895
make_dentry_ptr_block(inode, &d, dentry_blk);
907896

908897
err = f2fs_fill_dentries(ctx, &d,
909898
n * NR_DENTRY_IN_BLOCK, &fstr);
910899
if (err) {
911-
kunmap(dentry_page);
912900
f2fs_put_page(dentry_page, 1);
913901
break;
914902
}
915903

916-
kunmap(dentry_page);
917904
f2fs_put_page(dentry_page, 1);
918905
}
919906
out_free:

fs/f2fs/f2fs.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2399,12 +2399,6 @@ static inline int f2fs_has_inline_dentry(struct inode *inode)
23992399
return is_inode_flag_set(inode, FI_INLINE_DENTRY);
24002400
}
24012401

2402-
static inline void f2fs_dentry_kunmap(struct inode *dir, struct page *page)
2403-
{
2404-
if (!f2fs_has_inline_dentry(dir))
2405-
kunmap(page);
2406-
}
2407-
24082402
static inline int is_file(struct inode *inode, int type)
24092403
{
24102404
return F2FS_I(inode)->i_advise & type;

fs/f2fs/inline.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
369369
f2fs_wait_on_page_writeback(page, DATA, true);
370370
zero_user_segment(page, MAX_INLINE_DATA(dir), PAGE_SIZE);
371371

372-
dentry_blk = kmap_atomic(page);
372+
dentry_blk = page_address(page);
373373

374374
make_dentry_ptr_inline(dir, &src, inline_dentry);
375375
make_dentry_ptr_block(dir, &dst, dentry_blk);
@@ -386,7 +386,6 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
386386
memcpy(dst.dentry, src.dentry, SIZE_OF_DIR_ENTRY * src.max);
387387
memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
388388

389-
kunmap_atomic(dentry_blk);
390389
if (!PageUptodate(page))
391390
SetPageUptodate(page);
392391
set_page_dirty(page);

fs/f2fs/inode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ struct inode *f2fs_iget(struct super_block *sb, unsigned long ino)
328328
inode->i_op = &f2fs_dir_inode_operations;
329329
inode->i_fop = &f2fs_dir_operations;
330330
inode->i_mapping->a_ops = &f2fs_dblock_aops;
331-
mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_HIGH_ZERO);
331+
inode_nohighmem(inode);
332332
} else if (S_ISLNK(inode->i_mode)) {
333333
if (f2fs_encrypted_inode(inode))
334334
inode->i_op = &f2fs_encrypted_symlink_inode_operations;

fs/f2fs/namei.c

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino)
317317

318318
de = f2fs_find_entry(dir, &dot, &page);
319319
if (de) {
320-
f2fs_dentry_kunmap(dir, page);
321320
f2fs_put_page(page, 0);
322321
} else if (IS_ERR(page)) {
323322
err = PTR_ERR(page);
@@ -329,14 +328,12 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino)
329328
}
330329

331330
de = f2fs_find_entry(dir, &dotdot, &page);
332-
if (de) {
333-
f2fs_dentry_kunmap(dir, page);
331+
if (de)
334332
f2fs_put_page(page, 0);
335-
} else if (IS_ERR(page)) {
333+
else if (IS_ERR(page))
336334
err = PTR_ERR(page);
337-
} else {
335+
else
338336
err = __f2fs_add_link(dir, &dotdot, NULL, pino, S_IFDIR);
339-
}
340337
out:
341338
if (!err)
342339
clear_inode_flag(dir, FI_INLINE_DOTS);
@@ -377,7 +374,6 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
377374
}
378375

379376
ino = le32_to_cpu(de->ino);
380-
f2fs_dentry_kunmap(dir, page);
381377
f2fs_put_page(page, 0);
382378

383379
inode = f2fs_iget(dir->i_sb, ino);
@@ -452,7 +448,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
452448
err = acquire_orphan_inode(sbi);
453449
if (err) {
454450
f2fs_unlock_op(sbi);
455-
f2fs_dentry_kunmap(dir, page);
456451
f2fs_put_page(page, 0);
457452
goto fail;
458453
}
@@ -579,7 +574,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
579574
inode->i_op = &f2fs_dir_inode_operations;
580575
inode->i_fop = &f2fs_dir_operations;
581576
inode->i_mapping->a_ops = &f2fs_dblock_aops;
582-
mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_HIGH_ZERO);
577+
inode_nohighmem(inode);
583578

584579
set_inode_flag(inode, FI_INC_LINK);
585580
f2fs_lock_op(sbi);
@@ -893,13 +888,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
893888
}
894889

895890
if (old_dir_entry) {
896-
if (old_dir != new_dir && !whiteout) {
891+
if (old_dir != new_dir && !whiteout)
897892
f2fs_set_link(old_inode, old_dir_entry,
898893
old_dir_page, new_dir);
899-
} else {
900-
f2fs_dentry_kunmap(old_inode, old_dir_page);
894+
else
901895
f2fs_put_page(old_dir_page, 0);
902-
}
903896
f2fs_i_links_write(old_dir, false);
904897
}
905898
add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
@@ -912,20 +905,15 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
912905

913906
put_out_dir:
914907
f2fs_unlock_op(sbi);
915-
if (new_page) {
916-
f2fs_dentry_kunmap(new_dir, new_page);
908+
if (new_page)
917909
f2fs_put_page(new_page, 0);
918-
}
919910
out_whiteout:
920911
if (whiteout)
921912
iput(whiteout);
922913
out_dir:
923-
if (old_dir_entry) {
924-
f2fs_dentry_kunmap(old_inode, old_dir_page);
914+
if (old_dir_entry)
925915
f2fs_put_page(old_dir_page, 0);
926-
}
927916
out_old:
928-
f2fs_dentry_kunmap(old_dir, old_page);
929917
f2fs_put_page(old_page, 0);
930918
out:
931919
return err;
@@ -1067,19 +1055,15 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
10671055
return 0;
10681056
out_new_dir:
10691057
if (new_dir_entry) {
1070-
f2fs_dentry_kunmap(new_inode, new_dir_page);
10711058
f2fs_put_page(new_dir_page, 0);
10721059
}
10731060
out_old_dir:
10741061
if (old_dir_entry) {
1075-
f2fs_dentry_kunmap(old_inode, old_dir_page);
10761062
f2fs_put_page(old_dir_page, 0);
10771063
}
10781064
out_new:
1079-
f2fs_dentry_kunmap(new_dir, new_page);
10801065
f2fs_put_page(new_page, 0);
10811066
out_old:
1082-
f2fs_dentry_kunmap(old_dir, old_page);
10831067
f2fs_put_page(old_page, 0);
10841068
out:
10851069
return err;

fs/f2fs/recovery.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
144144
retry:
145145
de = __f2fs_find_entry(dir, &fname, &page);
146146
if (de && inode->i_ino == le32_to_cpu(de->ino))
147-
goto out_unmap_put;
147+
goto out_put;
148148

149149
if (de) {
150150
einode = f2fs_iget_retry(inode->i_sb, le32_to_cpu(de->ino));
@@ -153,19 +153,19 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
153153
err = PTR_ERR(einode);
154154
if (err == -ENOENT)
155155
err = -EEXIST;
156-
goto out_unmap_put;
156+
goto out_put;
157157
}
158158

159159
err = dquot_initialize(einode);
160160
if (err) {
161161
iput(einode);
162-
goto out_unmap_put;
162+
goto out_put;
163163
}
164164

165165
err = acquire_orphan_inode(F2FS_I_SB(inode));
166166
if (err) {
167167
iput(einode);
168-
goto out_unmap_put;
168+
goto out_put;
169169
}
170170
f2fs_delete_entry(de, page, dir, einode);
171171
iput(einode);
@@ -180,8 +180,7 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
180180
goto retry;
181181
goto out;
182182

183-
out_unmap_put:
184-
f2fs_dentry_kunmap(dir, page);
183+
out_put:
185184
f2fs_put_page(page, 0);
186185
out:
187186
if (file_enc_name(inode))

include/linux/f2fs_fs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646

4747
/* This flag is used by node and meta inodes, and by recovery */
4848
#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO)
49-
#define GFP_F2FS_HIGH_ZERO (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM)
5049

5150
/*
5251
* For further optimization on multi-head logs, on-disk layout supports maximum

0 commit comments

Comments
 (0)