2008-05-27 20:30:01

by Chuck Lever III

[permalink] [raw]
Subject: [PATCH 4/7] NFS: Add debugging facility for NFS aops

Recent work in fs/nfs/file.c neglected to add appropriate trace debugging
for the NFS client's address space operations.

Signed-off-by: Chuck Lever <[email protected]>
---

fs/nfs/file.c | 29 ++++++++++++++++++++++++++++-
1 files changed, 28 insertions(+), 1 deletions(-)


diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index c3e7af0..c872ce4 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -333,11 +333,17 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata)
{
+ struct dentry *dentry = file->f_path.dentry;
+ struct inode *inode = mapping->host;
int ret;
pgoff_t index;
struct page *page;
index = pos >> PAGE_CACHE_SHIFT;

+ dfprintk(PAGECACHE, "NFS: write_begin(%s/%s(%ld), %[email protected]%lld)\n",
+ dentry->d_parent->d_name.name, dentry->d_name.name,
+ inode->i_ino, len, (long long) pos);
+
page = __grab_cache_page(mapping, index);
if (!page)
return -ENOMEM;
@@ -355,9 +361,15 @@ static int nfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata)
{
+ struct dentry *dentry = file->f_path.dentry;
+ struct inode *inode = mapping->host;
unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
int status;

+ dfprintk(PAGECACHE, "NFS: write_end(%s/%s(%ld), %[email protected]%lld)\n",
+ dentry->d_parent->d_name.name, dentry->d_name.name,
+ inode->i_ino, len, (long long) pos);
+
lock_kernel();
status = nfs_updatepage(file, page, offset, copied);
unlock_kernel();
@@ -372,6 +384,8 @@ static int nfs_write_end(struct file *file, struct address_space *mapping,

static void nfs_invalidate_page(struct page *page, unsigned long offset)
{
+ dfprintk(PAGECACHE, "NFS: invalidate_page(%p, %lu)\n", page, offset);
+
if (offset != 0)
return;
/* Cancel any unstarted writes on this page */
@@ -380,13 +394,20 @@ static void nfs_invalidate_page(struct page *page, unsigned long offset)

static int nfs_release_page(struct page *page, gfp_t gfp)
{
+ dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
+
/* If PagePrivate() is set, then the page is not freeable */
return 0;
}

static int nfs_launder_page(struct page *page)
{
- return nfs_wb_page(page->mapping->host, page);
+ struct inode *inode = page->mapping->host;
+
+ dfprintk(PAGECACHE, "NFS: launder_page(%ld, %llu)\n",
+ inode->i_ino, (long long)page_offset(page));
+
+ return nfs_wb_page(inode, page);
}

const struct address_space_operations nfs_file_aops = {
@@ -406,10 +427,16 @@ const struct address_space_operations nfs_file_aops = {
static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
{
struct file *filp = vma->vm_file;
+ struct dentry *dentry = filp->f_path.dentry;
unsigned pagelen;
int ret = -EINVAL;
struct address_space *mapping;

+ dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%s/%s(%ld), offset %lld)\n",
+ dentry->d_parent->d_name.name, dentry->d_name.name,
+ filp->f_mapping->host->i_ino,
+ (long long)page_offset(page));
+
lock_page(page);
mapping = page->mapping;
if (mapping != vma->vm_file->f_path.dentry->d_inode->i_mapping)



2008-06-10 18:30:38

by Myklebust, Trond

[permalink] [raw]
Subject: Re: [PATCH 4/7] NFS: Add debugging facility for NFS aops

On Tue, 2008-05-27 at 16:29 -0400, Chuck Lever wrote:
> Recent work in fs/nfs/file.c neglected to add appropriate trace debug=
ging
> for the NFS client's address space operations.
>=20
> Signed-off-by: Chuck Lever <[email protected]>
> ---
>=20
> fs/nfs/file.c | 29 ++++++++++++++++++++++++++++-
> 1 files changed, 28 insertions(+), 1 deletions(-)
>=20
>=20
> diff --git a/fs/nfs/file.c b/fs/nfs/file.c
> index c3e7af0..c872ce4 100644
> --- a/fs/nfs/file.c
> +++ b/fs/nfs/file.c
> @@ -333,11 +333,17 @@ static int nfs_write_begin(struct file *file, s=
truct address_space *mapping,
> loff_t pos, unsigned len, unsigned flags,
> struct page **pagep, void **fsdata)
> {
> + struct dentry *dentry =3D file->f_path.dentry;
> + struct inode *inode =3D mapping->host;
> int ret;
> pgoff_t index;
> struct page *page;
> index =3D pos >> PAGE_CACHE_SHIFT;
> =20
> + dfprintk(PAGECACHE, "NFS: write_begin(%s/%s(%ld), %[email protected]%lld)\n",
> + dentry->d_parent->d_name.name, dentry->d_name.name,
> + inode->i_ino, len, (long long) pos);
> +

This will result in 'unused variable' warnings for 'dentry' and 'inode'
if you compile with #undef RPC_DEBUG.

> page =3D __grab_cache_page(mapping, index);
> if (!page)
> return -ENOMEM;
> @@ -355,9 +361,15 @@ static int nfs_write_end(struct file *file, stru=
ct address_space *mapping,
> loff_t pos, unsigned len, unsigned copied,
> struct page *page, void *fsdata)
> {
> + struct dentry *dentry =3D file->f_path.dentry;
> + struct inode *inode =3D mapping->host;
> unsigned offset =3D pos & (PAGE_CACHE_SIZE - 1);
> int status;
> =20
> + dfprintk(PAGECACHE, "NFS: write_end(%s/%s(%ld), %[email protected]%lld)\n",
> + dentry->d_parent->d_name.name, dentry->d_name.name,
> + inode->i_ino, len, (long long) pos);
> +

=EF=BB=BFThis will result in 'unused variable' warnings for 'dentry' an=
d 'inode'
if you compile with #undef RPC_DEBUG.

> lock_kernel();
> status =3D nfs_updatepage(file, page, offset, copied);
> unlock_kernel();
> @@ -372,6 +384,8 @@ static int nfs_write_end(struct file *file, struc=
t address_space *mapping,
> =20
> static void nfs_invalidate_page(struct page *page, unsigned long off=
set)
> {
> + dfprintk(PAGECACHE, "NFS: invalidate_page(%p, %lu)\n", page, offset=
);
> +
> if (offset !=3D 0)
> return;
> /* Cancel any unstarted writes on this page */
> @@ -380,13 +394,20 @@ static void nfs_invalidate_page(struct page *pa=
ge, unsigned long offset)
> =20
> static int nfs_release_page(struct page *page, gfp_t gfp)
> {
> + dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
> +
> /* If PagePrivate() is set, then the page is not freeable */
> return 0;
> }
> =20
> static int nfs_launder_page(struct page *page)
> {
> - return nfs_wb_page(page->mapping->host, page);
> + struct inode *inode =3D page->mapping->host;
> +
> + dfprintk(PAGECACHE, "NFS: launder_page(%ld, %llu)\n",
> + inode->i_ino, (long long)page_offset(page));
> +
> + return nfs_wb_page(inode, page);
> }
> =20
> const struct address_space_operations nfs_file_aops =3D {
> @@ -406,10 +427,16 @@ const struct address_space_operations nfs_file_=
aops =3D {
> static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct pa=
ge *page)
> {
> struct file *filp =3D vma->vm_file;
> + struct dentry *dentry =3D filp->f_path.dentry;
> unsigned pagelen;
> int ret =3D -EINVAL;
> struct address_space *mapping;
> =20
> + dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%s/%s(%ld), offset %lld)\=
n",
> + dentry->d_parent->d_name.name, dentry->d_name.name,
> + filp->f_mapping->host->i_ino,
> + (long long)page_offset(page));
> +

=EF=BB=BFThis will result in 'unused variable' warnings for 'dentry' if=
you
compile with #undef RPC_DEBUG.

> lock_page(page);
> mapping =3D page->mapping;
> if (mapping !=3D vma->vm_file->f_path.dentry->d_inode->i_mapping)
>=20
--=20
Trond Myklebust
Linux NFS client maintainer

NetApp
[email protected]
http://www.netapp.com