Tried applying patch to latest git pull as well as 2.0.12 and 2.0.14 and
experienced the following patch issue:

$ patch -p1 <your.patch 
(Stripping trailing CRs from patch.)
patching file fs/dat.c
(Stripping trailing CRs from patch.)
patching file fs/segment.c
patch: **** malformed patch at line 50: @@ -2056,12 +2043,11 @@ static
void nilfs_end_page_io(struct page *page, int err)

I could attempt to do by hand but decided to let you chime in first.

Thoughts? 

Bill

-----Original Message-----
From: Ryusuke Konishi [mailto:[email protected]] 
Sent: Thursday, June 18, 2009 12:37 PM
To: Dunphy, Bill
Cc: [email protected]; [email protected]
Subject: Re: [NILFS users] Write hang on ARM based target

Hi,
On Fri, 12 Jun 2009 13:23:44 +0900 (JST), Ryusuke Konishi wrote:
> On Tue, 9 Jun 2009 13:04:04 -0600, "Dunphy, Bill" wrote:
> >  
> > Ryusuke,
> > 
> > I've simplified my test approach by simply copying a single 10 byte 
> > file repeatedly.  When doing so, I get consistent NILFS log output 
> > at the time of hang.  Examination of /proc/sysreq-trigger also shows

> > the copy process to be in the same state as before (at sys_write).
>
> Thank you for sending me the trace log.  I will look into the problem 
> later.
> 
> Ryusuke Konishi

In another thread, I've sent a patch that may cause the hang problem.
Here, I attach the out-of-tree version of the patch.

Does this make a difference in your problem ?

Thanks,
Ryusuke Konishi
--

diff --git a/fs/dat.c b/fs/dat.c
index 036b05d..b05d9d4 100644
--- a/fs/dat.c
+++ b/fs/dat.c
@@ -149,15 +149,6 @@ void nilfs_dat_commit_start(struct inode *dat,
struct nilfs_palloc_req *req,
        entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
                                             req->pr_entry_bh, kaddr);
        entry->de_start = cpu_to_le64(nilfs_mdt_cno(dat));
-       if (entry->de_blocknr != cpu_to_le64(0) ||
-           entry->de_end != cpu_to_le64(NILFS_CNO_MAX)) {
-               printk(KERN_CRIT
-                      "%s: vbn = %llu, start = %llu, end = %llu, pbn =
%llu\n",
-                      __func__, (unsigned long long)req->pr_entry_nr,
-                      (unsigned long long)le64_to_cpu(entry->de_start),
-                      (unsigned long long)le64_to_cpu(entry->de_end),
-                      (unsigned long
long)le64_to_cpu(entry->de_blocknr));
-       }
        entry->de_blocknr = cpu_to_le64(blocknr);
        kunmap_atomic(kaddr, KM_USER0);
 
diff --git a/fs/segment.c b/fs/segment.c index 3cbb3fe..225d5ae 100644
--- a/fs/segment.c
+++ b/fs/segment.c
@@ -2009,26 +2009,13 @@ static int nilfs_segctor_write(struct
nilfs_sc_info *sci,
                err = nilfs_segbuf_write(segbuf, &wi);
 
                res = nilfs_segbuf_wait(segbuf, &wi);
-               err = unlikely(err) ? : res;
+               err = unlikely(err) ? err : res;
                if (unlikely(err))
                        return err;
        }
        return 0;
 }
 
-static int nilfs_page_has_uncleared_buffer(struct page *page) -{
-       struct buffer_head *head, *bh;
-
-       head = bh = page_buffers(page);
-       do {
-               if (buffer_dirty(bh) &&
!list_empty(&bh->b_assoc_buffers))
-                       return 1;
-               bh = bh->b_this_page;
-       } while (bh != head);
-       return 0;
-}
-
 static void __nilfs_end_page_io(struct page *page, int err)  {
        if (!err) {
@@ -2056,12 +2043,11 @@ static void nilfs_end_page_io(struct page *page,
int err)
        if (!page)
                return;
 
-       if (buffer_nilfs_node(page_buffers(page)) &&
-           nilfs_page_has_uncleared_buffer(page))
-               /* For b-tree node pages, this function may be called
twice
-                  or more because they might be split in a segment.
-                  This check assures that cleanup has been done for all
-                  buffers in a split btnode page. */
+       if (buffer_nilfs_node(page_buffers(page)) &&
!PageWriteback(page))
+               /*
+                * For b-tree node pages, this function may be called
twice
+                * or more because they might be split in a segment.
+                */
                return;
 
        __nilfs_end_page_io(page, err);
@@ -2125,7 +2111,7 @@ static void nilfs_segctor_abort_write(struct
nilfs_sc_info *sci,
                        }
                        if (bh->b_page != fs_page) {
                                nilfs_end_page_io(fs_page, err);
-                               if (unlikely(fs_page == failed_page))
+                               if (fs_page && fs_page == failed_page)
                                        goto done;
                                fs_page = bh->b_page;
                        }
_______________________________________________
users mailing list
[email protected]
https://www.nilfs.org/mailman/listinfo/users

Reply via email to