All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boaz Harrosh <bharrosh@panasas.com>
To: Benny Halevy <bhalevy@panasas.com>,
	Trond Myklebust <Trond.Myklebust@netapp.com>,
	NFS list <linux-nfs@vger.kernel.org>,
	open-osd <osd-dev@open-osd.org>
Cc: Benny Halevy <bhalevy@panasas.com>
Subject: [PATCH 04/23] pnfs: Use byte-range for cb_layoutrecall
Date: Sun, 22 May 2011 19:48:02 +0300	[thread overview]
Message-ID: <1306082882-10730-1-git-send-email-bharrosh@panasas.com> (raw)
In-Reply-To: <4DD93D3E.9010909@panasas.com>

From: Benny Halevy <bhalevy@panasas.com>

Use recalled range to invalidate particular layout segments in the layout cache.

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
---
 fs/nfs/callback_proc.c |    4 ++--
 fs/nfs/pnfs.c          |   15 +++++++++------
 fs/nfs/pnfs.h          |    2 +-
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
index 975c8f2..964c416 100644
--- a/fs/nfs/callback_proc.c
+++ b/fs/nfs/callback_proc.c
@@ -139,7 +139,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,
 	spin_lock(&ino->i_lock);
 	if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
 	    mark_matching_lsegs_invalid(lo, &free_me_list,
-					args->cbl_range.iomode))
+					&args->cbl_range))
 		rv = NFS4ERR_DELAY;
 	else
 		rv = NFS4ERR_NOMATCHING_LAYOUT;
@@ -184,7 +184,7 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,
 		ino = lo->plh_inode;
 		spin_lock(&ino->i_lock);
 		set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
-		if (mark_matching_lsegs_invalid(lo, &free_me_list, range.iomode))
+		if (mark_matching_lsegs_invalid(lo, &free_me_list, &range))
 			rv = NFS4ERR_DELAY;
 		list_del_init(&lo->plh_bulk_recall);
 		spin_unlock(&ino->i_lock);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index bad146e..dcf04ea 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -321,10 +321,12 @@ lo_seg_intersecting(struct pnfs_layout_range *l1,
 }
 
 static bool
-should_free_lseg(u32 lseg_iomode, u32 recall_iomode)
+should_free_lseg(struct pnfs_layout_range *lseg_range,
+		 struct pnfs_layout_range *recall_range)
 {
-	return (recall_iomode == IOMODE_ANY ||
-		lseg_iomode == recall_iomode);
+	return (recall_range->iomode == IOMODE_ANY ||
+		lseg_range->iomode == recall_range->iomode) &&
+	       lo_seg_intersecting(lseg_range, recall_range);
 }
 
 /* Returns 1 if lseg is removed from list, 0 otherwise */
@@ -355,7 +357,7 @@ static int mark_lseg_invalid(struct pnfs_layout_segment *lseg,
 int
 mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
 			    struct list_head *tmp_list,
-			    u32 iomode)
+			    struct pnfs_layout_range *recall_range)
 {
 	struct pnfs_layout_segment *lseg, *next;
 	int invalid = 0, removed = 0;
@@ -368,7 +370,8 @@ mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
 		return 0;
 	}
 	list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
-		if (should_free_lseg(lseg->pls_range.iomode, iomode)) {
+		if (!recall_range ||
+		    should_free_lseg(&lseg->pls_range, recall_range)) {
 			dprintk("%s: freeing lseg %p iomode %d "
 				"offset %llu length %llu\n", __func__,
 				lseg, lseg->pls_range.iomode, lseg->pls_range.offset,
@@ -417,7 +420,7 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
 	lo = nfsi->layout;
 	if (lo) {
 		lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
-		mark_matching_lsegs_invalid(lo, &tmp_list, IOMODE_ANY);
+		mark_matching_lsegs_invalid(lo, &tmp_list, NULL);
 	}
 	spin_unlock(&nfsi->vfs_inode.i_lock);
 	pnfs_free_lseg_list(&tmp_list);
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 14a2af9..02ef40c 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -151,7 +151,7 @@ int pnfs_choose_layoutget_stateid(nfs4_stateid *dst,
 				  struct nfs4_state *open_state);
 int mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
 				struct list_head *tmp_list,
-				u32 iomode);
+				struct pnfs_layout_range *recall_range);
 bool pnfs_roc(struct inode *ino);
 void pnfs_roc_release(struct inode *ino);
 void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
-- 
1.7.2.3


  parent reply	other threads:[~2011-05-22 16:48 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-22 16:43 [PATCHSET V4 00/23 boaz] pnfs for 2.6.40 Boaz Harrosh
2011-05-22 16:47 ` [PATCH 01/23] pnfs: CB_NOTIFY_DEVICEID Boaz Harrosh
2011-05-22 16:47 ` [PATCH 02/23] pnfs: Use byte-range for layoutget Boaz Harrosh
2011-05-22 16:47 ` [PATCH 03/23] pnfs: align layoutget requests on page boundaries Boaz Harrosh
2011-05-22 16:48 ` Boaz Harrosh [this message]
2011-05-22 16:48 ` [PATCH 05/23] pnfs: client stats Boaz Harrosh
2011-05-22 16:48 ` [PATCH 06/23] pnfs: resolve header dependency in pnfs.h Boaz Harrosh
2011-05-22 16:49 ` [PATCH 07/23] pnfs-obj: objlayoutdriver module skeleton Boaz Harrosh
2011-05-22 16:49 ` [PATCH 08/23] pnfs-obj: pnfs_osd XDR definitions Boaz Harrosh
2011-05-22 16:49 ` [PATCH 09/23] pnfs-obj: pnfs_osd XDR client implementation Boaz Harrosh
2011-05-22 16:50 ` [PATCH 10/23] pnfs-obj: decode layout, alloc/free lseg Boaz Harrosh
2011-05-22 16:50 ` [PATCH 11/23] pnfs: per mount layout driver private data Boaz Harrosh
2011-05-22 16:50 ` [PATCH 12/23] pnfs-obj: objio_osd device information retrieval and caching Boaz Harrosh
2011-05-22 16:51 ` [PATCH 13/23] pnfs: set/unset layoutdriver Boaz Harrosh
2011-05-22 16:51 ` [PATCH 14/23] pnfs: alloc and free layout_hdr layoutdriver methods Boaz Harrosh
2011-05-22 16:51 ` [PATCH 15/23] pnfs-obj: define per-mount and per-inode private structures Boaz Harrosh
2011-05-22 16:52 ` [PATCH 16/23] pnfs: support for non-rpc layout drivers Boaz Harrosh
2011-05-22 19:40   ` Benny Halevy
2011-05-22 23:25     ` Benny Halevy
2011-05-23  4:22     ` Boaz Harrosh
2011-05-23 14:54       ` Fred Isaman
2011-05-23 17:56         ` Boaz Harrosh
2011-05-22 16:52 ` [PATCH 17/23] pnfs-obj: osd raid engine read/write implementation Boaz Harrosh
2011-05-22 16:52 ` [PATCH 18/23] pnfs: layoutreturn Boaz Harrosh
2011-05-22 16:52 ` [PATCH 19/23] pnfs: layoutret_on_setattr Boaz Harrosh
2011-05-22 16:53 ` [PATCH 20/23] pnfs: encode_layoutreturn Boaz Harrosh
2011-05-22 16:53 ` [PATCH 21/23] pnfs-obj: report errors and .encode_layoutreturn Implementation Boaz Harrosh
2011-05-22 16:53 ` [PATCH 22/23] pnfs: encode_layoutcommit Boaz Harrosh
2011-05-22 16:54 ` [PATCH 23/23] pnfs-obj: objlayout_encode_layoutcommit implementation Boaz Harrosh

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=1306082882-10730-1-git-send-email-bharrosh@panasas.com \
    --to=bharrosh@panasas.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=bhalevy@panasas.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=osd-dev@open-osd.org \
    /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.