From: Jim Rees <rees@umich.edu>
To: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: linux-nfs@vger.kernel.org, peter honeyman <honey@citi.umich.edu>
Subject: [PATCH v6 18/26] pnfsblock: bl_find_get_extent
Date: Sat, 30 Jul 2011 13:08:41 -0400 [thread overview]
Message-ID: <1312045729-27554-19-git-send-email-rees@umich.edu> (raw)
In-Reply-To: <1312045729-27554-1-git-send-email-rees@umich.edu>
=46rom: Fred Isaman <iisaman@citi.umich.edu>
Implement bl_find_get_extent(), one of the core extent manipulation
routines.
[pnfsblock: Lookup list entry of layouts and tags in reverse order]
Signed-off-by: Zhang Jingwang <zhangjingwang-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
Signed-off-by: Fred Isaman <iisaman@citi.umich.edu>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
pnfsblock: fix print format warnings for sector_t and size_t
gcc spews warnings about these on x86_64, e.g.:
fs/nfs/blocklayout/blocklayout.c:74: warning: format =E2=80=98%Lu=E2=80=
=99 expects type =E2=80=98long long unsigned int=E2=80=99, but argument=
2 has type =E2=80=98sector_t=E2=80=99
fs/nfs/blocklayout/blocklayout.c:388: warning: format =E2=80=98%d=E2=80=
=99 expects type =E2=80=98int=E2=80=99, but argument 5 has type =E2=80=98=
size_t=E2=80=99
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@tonian.com>
---
fs/nfs/blocklayout/blocklayout.h | 3 ++
fs/nfs/blocklayout/extents.c | 47 ++++++++++++++++++++++++++++++=
++++++++
2 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/bloc=
klayout.h
index d645880..3e1b5fc 100644
--- a/fs/nfs/blocklayout/blocklayout.h
+++ b/fs/nfs/blocklayout/blocklayout.h
@@ -153,6 +153,9 @@ int nfs4_blk_process_layoutget(struct pnfs_layout_h=
dr *lo,
void bl_free_block_dev(struct pnfs_block_dev *bdev);
=20
/* extents.c */
+struct pnfs_block_extent *
+bl_find_get_extent(struct pnfs_block_layout *bl, sector_t isect,
+ struct pnfs_block_extent **cow_read);
void bl_put_extent(struct pnfs_block_extent *be);
struct pnfs_block_extent *bl_alloc_extent(void);
int bl_add_merge_extent(struct pnfs_block_layout *bl,
diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.=
c
index ee4891f..8fa93e2 100644
--- a/fs/nfs/blocklayout/extents.c
+++ b/fs/nfs/blocklayout/extents.c
@@ -193,3 +193,50 @@ bl_add_merge_extent(struct pnfs_block_layout *bl,
bl_put_extent(new);
return -EIO;
}
+
+/* Returns extent, or NULL. If a second READ extent exists, it is ret=
urned
+ * in cow_read, if given.
+ *
+ * The extents are kept in two seperate ordered lists, one for READ an=
d NONE,
+ * one for READWRITE and INVALID. Within each list, we assume:
+ * 1. Extents are ordered by file offset.
+ * 2. For any given isect, there is at most one extents that matches.
+ */
+struct pnfs_block_extent *
+bl_find_get_extent(struct pnfs_block_layout *bl, sector_t isect,
+ struct pnfs_block_extent **cow_read)
+{
+ struct pnfs_block_extent *be, *cow, *ret;
+ int i;
+
+ dprintk("%s enter with isect %llu\n", __func__, (u64)isect);
+ cow =3D ret =3D NULL;
+ spin_lock(&bl->bl_ext_lock);
+ for (i =3D 0; i < EXTENT_LISTS; i++) {
+ list_for_each_entry_reverse(be, &bl->bl_extents[i], be_node) {
+ if (isect >=3D be->be_f_offset + be->be_length)
+ break;
+ if (isect >=3D be->be_f_offset) {
+ /* We have found an extent */
+ dprintk("%s Get %p (%i)\n", __func__, be,
+ atomic_read(&be->be_refcnt.refcount));
+ kref_get(&be->be_refcnt);
+ if (!ret)
+ ret =3D be;
+ else if (be->be_state !=3D PNFS_BLOCK_READ_DATA)
+ bl_put_extent(be);
+ else
+ cow =3D be;
+ break;
+ }
+ }
+ if (ret &&
+ (!cow_read || ret->be_state !=3D PNFS_BLOCK_INVALID_DATA))
+ break;
+ }
+ spin_unlock(&bl->bl_ext_lock);
+ if (cow_read)
+ *cow_read =3D cow;
+ print_bl_extent(ret);
+ return ret;
+}
--=20
1.7.4.1
next prev parent reply other threads:[~2011-07-30 17:09 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-30 17:08 [PATCH v6 00/26] add block layout driver to pnfs client Jim Rees
2011-07-30 17:08 ` [PATCH v6 01/26] pnfs: save layoutcommit lwb at layout header Jim Rees
2011-07-30 17:08 ` [PATCH v6 02/26] pnfs: save layoutcommit cred at layout header init Jim Rees
2011-07-30 17:08 ` [PATCH v6 03/26] pnfs: let layoutcommit handle a list of lseg Jim Rees
2011-07-30 17:08 ` [PATCH v6 04/26] pnfs: use lwb as layoutcommit length Jim Rees
2011-07-30 17:08 ` [PATCH v6 05/26] pnfs: GETDEVICELIST Jim Rees
2011-07-30 17:08 ` [PATCH v6 06/26] pnfs: add set-clear layoutdriver interface Jim Rees
2011-07-30 17:08 ` [PATCH v6 07/26] pnfs: ask for layout_blksize and save it in nfs_server Jim Rees
2011-07-30 17:08 ` [PATCH v6 08/26] pnfs: cleanup_layoutcommit Jim Rees
2011-07-30 17:08 ` [PATCH v6 09/26] pnfsblock: add blocklayout Kconfig option, Makefile, and stubs Jim Rees
2011-07-30 17:08 ` [PATCH v6 10/26] pnfsblock: use pageio_ops api Jim Rees
2011-07-30 17:08 ` [PATCH v6 11/26] pnfsblock: basic extent code Jim Rees
2011-07-30 17:08 ` [PATCH v6 12/26] pnfsblock: add device operations Jim Rees
2011-07-30 17:08 ` [PATCH v6 13/26] pnfsblock: remove " Jim Rees
2011-07-30 17:08 ` [PATCH v6 14/26] pnfsblock: lseg alloc and free Jim Rees
2011-07-30 17:08 ` [PATCH v6 15/26] pnfsblock: merge extents Jim Rees
2011-07-30 17:08 ` [PATCH v6 16/26] pnfsblock: call and parse getdevicelist Jim Rees
2011-07-30 17:08 ` [PATCH v6 17/26] pnfsblock: xdr decode pnfs_block_layout4 Jim Rees
2011-07-30 17:08 ` Jim Rees [this message]
2011-07-30 17:08 ` [PATCH v6 19/26] pnfsblock: add extent manipulation functions Jim Rees
2011-07-30 17:08 ` [PATCH v6 20/26] pnfsblock: merge rw extents Jim Rees
2011-07-30 17:08 ` [PATCH v6 21/26] pnfsblock: encode_layoutcommit Jim Rees
2011-07-30 17:08 ` [PATCH v6 22/26] pnfsblock: cleanup_layoutcommit Jim Rees
2011-07-30 17:08 ` [PATCH v6 23/26] pnfsblock: bl_read_pagelist Jim Rees
2011-07-30 17:08 ` [PATCH v6 24/26] pnfsblock: bl_write_pagelist Jim Rees
2011-07-30 17:08 ` [PATCH v6 25/26] pnfsblock: note written INVAL areas for layoutcommit Jim Rees
2011-07-30 17:08 ` [PATCH v6 26/26] pnfsblock: write_pagelist handle zero invalid extents Jim Rees
2011-07-30 18:41 ` [PATCH v6 00/26] add block layout driver to pnfs client Trond Myklebust
[not found] ` <1312051292.26265.3.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
2011-07-30 18:54 ` Sorin Faibish
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=1312045729-27554-19-git-send-email-rees@umich.edu \
--to=rees@umich.edu \
--cc=Trond.Myklebust@netapp.com \
--cc=honey@citi.umich.edu \
--cc=linux-nfs@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).