1. 20 3月, 2008 3 次提交
  2. 06 3月, 2008 1 次提交
    • E
      NFS: use new LSM interfaces to explicitly set mount options · f9c3a380
      Eric Paris 提交于
      NFS and SELinux worked together previously because SELinux had NFS
      specific knowledge built in.  This design was approved by both groups
      back in 2004 but the recent NFS changes to use nfs_parsed_mount_data and
      the usage of nfs_clone_mount_data showed this to be a poor fragile
      solution.  This patch fixes the NFS functionality regression by making
      use of the new LSM interfaces to allow an FS to explicitly set its own
      mount options.
      
      The explicit setting of mount options is done in the nfs get_sb
      functions which are called before the generic vfs hooks try to set mount
      options for filesystems which use text mount data.
      
      This does not currently support NFSv4 as that functionality did not
      exist in previous kernels and thus there is no regression.  I will be
      adding the needed code, which I believe to be the exact same as the v3
      code, in nfs4_get_sb for 2.6.26.
      Signed-off-by: NEric Paris <eparis@redhat.com>
      Acked-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      Signed-off-by: NJames Morris <jmorris@namei.org>
      f9c3a380
  3. 26 2月, 2008 1 次提交
    • T
      NFS: Add an nfsiod workqueue · 5746006f
      Trond Myklebust 提交于
      NFS post-rpciod cleanups often involve tasks that cannot be safely
      performed within the rpciod context (due to deadlock concerns). We
      therefore add a dedicated NFS workqueue that can perform tasks like
      cleaning up state after an interrupted NFSv4 open() call, or calling
      put_nfs_open_context() after an asynchronous read or write call.
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      5746006f
  4. 30 1月, 2008 7 次提交
  5. 10 10月, 2007 3 次提交
  6. 11 7月, 2007 1 次提交
  7. 01 5月, 2007 1 次提交
  8. 04 2月, 2007 1 次提交
  9. 06 12月, 2006 1 次提交
  10. 21 10月, 2006 1 次提交
  11. 23 9月, 2006 6 次提交
    • D
      NFS: Add server and volume lists to /proc · 6aaca566
      David Howells 提交于
      Make two new proc files available:
      
      	/proc/fs/nfsfs/servers
      	/proc/fs/nfsfs/volumes
      
      The first lists the servers with which we are currently dealing (struct
      nfs_client), and the second lists the volumes we have on those servers (struct
      nfs_server).
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      6aaca566
    • D
      NFS: Share NFS superblocks per-protocol per-server per-FSID · 54ceac45
      David Howells 提交于
      The attached patch makes NFS share superblocks between mounts from the same
      server and FSID over the same protocol.
      
      It does this by creating each superblock with a false root and returning the
      real root dentry in the vfsmount presented by get_sb(). The root dentry set
      starts off as an anonymous dentry if we don't already have the dentry for its
      inode, otherwise it simply returns the dentry we already have.
      
      We may thus end up with several trees of dentries in the superblock, and if at
      some later point one of anonymous tree roots is discovered by normal filesystem
      activity to be located in another tree within the superblock, the anonymous
      root is named and materialises attached to the second tree at the appropriate
      point.
      
      Why do it this way? Why not pass an extra argument to the mount() syscall to
      indicate the subpath and then pathwalk from the server root to the desired
      directory? You can't guarantee this will work for two reasons:
      
       (1) The root and intervening nodes may not be accessible to the client.
      
           With NFS2 and NFS3, for instance, mountd is called on the server to get
           the filehandle for the tip of a path. mountd won't give us handles for
           anything we don't have permission to access, and so we can't set up NFS
           inodes for such nodes, and so can't easily set up dentries (we'd have to
           have ghost inodes or something).
      
           With this patch we don't actually create dentries until we get handles
           from the server that we can use to set up their inodes, and we don't
           actually bind them into the tree until we know for sure where they go.
      
       (2) Inaccessible symbolic links.
      
           If we're asked to mount two exports from the server, eg:
      
      	mount warthog:/warthog/aaa/xxx /mmm
      	mount warthog:/warthog/bbb/yyy /nnn
      
           We may not be able to access anything nearer the root than xxx and yyy,
           but we may find out later that /mmm/www/yyy, say, is actually the same
           directory as the one mounted on /nnn. What we might then find out, for
           example, is that /warthog/bbb was actually a symbolic link to
           /warthog/aaa/xxx/www, but we can't actually determine that by talking to
           the server until /warthog is made available by NFS.
      
           This would lead to having constructed an errneous dentry tree which we
           can't easily fix. We can end up with a dentry marked as a directory when
           it should actually be a symlink, or we could end up with an apparently
           hardlinked directory.
      
           With this patch we need not make assumptions about the type of a dentry
           for which we can't retrieve information, nor need we assume we know its
           place in the grand scheme of things until we actually see that place.
      
      This patch reduces the possibility of aliasing in the inode and page caches for
      inodes that may be accessed by more than one NFS export. It also reduces the
      number of superblocks required for NFS where there are many NFS exports being
      used from a server (home directory server + autofs for example).
      
      This in turn makes it simpler to do local caching of network filesystems, as it
      can then be guaranteed that there won't be links from multiple inodes in
      separate superblocks to the same cache file.
      
      Obviously, cache aliasing between different levels of NFS protocol could still
      be a problem, but at least that gives us another key to use when indexing the
      cache.
      
      This patch makes the following changes:
      
       (1) The server record construction/destruction has been abstracted out into
           its own set of functions to make things easier to get right.  These have
           been moved into fs/nfs/client.c.
      
           All the code in fs/nfs/client.c has to do with the management of
           connections to servers, and doesn't touch superblocks in any way; the
           remaining code in fs/nfs/super.c has to do with VFS superblock management.
      
       (2) The sequence of events undertaken by NFS mount is now reordered:
      
           (a) A volume representation (struct nfs_server) is allocated.
      
           (b) A server representation (struct nfs_client) is acquired.  This may be
           	 allocated or shared, and is keyed on server address, port and NFS
           	 version.
      
           (c) If allocated, the client representation is initialised.  The state
           	 member variable of nfs_client is used to prevent a race during
           	 initialisation from two mounts.
      
           (d) For NFS4 a simple pathwalk is performed, walking from FH to FH to find
           	 the root filehandle for the mount (fs/nfs/getroot.c).  For NFS2/3 we
           	 are given the root FH in advance.
      
           (e) The volume FSID is probed for on the root FH.
      
           (f) The volume representation is initialised from the FSINFO record
           	 retrieved on the root FH.
      
           (g) sget() is called to acquire a superblock.  This may be allocated or
           	 shared, keyed on client pointer and FSID.
      
           (h) If allocated, the superblock is initialised.
      
           (i) If the superblock is shared, then the new nfs_server record is
           	 discarded.
      
           (j) The root dentry for this mount is looked up from the root FH.
      
           (k) The root dentry for this mount is assigned to the vfsmount.
      
       (3) nfs_readdir_lookup() creates dentries for each of the entries readdir()
           returns; this function now attaches disconnected trees from alternate
           roots that happen to be discovered attached to a directory being read (in
           the same way nfs_lookup() is made to do for lookup ops).
      
           The new d_materialise_unique() function is now used to do this, thus
           permitting the whole thing to be done under one set of locks, and thus
           avoiding any race between mount and lookup operations on the same
           directory.
      
       (4) The client management code uses a new debug facility: NFSDBG_CLIENT which
           is set by echoing 1024 to /proc/net/sunrpc/nfs_debug.
      
       (5) Clone mounts are now called xdev mounts.
      
       (6) Use the dentry passed to the statfs() op as the handle for retrieving fs
           statistics rather than the root dentry of the superblock (which is now a
           dummy).
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      54ceac45
    • D
      NFS: Eliminate client_sys in favour of cl_rpcclient · 5006a76c
      David Howells 提交于
      Eliminate nfs_server::client_sys in favour of nfs_client::cl_rpcclient as we
      only really need one per server that we're talking to since it doesn't have any
      security on it.
      
      The retransmission management variables are also moved to the common struct as
      they're required to set up the cl_rpcclient connection.
      
      The NFS2/3 client and client_acl connections are thenceforth derived by cloning
      the cl_rpcclient connection and post-applying the authorisation flavour.
      
      The code for setting up the initial common connection has been moved to
      client.c as nfs_create_rpc_client().  All the NFS program definition tables are
      also moved there as that's where they're now required rather than super.c.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      5006a76c
    • D
      NFS: Generalise the nfs_client structure · 24c8dbbb
      David Howells 提交于
      Generalise the nfs_client structure by:
      
       (1) Moving nfs_client to a more general place (nfs_fs_sb.h).
      
       (2) Renaming its maintenance routines to be non-NFS4 specific.
      
       (3) Move those maintenance routines to a new non-NFS4 specific file (client.c)
           and move the declarations to internal.h.
      
       (4) Make nfs_find/get_client() take a full sockaddr_in to include the port
           number (will be required for NFS2/3).
      
       (5) Make nfs_find/get_client() take the NFS protocol version (again will be
           required to differentiate NFS2, 3 & 4 client records).
      
      Also:
      
       (6) Make nfs_client construction proceed akin to inodes, marking them as under
           construction and providing a function to indicate completion.
      
       (7) Make nfs_get_client() wait interruptibly if it finds a client that it can
           share, but that client is currently being constructed.
      
       (8) Make nfs4_create_client() use (6) and (7) instead of locking cl_sem.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      24c8dbbb
    • D
      NFS: Fix up split of fs/nfs/inode.c · 7d4e2747
      David Howells 提交于
      Fix ups for the splitting of the superblock stuff out of fs/nfs/inode.c,
      including:
      
       (*) Move the callback tcpport module param into callback.c.
      
       (*) Move the idmap cache timeout module param into idmap.c.
      
       (*) Changes to internal.h:
      
           (*) namespace-nfs4.c was renamed to nfs4namespace.c.
      
           (*) nfs_stat_to_errno() is in nfs2xdr.c, not nfs4xdr.c.
      
           (*) nfs4xdr.c is contingent on CONFIG_NFS_V4.
      
           (*) nfs4_path() is only uses if CONFIG_NFS_V4 is set.
      
      Plus also:
      
       (*) The sec_flavours[] table should really be const.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      7d4e2747
    • T
      NFS: Add an ACCESS cache memory shrinker · 979df72e
      Trond Myklebust 提交于
      A pinned inode may in theory end up filling memory with cached ACCESS
      calls. This patch ensures that the VM may shrink away the cache in these
      particular cases.
      The shrinker works by iterating through the list of inodes on the global
      nfs_access_lru_list, and removing the least recently used access
      cache entry until it is done (or until the entire cache is empty).
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      979df72e
  12. 03 7月, 2006 1 次提交
  13. 28 6月, 2006 1 次提交
  14. 25 6月, 2006 1 次提交
    • A
      git-nfs-build-fixes · d75d5414
      Andrew Morton 提交于
      Fix various problems with nfs4 disabled.  And various other things.
      
      In file included from fs/nfs/inode.c:50:
      fs/nfs/internal.h:24: error: static declaration of 'nfs_do_refmount' follows non-static declaration
      include/linux/nfs_fs.h:320: error: previous declaration of 'nfs_do_refmount' was here
      fs/nfs/internal.h:65: warning: 'struct nfs4_fs_locations' declared inside parameter list
      fs/nfs/internal.h:65: warning: its scope is only this definition or declaration, which is probably not what you want
      fs/nfs/internal.h: In function 'nfs4_path':
      fs/nfs/internal.h:97: error: 'struct nfs_server' has no member named 'mnt_path'
      fs/nfs/inode.c: In function 'init_once':
      fs/nfs/inode.c:1116: error: 'struct nfs_inode' has no member named 'open_states'
      fs/nfs/inode.c:1116: error: 'struct nfs_inode' has no member named 'delegation'
      fs/nfs/inode.c:1116: error: 'struct nfs_inode' has no member named 'delegation_state'
      fs/nfs/inode.c:1116: error: 'struct nfs_inode' has no member named 'rwsem'
      distcc[26452] ERROR: compile fs/nfs/inode.c on g5/64 failed
      make[1]: *** [fs/nfs/inode.o] Error 1
      make: *** [fs/nfs/inode.o] Error 2
      make: *** Waiting for unfinished jobs....
      In file included from fs/nfs/nfs3xdr.c:26:
      fs/nfs/internal.h:24: error: static declaration of 'nfs_do_refmount' follows non-static declaration
      include/linux/nfs_fs.h:320: error: previous declaration of 'nfs_do_refmount' was here
      fs/nfs/internal.h:65: warning: 'struct nfs4_fs_locations' declared inside parameter list
      fs/nfs/internal.h:65: warning: its scope is only this definition or declaration, which is probably not what you want
      fs/nfs/internal.h: In function 'nfs4_path':
      fs/nfs/internal.h:97: error: 'struct nfs_server' has no member named 'mnt_path'
      distcc[26486] ERROR: compile fs/nfs/nfs3xdr.c on g5/64 failed
      make[1]: *** [fs/nfs/nfs3xdr.o] Error 1
      make: *** [fs/nfs/nfs3xdr.o] Error 2
      In file included from fs/nfs/nfs3proc.c:24:
      fs/nfs/internal.h:24: error: static declaration of 'nfs_do_refmount' follows non-static declaration
      include/linux/nfs_fs.h:320: error: previous declaration of 'nfs_do_refmount' was here
      fs/nfs/internal.h:65: warning: 'struct nfs4_fs_locations' declared inside parameter list
      fs/nfs/internal.h:65: warning: its scope is only this definition or declaration, which is probably not what you want
      fs/nfs/internal.h: In function 'nfs4_path':
      fs/nfs/internal.h:97: error: 'struct nfs_server' has no member named 'mnt_path'
      distcc[26469] ERROR: compile fs/nfs/nfs3proc.c on bix/32 failed
      make[1]: *** [fs/nfs/nfs3proc.o] Error 1
      make: *** [fs/nfs/nfs3proc.o] Error 2
      **FAILED**
      
      Cc: Alexey Dobriyan <adobriyan@gmail.com>
      Cc: Andreas Gruenbacher <agruen@suse.de>
      Cc: Andy Adamson <andros@citi.umich.edu>
      Cc: Chuck Lever <cel@netapp.com>
      Cc: David Howells <dhowells@redhat.com>
      Cc: J. Bruce Fields <bfields@fieldses.org>
      Cc: Manoj Naik <manoj@almaden.ibm.com>
      Cc: Marc Eshel <eshel@almaden.ibm.com>
      Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      d75d5414
  15. 09 6月, 2006 1 次提交
    • D
      NFS: Split fs/nfs/inode.c · f7b422b1
      David Howells 提交于
      As fs/nfs/inode.c is rather large, heterogenous and unwieldy, the attached
      patch splits it up into a number of files:
      
       (*) fs/nfs/inode.c
      
           Strictly inode specific functions.
      
       (*) fs/nfs/super.c
      
           Superblock management functions for NFS and NFS4, normal access, clones
           and referrals.  The NFS4 superblock functions _could_ move out into a
           separate conditionally compiled file, but it's probably not worth it as
           there're so many common bits.
      
       (*) fs/nfs/namespace.c
      
           Some namespace-specific functions have been moved here.
      
       (*) fs/nfs/nfs4namespace.c
      
           NFS4-specific namespace functions (this could be merged into the previous
           file).  This file is conditionally compiled.
      
       (*) fs/nfs/internal.h
      
           Inter-file declarations, plus a few simple utility functions moved from
           fs/nfs/inode.c.
      
           Additionally, all the in-.c-file externs have been moved here, and those
           files they were moved from now includes this file.
      
      For the most part, the functions have not been changed, only some multiplexor
      functions have changed significantly.
      
      I've also:
      
       (*) Added some extra banner comments above some functions.
      
       (*) Rearranged the function order within the files to be more logical and
           better grouped (IMO), though someone may prefer a different order.
      
       (*) Reduced the number of #ifdefs in .c files.
      
       (*) Added missing __init and __exit directives.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      f7b422b1