On Mon, Apr 16, 2012 at 9:44 AM, Mel Gorman <mgorman@xxxxxxx> wrote: > On Mon, Apr 16, 2012 at 09:10:04AM -0400, Fred Isaman wrote: >> > <SNIP> >> > -static struct nfs_page *nfs_page_find_request_locked(struct page *page) >> > +static struct nfs_page * >> > +nfs_page_find_request_locked(struct nfs_inode *nfsi, struct page *page) >> > { >> > struct nfs_page *req = NULL; >> > >> > - if (PagePrivate(page)) { >> > + if (PagePrivate(page)) >> > req = (struct nfs_page *)page_private(page); >> > - if (req != NULL) >> > - kref_get(&req->wb_kref); >> > + else if (unlikely(PageSwapCache(page))) { >> > + struct nfs_page *freq, *t; >> > + >> > + /* Linearly search the commit list for the correct req */ >> > + list_for_each_entry_safe(freq, t, &nfsi->commit_list, wb_list) { >> > + if (freq->wb_page == page) { >> > + req = freq; >> > + break; >> > + } >> > + } >> > + >> > + BUG_ON(req == NULL); >> >> I suspect I am missing something, but why is it guaranteed that the >> req is on the commit list? >> > > It's a fair question and a statement about what I expected to happen. > The commit list replaces the nfs_page_tree radix tree that used to exist > and my understanding was that the req would exist in the radix tree until > the swap IO was completed. I expected it to be the same for the commit > list and the BUG_ON was based on that expectation. Are there cases where > the req would not be found? > > Thanks. > > -- > Mel Gorman > SUSE Labs > -- A req is on the commit list only if it actually needs to be scheduled for COMMIT. In other words, only after it has been sent via WRITE and the server did not return NFS_FILE_SYNC. Thus dirtying a page, then trying to touch it again before the WRITE is sent will not find the corresponding req on the commit_list. Fred -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html