linux/fs/nfs
David Howells c902ce1bfb FS-Cache: Add a helper to bulk uncache pages on an inode
Add an FS-Cache helper to bulk uncache pages on an inode.  This will
only work for the circumstance where the pages in the cache correspond
1:1 with the pages attached to an inode's page cache.

This is required for CIFS and NFS: When disabling inode cookie, we were
returning the cookie and setting cifsi->fscache to NULL but failed to
invalidate any previously mapped pages.  This resulted in "Bad page
state" errors and manifested in other kind of errors when running
fsstress.  Fix it by uncaching mapped pages when we disable the inode
cookie.

This patch should fix the following oops and "Bad page state" errors
seen during fsstress testing.

  ------------[ cut here ]------------
  kernel BUG at fs/cachefiles/namei.c:201!
  invalid opcode: 0000 [#1] SMP
  Pid: 5, comm: kworker/u:0 Not tainted 2.6.38.7-30.fc15.x86_64 #1 Bochs Bochs
  RIP: 0010: cachefiles_walk_to_object+0x436/0x745 [cachefiles]
  RSP: 0018:ffff88002ce6dd00  EFLAGS: 00010282
  RAX: ffff88002ef165f0 RBX: ffff88001811f500 RCX: 0000000000000000
  RDX: 0000000000000000 RSI: 0000000000000100 RDI: 0000000000000282
  RBP: ffff88002ce6dda0 R08: 0000000000000100 R09: ffffffff81b3a300
  R10: 0000ffff00066c0a R11: 0000000000000003 R12: ffff88002ae54840
  R13: ffff88002ae54840 R14: ffff880029c29c00 R15: ffff88001811f4b0
  FS:  00007f394dd32720(0000) GS:ffff88002ef00000(0000) knlGS:0000000000000000
  CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
  CR2: 00007fffcb62ddf8 CR3: 000000001825f000 CR4: 00000000000006e0
  DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
  DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
  Process kworker/u:0 (pid: 5, threadinfo ffff88002ce6c000, task ffff88002ce55cc0)
  Stack:
   0000000000000246 ffff88002ce55cc0 ffff88002ce6dd58 ffff88001815dc00
   ffff8800185246c0 ffff88001811f618 ffff880029c29d18 ffff88001811f380
   ffff88002ce6dd50 ffffffff814757e4 ffff88002ce6dda0 ffffffff8106ac56
  Call Trace:
   cachefiles_lookup_object+0x78/0xd4 [cachefiles]
   fscache_lookup_object+0x131/0x16d [fscache]
   fscache_object_work_func+0x1bc/0x669 [fscache]
   process_one_work+0x186/0x298
   worker_thread+0xda/0x15d
   kthread+0x84/0x8c
   kernel_thread_helper+0x4/0x10
  RIP  cachefiles_walk_to_object+0x436/0x745 [cachefiles]
  ---[ end trace 1d481c9af1804caa ]---

I tested the uncaching by the following means:

 (1) Create a big file on my NFS server (104857600 bytes).

 (2) Read the file into the cache with md5sum on the NFS client.  Look in
     /proc/fs/fscache/stats:

	Pages  : mrk=25601 unc=0

 (3) Open the file for read/write ("bash 5<>/warthog/bigfile").  Look in proc
     again:

	Pages  : mrk=25601 unc=25601

Reported-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-and-Tested-by: Suresh Jayaraman <sjayaraman@suse.de>
cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-07-07 13:21:56 -07:00
..
objlayout NFSv4.1: Fix some issues with pnfs_generic_pg_test 2011-06-21 11:54:05 -04:00
cache_lib.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
cache_lib.h NFS: Add a dns resolver for use with NFSv4 referrals and migration 2009-08-19 18:22:15 -04:00
callback_proc.c pnfs: Use byte-range for cb_layoutrecall 2011-05-29 20:52:34 +03:00
callback_xdr.c pnfs: CB_NOTIFY_DEVICEID 2011-05-29 20:52:31 +03:00
callback.c NFS do not find client in NFSv4 pg_authenticate 2011-01-25 15:26:51 -05:00
callback.h pnfs: CB_NOTIFY_DEVICEID 2011-05-29 20:52:31 +03:00
client.c NFSv4.1: purge deviceid cache on nfs_free_client 2011-05-29 20:50:42 +03:00
delegation.c nfs,rcu: convert call_rcu(nfs_free_delegation_callback) to kfree_rcu() 2011-05-27 17:42:46 -04:00
delegation.h NFS: Move cl_delegations to the nfs_server struct 2011-01-06 14:57:46 -05:00
dir.c Merge branch 'pnfs-submit' of git://git.open-osd.org/linux-open-osd 2011-05-29 14:10:13 -07:00
direct.c NFS: account direct-io into task io accounting 2011-03-11 15:39:27 -05:00
dns_resolve.c sunrpc: use seconds since boot in expiry cache 2010-09-07 19:21:20 -04:00
dns_resolve.h NFS: Use kernel DNS resolver [ver #2] 2010-08-11 17:11:28 +00:00
file.c Fix common misspellings 2011-03-31 11:26:23 -03:00
fscache-index.c NFS: Add read context retention for FS-Cache to call back with 2009-04-03 16:42:44 +01:00
fscache.c FS-Cache: Add a helper to bulk uncache pages on an inode 2011-07-07 13:21:56 -07:00
fscache.h NFS: Propagate 'fsc' mount option through automounts 2009-09-23 14:36:39 -04:00
getroot.c Merge branch 'nfs-for-2.6.39' into nfs-for-next 2011-03-24 17:03:14 -04:00
idmap.c NFSv4: Send unmapped uid/gids to the server when using auth_sys 2011-03-11 15:39:27 -05:00
inode.c NFSv4.1: allow nfs_fhget to succeed with mounted on fileid 2011-06-15 11:24:29 -04:00
internal.h NFSv4.1: allow nfs_fhget to succeed with mounted on fileid 2011-06-15 11:24:29 -04:00
iostat.h NFS: Squelch compiler warning in nfs_add_server_stats() 2010-05-14 15:09:31 -04:00
Kconfig pnfs-obj: objlayoutdriver module skeleton 2011-05-29 20:52:35 +03:00
Makefile pnfs-obj: objlayoutdriver module skeleton 2011-05-29 20:52:35 +03:00
mount_clnt.c NFS: Remove redundant unlikely() 2010-12-21 11:51:23 -05:00
namespace.c NFS: Remove unused argument from nfs_find_best_sec() 2011-04-12 19:34:23 -04:00
nfs2xdr.c Merge branch 'bugfixes' into nfs-for-2.6.38 2011-01-10 14:48:02 -05:00
nfs3acl.c NFS: Prevent memory allocation failure in nfsacl_encode() 2011-01-25 15:24:47 -05:00
nfs3proc.c NFS: lookup supports alternate client 2011-03-24 13:52:41 -04:00
nfs3xdr.c NFS: Fix "kernel BUG at fs/nfs/nfs3xdr.c:1338!" 2011-01-25 15:24:47 -05:00
nfs4_fs.h NFSv4.1: Don't loop forever in nfs4_proc_create_session 2011-04-24 14:28:18 -04:00
nfs4filelayout.c NFSv4.1: file layout must consider pg_bsize for coalescing 2011-06-20 16:12:26 -04:00
nfs4filelayout.h NFSv4.1: purge deviceid cache on nfs_free_client 2011-05-29 20:50:42 +03:00
nfs4filelayoutdev.c SUNRPC: introduce xdr_init_decode_pages 2011-05-29 20:52:32 +03:00
nfs4namespace.c nfs: nfs_do_{ref,sub}mount() superblock argument is redundant 2011-03-16 16:48:06 -04:00
nfs4proc.c nfs4.1: fix several problems with _pnfs_return_layout 2011-06-15 11:24:30 -04:00
nfs4renewd.c NFSv4.1: new flag for state renewal check 2011-03-11 15:38:41 -05:00
nfs4state.c NFSv4.1: Fix the handling of NFS4ERR_SEQ_MISORDERED errors 2011-05-27 17:42:01 -04:00
nfs4xdr.c NFS: Fix decode_secinfo_maxsz 2011-06-21 11:54:07 -04:00
nfsroot.c NFS: Revert NFSROOT default mount options 2011-05-27 17:42:47 -04:00
pagelist.c NFSv4.1: file layout must consider pg_bsize for coalescing 2011-06-20 16:12:26 -04:00
pnfs_dev.c NFSv4.1: Fix a refcounting issue in the pNFS device id cache 2011-06-15 11:24:29 -04:00
pnfs.c NFSv4.1: Fix an off-by-one error in pnfs_generic_pg_test 2011-06-21 11:54:06 -04:00
pnfs.h NFS: fix umount of pnfs filesystems 2011-06-15 11:23:02 -04:00
proc.c NFS: lookup supports alternate client 2011-03-24 13:52:41 -04:00
read.c NFSv4.1: unify pnfs_pageio_init functions 2011-05-29 20:56:43 +03:00
super.c pnfs: client stats 2011-05-29 20:52:34 +03:00
symlink.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
sysctl.c NFS: new idmapper 2010-10-07 18:48:49 -04:00
unlink.c nfs: store devname at disconnected NFS roots 2011-03-16 16:44:24 -04:00
write.c NFSv4.1: unify pnfs_pageio_init functions 2011-05-29 20:56:43 +03:00