Re: [PATCH 12/16] romfs: Convert romfs_read_folio() to use a folio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Mathew,

On 31/5/24 06:21, Matthew Wilcox (Oracle) wrote:
Remove the conversion back to struct page and use the folio APIs instead
of the page APIs.  It's probably more trouble than it's worth to support
large folios in romfs, so there are still PAGE_SIZE assumptions in
this function.

Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>

This is breaking for me on my m68k/ColdFire 5475 target. That is a full
MMU CPU. The usual test build I do (m5475evb_defconfig) fails to boot,
not being able to load and start init or sh at startup from a ROMfs
resident in RAM within the uclinux MTD mapper:

...
Freeing unused kernel image (initmem) memory: 80K
This architecture does not have kernel memory protection.
Run /sbin/init as init process
Run /etc/init as init process
Run /bin/init as init process
Starting init: /bin/init exists but couldn't execute it (error -13)
Run /bin/sh as init process
Starting init: /bin/sh exists but couldn't execute it (error -13)
Kernel panic - not syncing: No working init found.  Try passing init= option to
kernel. See Linux Documentation/admin-guide/init.rst for guidance.
CPU: 0 UID: 0 PID: 1 Comm: swapper Not tainted 6.11.0-rc3 #4
Stack from 00829f74:
        00829f74 003d8508 003d8508 00000000 0000000a 00000003 0032b864 003d8508
        00325126 00000001 00002700 00000003 00829fb0 00324e9e 00000000 00000000
        00000000 0032ba9a 003ce1bd 0032b9b8 000218a4 00000000 00000000 00000000
        00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
        00000000 00002000 00000000
Call Trace: [<0032b864>] dump_stack+0xc/0x10
 [<00325126>] panic+0xca/0x236
 [<00324e9e>] try_to_run_init_process+0x0/0x36
 [<0032ba9a>] kernel_init+0xe2/0xe8
 [<0032b9b8>] kernel_init+0x0/0xe8
 [<000218a4>] ret_from_kernel_thread+0xc/0x14

Reverting this change gets it going again.

Any idea what might be going on?

Regards
Greg


---
  fs/romfs/super.c | 22 ++++++----------------
  1 file changed, 6 insertions(+), 16 deletions(-)

diff --git a/fs/romfs/super.c b/fs/romfs/super.c
index 2cbb92462074..68758b6fed94 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -101,19 +101,15 @@ static struct inode *romfs_iget(struct super_block *sb, unsigned long pos);
   */
  static int romfs_read_folio(struct file *file, struct folio *folio)
  {
-	struct page *page = &folio->page;
-	struct inode *inode = page->mapping->host;
+	struct inode *inode = folio->mapping->host;
  	loff_t offset, size;
  	unsigned long fillsize, pos;
  	void *buf;
  	int ret;
- buf = kmap(page);
-	if (!buf)
-		return -ENOMEM;
+	buf = kmap_local_folio(folio, 0);
- /* 32 bit warning -- but not for us :) */
-	offset = page_offset(page);
+	offset = folio_pos(folio);
  	size = i_size_read(inode);
  	fillsize = 0;
  	ret = 0;
@@ -125,20 +121,14 @@ static int romfs_read_folio(struct file *file, struct folio *folio)
ret = romfs_dev_read(inode->i_sb, pos, buf, fillsize);
  		if (ret < 0) {
-			SetPageError(page);
  			fillsize = 0;
  			ret = -EIO;
  		}
  	}
- if (fillsize < PAGE_SIZE)
-		memset(buf + fillsize, 0, PAGE_SIZE - fillsize);
-	if (ret == 0)
-		SetPageUptodate(page);
-
-	flush_dcache_page(page);
-	kunmap(page);
-	unlock_page(page);
+	buf = folio_zero_tail(folio, fillsize, buf);
+	kunmap_local(buf);
+	folio_end_read(folio, ret == 0);
  	return ret;
  }




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux