linux-embedded.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 10/16 v2] pramfs: XIP operations
@ 2010-11-06  8:59 Marco Stornelli
  2010-11-06 13:33 ` James Hogan
  0 siblings, 1 reply; 3+ messages in thread
From: Marco Stornelli @ 2010-11-06  8:59 UTC (permalink / raw)
  To: Linux Kernel; +Cc: Linux Embedded, Linux FS Devel, Tim Bird, Andrew Morton

From: Marco Stornelli <marco.stornelli@gmail.com>

XIP operations.

Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
---
diff -Nurp linux-2.6.36-orig/fs/pramfs/xip.c linux-2.6.36/fs/pramfs/xip.c
--- linux-2.6.36-orig/fs/pramfs/xip.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.36/fs/pramfs/xip.c	2010-09-14 18:49:52.000000000 +0200
@@ -0,0 +1,90 @@
+/*
+ * FILE NAME fs/pramfs/xip.c
+ *
+ * BRIEF DESCRIPTION
+ *
+ * XIP operations.
+ *
+ * Copyright 2009-2010 Marco Stornelli <marco.stornelli@gmail.com>
+ * 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.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;
+	u64 block;
+
+	mutex_lock(&PRAM_I(inode)->truncate_lock);
+
+	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:
+	mutex_unlock(&PRAM_I(inode)->truncate_lock);
+	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;
+}
diff -Nurp linux-2.6.36-orig/fs/pramfs/xip.h linux-2.6.36/fs/pramfs/xip.h
--- linux-2.6.36-orig/fs/pramfs/xip.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.36/fs/pramfs/xip.h	2010-09-14 18:49:52.000000000 +0200
@@ -0,0 +1,24 @@
+/*
+ * FILE NAME fs/pramfs/xip.h
+ *
+ * BRIEF DESCRIPTION
+ *
+ * XIP operations.
+ *
+ * Copyright 2009-2010 Marco Stornelli <marco.stornelli@gmail.com>
+ * 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
+
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 10/16 v2] pramfs: XIP operations
  2010-11-06  8:59 [PATCH 10/16 v2] pramfs: XIP operations Marco Stornelli
@ 2010-11-06 13:33 ` James Hogan
  2010-11-06 15:00   ` Marco Stornelli
  0 siblings, 1 reply; 3+ messages in thread
From: James Hogan @ 2010-11-06 13:33 UTC (permalink / raw)
  To: Marco Stornelli
  Cc: Linux Kernel, Linux Embedded, Linux FS Devel, Tim Bird,
	Andrew Morton

Hi,

On Sat, Nov 06, 2010 at 09:59:27AM +0100, Marco Stornelli wrote:
> diff -Nurp linux-2.6.36-orig/fs/pramfs/xip.c linux-2.6.36/fs/pramfs/xip.c
> --- linux-2.6.36-orig/fs/pramfs/xip.c	1970-01-01 01:00:00.000000000 +0100
> +++ linux-2.6.36/fs/pramfs/xip.c	2010-09-14 18:49:52.000000000 +0200
<snip>
> +static int pram_find_and_alloc_blocks(struct inode *inode, sector_t iblock,
> +				     sector_t *data_block, int create)
> +{
> +	int err = -EIO;
> +	u64 block;
> +
> +	mutex_lock(&PRAM_I(inode)->truncate_lock);

fs/pramfs/xip.c: In function ‘pram_find_and_alloc_blocks’:
fs/pramfs/xip.c:27: error: ‘struct pram_inode_vfs’ has no member named
‘truncate_lock’
fs/pramfs/xip.c:52: error: ‘struct pram_inode_vfs’ has no member named
‘truncate_lock’

i guess that should be truncate_mutex.

> +
> +	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:
> +	mutex_unlock(&PRAM_I(inode)->truncate_lock);

same here

> +	return err;
> +}

Cheers
James

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 10/16 v2] pramfs: XIP operations
  2010-11-06 13:33 ` James Hogan
@ 2010-11-06 15:00   ` Marco Stornelli
  0 siblings, 0 replies; 3+ messages in thread
From: Marco Stornelli @ 2010-11-06 15:00 UTC (permalink / raw)
  To: James Hogan
  Cc: Linux Kernel, Linux Embedded, Linux FS Devel, Tim Bird,
	Andrew Morton

Il 06/11/2010 14:33, James Hogan ha scritto:
> Hi,
> 
> On Sat, Nov 06, 2010 at 09:59:27AM +0100, Marco Stornelli wrote:
>> diff -Nurp linux-2.6.36-orig/fs/pramfs/xip.c linux-2.6.36/fs/pramfs/xip.c
>> --- linux-2.6.36-orig/fs/pramfs/xip.c	1970-01-01 01:00:00.000000000 +0100
>> +++ linux-2.6.36/fs/pramfs/xip.c	2010-09-14 18:49:52.000000000 +0200
> <snip>
>> +static int pram_find_and_alloc_blocks(struct inode *inode, sector_t iblock,
>> +				     sector_t *data_block, int create)
>> +{
>> +	int err = -EIO;
>> +	u64 block;
>> +
>> +	mutex_lock(&PRAM_I(inode)->truncate_lock);
> 
> fs/pramfs/xip.c: In function ‘pram_find_and_alloc_blocks’:
> fs/pramfs/xip.c:27: error: ‘struct pram_inode_vfs’ has no member named
> ‘truncate_lock’
> fs/pramfs/xip.c:52: error: ‘struct pram_inode_vfs’ has no member named
> ‘truncate_lock’
> 
> i guess that should be truncate_mutex.
> 

Oops, my fault, yes it's truncate_mutex. I'll fix it asap.

Marco

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-11-06 15:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-06  8:59 [PATCH 10/16 v2] pramfs: XIP operations Marco Stornelli
2010-11-06 13:33 ` James Hogan
2010-11-06 15:00   ` Marco Stornelli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).