From: fs <fs@ercist.iscas.ac.cn>
To: Vladimir Saveliev <vs@namesys.com>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
reiserfs-list <reiserfs-list@namesys.com>,
Hans Reiser <reiser@namesys.com>
Subject: [Fwd: Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails]
Date: Fri, 17 Jun 2005 16:24:39 -0400 [thread overview]
Message-ID: <1119039879.4151.4.camel@CoolQ> (raw)
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: Forwarded message - Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails --]
[-- Type: message/rfc822, Size: 3352 bytes --]
From: fs <fs@ercist.iscas.ac.cn>
To: Vladimir Saveliev <vs@namesys.com>
Cc: fs <fs@ercist.iscas.ac.cn>, reiserfs-list@namesys.com, linux-fsdevel <linux-fsdevel@vger.kernel.org>, linux-kernel <linux-kernel@vger.kernel.org>, Hans Reiser <reiser@namesys.com>
Subject: Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails
Date: Fri, 17 Jun 2005 16:15:03 -0400
Message-ID: <20050617201502.GA5155@CoolQ.6f.iscas.ac.cn>
On Thu, Jun 16, 2005 at 02:46:59PM +0400, Vladimir Saveliev wrote:
>
> Yes. reiserfs may store file page in different blocks. In this do {}
> while loop it looks for different parts of page in the tree. If
> search_for_position_by_key fails - one part of page is not found and
> -EIO is to be returned.
>
> > > break;
you mean the patch should be like this?
Signed-off-by: Qu Fuping<fs@ercist.iscas.ac.cn>
diff -uNp linux-2.6.12-rc6.old/fs/reiserfs/inode.c linux-2.6.12-rc6.new/fs/reiserfs/inode.c > reiserfs_read.diff
--- linux-2.6.12-rc6.old/fs/reiserfs/inode.c 2005-06-06 11:22:29.000000000 -0400
+++ linux-2.6.12-rc6.new/fs/reiserfs/inode.c 2005-06-17 16:12:18.000000000 -0400
@@ -254,6 +254,7 @@ static int _get_block_create_0 (struct i
char * p = NULL;
int chars;
int ret ;
+ int result ;
int done = 0 ;
unsigned long offset ;
@@ -262,7 +263,8 @@ static int _get_block_create_0 (struct i
(loff_t)block * inode->i_sb->s_blocksize + 1, TYPE_ANY, 3);
research:
- if (search_for_position_by_key (inode->i_sb, &key, &path) != POSITION_FOUND) {
+ result = search_for_position_by_key (inode->i_sb, &key, &path) ;
+ if (result != POSITION_FOUND) {
pathrelse (&path);
if (p)
kunmap(bh_result->b_page) ;
@@ -270,7 +272,8 @@ research:
// That there is some MMAPED data associated with it that is yet to be written to disk.
if ((args & GET_BLOCK_NO_HOLE) && !PageUptodate(bh_result->b_page) ) {
return -ENOENT ;
- }
+ }else if(result == IO_ERROR)
+ return -EIO;
return 0 ;
}
@@ -382,7 +385,8 @@ research:
// update key to look for the next piece
set_cpu_key_k_offset (&key, cpu_key_k_offset (&key) + chars);
- if (search_for_position_by_key (inode->i_sb, &key, &path) != POSITION_FOUND)
+ result = search_for_position_by_key (inode->i_sb, &key, &path);
+ if (result != POSITION_FOUND)
// we read something from tail, even if now we got IO_ERROR
break;
bh = get_last_bh (&path);
@@ -394,6 +398,10 @@ research:
finished:
pathrelse (&path);
+
+ if(result == IO_ERROR)
+ return -EIO;
+
/* this buffer has valid data, but isn't valid for io. mapping it to
* block #0 tells the rest of reiserfs it just has a tail in it
*/
WARNING: multiple messages have this Message-ID (diff)
From: fs <fs@ercist.iscas.ac.cn>
To: Vladimir Saveliev <vs@namesys.com>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
reiserfs-list <reiserfs-list@namesys.com>,
Hans Reiser <reiser@namesys.com>
Subject: [Fwd: Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails]
Date: Fri, 17 Jun 2005 16:24:39 -0400 [thread overview]
Message-ID: <1119039879.4151.4.camel@CoolQ> (raw)
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: Forwarded message - Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails --]
[-- Type: message/rfc822, Size: 3351 bytes --]
From: fs <fs@ercist.iscas.ac.cn>
To: Vladimir Saveliev <vs@namesys.com>
Cc: fs <fs@ercist.iscas.ac.cn>, reiserfs-list@namesys.com, linux-fsdevel <linux-fsdevel@vger.kernel.org>, linux-kernel <linux-kernel@vger.kernel.org>, Hans Reiser <reiser@namesys.com>
Subject: Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails
Date: Fri, 17 Jun 2005 16:15:03 -0400
Message-ID: <20050617201502.GA5155@CoolQ.6f.iscas.ac.cn>
On Thu, Jun 16, 2005 at 02:46:59PM +0400, Vladimir Saveliev wrote:
>
> Yes. reiserfs may store file page in different blocks. In this do {}
> while loop it looks for different parts of page in the tree. If
> search_for_position_by_key fails - one part of page is not found and
> -EIO is to be returned.
>
> > > break;
you mean the patch should be like this?
Signed-off-by: Qu Fuping<fs@ercist.iscas.ac.cn>
diff -uNp linux-2.6.12-rc6.old/fs/reiserfs/inode.c linux-2.6.12-rc6.new/fs/reiserfs/inode.c > reiserfs_read.diff
--- linux-2.6.12-rc6.old/fs/reiserfs/inode.c 2005-06-06 11:22:29.000000000 -0400
+++ linux-2.6.12-rc6.new/fs/reiserfs/inode.c 2005-06-17 16:12:18.000000000 -0400
@@ -254,6 +254,7 @@ static int _get_block_create_0 (struct i
char * p = NULL;
int chars;
int ret ;
+ int result ;
int done = 0 ;
unsigned long offset ;
@@ -262,7 +263,8 @@ static int _get_block_create_0 (struct i
(loff_t)block * inode->i_sb->s_blocksize + 1, TYPE_ANY, 3);
research:
- if (search_for_position_by_key (inode->i_sb, &key, &path) != POSITION_FOUND) {
+ result = search_for_position_by_key (inode->i_sb, &key, &path) ;
+ if (result != POSITION_FOUND) {
pathrelse (&path);
if (p)
kunmap(bh_result->b_page) ;
@@ -270,7 +272,8 @@ research:
// That there is some MMAPED data associated with it that is yet to be written to disk.
if ((args & GET_BLOCK_NO_HOLE) && !PageUptodate(bh_result->b_page) ) {
return -ENOENT ;
- }
+ }else if(result == IO_ERROR)
+ return -EIO;
return 0 ;
}
@@ -382,7 +385,8 @@ research:
// update key to look for the next piece
set_cpu_key_k_offset (&key, cpu_key_k_offset (&key) + chars);
- if (search_for_position_by_key (inode->i_sb, &key, &path) != POSITION_FOUND)
+ result = search_for_position_by_key (inode->i_sb, &key, &path);
+ if (result != POSITION_FOUND)
// we read something from tail, even if now we got IO_ERROR
break;
bh = get_last_bh (&path);
@@ -394,6 +398,10 @@ research:
finished:
pathrelse (&path);
+
+ if(result == IO_ERROR)
+ return -EIO;
+
/* this buffer has valid data, but isn't valid for io. mapping it to
* block #0 tells the rest of reiserfs it just has a tail in it
*/
next reply other threads:[~2005-06-17 20:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-17 20:24 fs [this message]
2005-06-17 20:24 ` [Fwd: Re: [PATCH] ReiserFS _get_block_create_0 wrong behavior when I/O fails] fs
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1119039879.4151.4.camel@CoolQ \
--to=fs@ercist.iscas.ac.cn \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=reiser@namesys.com \
--cc=reiserfs-list@namesys.com \
--cc=vs@namesys.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.