aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/filelayout
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@primarydata.com>2014-07-17 20:42:17 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-08-03 17:05:25 -0400
commit02d1426c7053da7c5a828ae9cd7b636ea4e46bf7 (patch)
treec241cc5c33ce52da89ecf04486988b21c85d0203 /fs/nfs/filelayout
parentb412ddf0661e11485876a202c48868143e3a01cf (diff)
pnfs: find swapped pages on pnfs commit lists too
nfs_page_find_head_request_locked looks through the regular nfs commit lists when the page is swapped out, but doesn't look through the pnfs commit lists. I'm not sure if anyone has hit any issues caused by this. Suggested-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/filelayout')
-rw-r--r--fs/nfs/filelayout/filelayout.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c
index 2576d28bffc0..524e66f6bb9c 100644
--- a/fs/nfs/filelayout/filelayout.c
+++ b/fs/nfs/filelayout/filelayout.c
@@ -1237,6 +1237,36 @@ restart:
1237 spin_unlock(cinfo->lock); 1237 spin_unlock(cinfo->lock);
1238} 1238}
1239 1239
1240/* filelayout_search_commit_reqs - Search lists in @cinfo for the head reqest
1241 * for @page
1242 * @cinfo - commit info for current inode
1243 * @page - page to search for matching head request
1244 *
1245 * Returns a the head request if one is found, otherwise returns NULL.
1246 */
1247static struct nfs_page *
1248filelayout_search_commit_reqs(struct nfs_commit_info *cinfo, struct page *page)
1249{
1250 struct nfs_page *freq, *t;
1251 struct pnfs_commit_bucket *b;
1252 int i;
1253
1254 /* Linearly search the commit lists for each bucket until a matching
1255 * request is found */
1256 for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {
1257 list_for_each_entry_safe(freq, t, &b->written, wb_list) {
1258 if (freq->wb_page == page)
1259 return freq->wb_head;
1260 }
1261 list_for_each_entry_safe(freq, t, &b->committing, wb_list) {
1262 if (freq->wb_page == page)
1263 return freq->wb_head;
1264 }
1265 }
1266
1267 return NULL;
1268}
1269
1240static void filelayout_retry_commit(struct nfs_commit_info *cinfo, int idx) 1270static void filelayout_retry_commit(struct nfs_commit_info *cinfo, int idx)
1241{ 1271{
1242 struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 1272 struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
@@ -1386,6 +1416,7 @@ static struct pnfs_layoutdriver_type filelayout_type = {
1386 .clear_request_commit = filelayout_clear_request_commit, 1416 .clear_request_commit = filelayout_clear_request_commit,
1387 .scan_commit_lists = filelayout_scan_commit_lists, 1417 .scan_commit_lists = filelayout_scan_commit_lists,
1388 .recover_commit_reqs = filelayout_recover_commit_reqs, 1418 .recover_commit_reqs = filelayout_recover_commit_reqs,
1419 .search_commit_reqs = filelayout_search_commit_reqs,
1389 .commit_pagelist = filelayout_commit_pagelist, 1420 .commit_pagelist = filelayout_commit_pagelist,
1390 .read_pagelist = filelayout_read_pagelist, 1421 .read_pagelist = filelayout_read_pagelist,
1391 .write_pagelist = filelayout_write_pagelist, 1422 .write_pagelist = filelayout_write_pagelist,