Pramfs: XIP operations
PATCH 14/14 Pramfs: XIP operations
From: Marco Stornelli <[email protected]>
XIP operations.
---
fs/pramfs/xip.c +90 -0
@@ -0,0 +1,90 @@ +/* +* FILE NAME fs/pramfs/xip.c +* +* BRIEF DESCRIPTION +* +* XIP operations. +* +* Copyright 2009 Marco Stornelli <[email protected]> +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/mm.h> +#include <linux/fs.h> +#include <linux/genhd.h> +#include <linux/buffer_head.h> +#include "pram_fs.h" +#include "xip.h" + +static int pram_find_and_alloc_blocks (struct inode *inode,sector_t iblock, +sector_t *data_block,int create) +{ +int err = -EIO ; +off_t block; + +lock_kernel (); + + block =pram_find_data_block (inode, iblock); + +if (!block) { +if (!create) { + err = -ENODATA ; + goto err; + } + + err =pram_alloc_blocks (inode, iblock,1 ); +if (err) + goto err; + + block =pram_find_data_block (inode, iblock); +if (!block) { + err = -ENODATA ; + goto err; + } + } + + *data_block = block; + err =0 ; + + err: +unlock_kernel (); +return err; +} + + +static int __pram_get_block (struct inode *inode,pgoff_t pgoff,int create, +sector_t *result) +{ +int rc =0 ; +sector_t iblock; + +/* find starting block number to access */ + iblock = (sector_t )pgoff << (PAGE_CACHE_SHIFT - inode->i_blkbits); + + rc =pram_find_and_alloc_blocks (inode, iblock, result, create); + +if (rc == -ENODATA ) +BUG_ON (create); + +return rc; +} + +int pram_get_xip_mem (struct address_space *mapping,pgoff_t pgoff,int create, +void **kmem,unsigned long *pfn) +{ +int rc; +sector_t block; + +/* first, retrieve the block */ + rc =__pram_get_block (mapping->host, pgoff, create, &block); +if (rc) + goto exit; + + *kmem =pram_get_block (mapping->host->i_sb, block); + *pfn =page_to_pfn (virt_to_page ((unsigned long )*kmem)); + +exit: +return rc; +}
fs/pramfs/xip.h +25 -0
@@ -0,0 +1,25 @@ +/* +* FILE NAME fs/pramfs/xip.h +* +* BRIEF DESCRIPTION +* +* XIP operations. +* +* Author: Marco Stornelli <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifdef CONFIG_PRAMFS_XIP + +int pram_get_xip_mem (struct address_space *,pgoff_t ,int ,void **, +unsigned long *); + +#else + +#define pram_get_xip_mem NULL + +#endif +
Quoted 28 lines · Marco
From: Marco Stornelli <[email protected]>
XIP operations.
Signed-off-by Marco Stornelli <[email protected]>---
diff -uprN
linux-2.6.30-orig/fs/pramfs/xip.clinux-2.6.30/fs/pramfs/xip.cfs/pramfs/xip.c +17
-0@@ -0,0 +1,90 @@ +/* +* FILE NAME fs/pramfs/xip.c +* +* BRIEF DESCRIPTION +* +* XIP operations. +* +* Copyright 2009 Marco Stornelli <[email protected]> +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/mm.h> +#include <linux/fs.h> +#include <linux/genhd.h> +#include <linux/buffer_head.h>
fs/pramfs/xip.c line 27
Quoted 10 lines
fs/pramfs/xip.c +10
-0+#include "pram_fs.h" +#include "xip.h" + +static int pram_find_and_alloc_blocks (struct inode *inode,sector_t iblock, +sector_t *data_block,int create) +{ +int err = -EIO ; +off_t block; + +lock_kernel ();
Can we find other solutions than taking the BKL?
We are trying to get rid of it.
Quoted 28 lines
fs/pramfs/xip.c +28
-0+ + block =pram_find_data_block (inode, iblock); + +if (!block) { +if (!create) { + err = -ENODATA ; + goto err; + } + + err =pram_alloc_blocks (inode, iblock,1 ); +if (err) + goto err; + + block =pram_find_data_block (inode, iblock); +if (!block) { + err = -ENODATA ; + goto err; + } + } + + *data_block = block; + err =0 ; + + err: +unlock_kernel (); +return err; +} +
Quoted 34 lines · Sam Ravnborg
Quoted 33 lines · Marco
From: Marco Stornelli <[email protected]>
XIP operations.
Signed-off-by Marco Stornelli <[email protected]>---
diff -uprN
linux-2.6.30-orig/fs/pramfs/xip.clinux-2.6.30/fs/pramfs/xip.cfs/pramfs/xip.c +22
-0@@ -0,0 +1,90 @@ +/* +* FILE NAME fs/pramfs/xip.c +* +* BRIEF DESCRIPTION +* +* XIP operations. +* +* Copyright 2009 Marco Stornelli <[email protected]> +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#include <linux/mm.h> +#include <linux/fs.h> +#include <linux/genhd.h> +#include <linux/buffer_head.h> +#include "pram_fs.h" +#include "xip.h" + +static int pram_find_and_alloc_blocks (struct inode *inode,sector_t iblock, +sector_t *data_block,int create)
Quoted 9 lines
fs/pramfs/xip.c line 27
Quoted 5 lines
fs/pramfs/xip.c +5
-0+{ +int err = -EIO ; +off_t block; + +lock_kernel ();Can we find other solutions than taking the BKL?
We are trying to get rid of it.
I know. It wasn't my intention to introduce it but as I said in my first patch I've done a porting of this code from 2.6.10 and to remove it I need time to analyze well the code to avoid deadlock and so on. If someone would like to help me I'd really appreciate it. However I see the use of BKL even in other recent "mainlined" fs as ext4, so I preferred to move the porting effort on other areas. However it's the first item on my todo list.
Quoted 7 lines
I know. It wasn't my intention to introduce it but as I said in my first patch I've done a porting of this code from 2.6.10 and to remove it I need time to analyze well the code to avoid deadlock and so on. If someone would like to help me I'd really appreciate it. However I see the use of BKL even in other recent "mainlined" fs as ext4, so I preferred to move the porting effort on other areas. However it's the first item on my todo list.
Why do you need the lock in pram_find_and_alloc_blocks() to begin with? Why wouldn't a mutex work?