Merge git://git.linux-nfs.org/pub/linux/nfs-2.6
* git://git.linux-nfs.org/pub/linux/nfs-2.6: (51 commits) nfs: remove nfs_put_link() nfs-build-fix-99 git-nfs-build-fixes Merge branch 'odirect' NFS: alloc nfs_read/write_data as direct I/O is scheduled NFS: Eliminate nfs_get_user_pages() NFS: refactor nfs_direct_free_user_pages NFS: remove user_addr, user_count, and pos from nfs_direct_req NFS: "open code" the NFS direct write rescheduler NFS: Separate functions for counting outstanding NFS direct I/Os NLM: Fix reclaim races NLM: sem to mutex conversion locks.c: add the fl_owner to nlm_compare_locks NFS: Display the chosen RPCSEC_GSS security flavour in /proc/mounts NFS: Split fs/nfs/inode.c NFS: Fix typo in nfs_do_clone_mount() NFS: Fix compile errors introduced by referrals patches NFSv4: Ensure that referral mounts bind to a reserved port NFSv4: A root pathname is sent as a zero component4 NFSv4: Follow a referral ...
This commit is contained in:
@@ -1100,7 +1100,7 @@ struct super_operations {
|
||||
int (*statfs) (struct dentry *, struct kstatfs *);
|
||||
int (*remount_fs) (struct super_block *, int *, char *);
|
||||
void (*clear_inode) (struct inode *);
|
||||
void (*umount_begin) (struct super_block *);
|
||||
void (*umount_begin) (struct vfsmount *, int);
|
||||
|
||||
int (*show_options)(struct seq_file *, struct vfsmount *);
|
||||
int (*show_stats)(struct seq_file *, struct vfsmount *);
|
||||
@@ -1767,7 +1767,7 @@ extern struct inode_operations simple_dir_inode_operations;
|
||||
struct tree_descr { char *name; const struct file_operations *ops; int mode; };
|
||||
struct dentry *d_alloc_name(struct dentry *, const char *);
|
||||
extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
|
||||
extern int simple_pin_fs(char *name, struct vfsmount **mount, int *count);
|
||||
extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
|
||||
extern void simple_release_fs(struct vfsmount **mount, int *count);
|
||||
|
||||
extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t);
|
||||
|
||||
@@ -49,11 +49,12 @@ struct nlm_host {
|
||||
h_killed : 1,
|
||||
h_monitored : 1;
|
||||
wait_queue_head_t h_gracewait; /* wait while reclaiming */
|
||||
struct rw_semaphore h_rwsem; /* Reboot recovery lock */
|
||||
u32 h_state; /* pseudo-state counter */
|
||||
u32 h_nsmstate; /* true remote NSM state */
|
||||
u32 h_pidcount; /* Pseudopids */
|
||||
atomic_t h_count; /* reference count */
|
||||
struct semaphore h_sema; /* mutex for pmap binding */
|
||||
struct mutex h_mutex; /* mutex for pmap binding */
|
||||
unsigned long h_nextrebind; /* next portmap call */
|
||||
unsigned long h_expires; /* eligible for GC */
|
||||
struct list_head h_lockowners; /* Lockowners for the client */
|
||||
@@ -219,6 +220,7 @@ static __inline__ int
|
||||
nlm_compare_locks(const struct file_lock *fl1, const struct file_lock *fl2)
|
||||
{
|
||||
return fl1->fl_pid == fl2->fl_pid
|
||||
&& fl1->fl_owner == fl2->fl_owner
|
||||
&& fl1->fl_start == fl2->fl_start
|
||||
&& fl1->fl_end == fl2->fl_end
|
||||
&&(fl1->fl_type == fl2->fl_type || fl2->fl_type == F_UNLCK);
|
||||
|
||||
@@ -28,6 +28,8 @@ struct namespace;
|
||||
#define MNT_NOATIME 0x08
|
||||
#define MNT_NODIRATIME 0x10
|
||||
|
||||
#define MNT_SHRINKABLE 0x100
|
||||
|
||||
#define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */
|
||||
#define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */
|
||||
#define MNT_PNODE_MASK 0x3000 /* propogation flag mask */
|
||||
@@ -78,12 +80,18 @@ extern struct vfsmount *alloc_vfsmnt(const char *name);
|
||||
extern struct vfsmount *do_kern_mount(const char *fstype, int flags,
|
||||
const char *name, void *data);
|
||||
|
||||
struct file_system_type;
|
||||
extern struct vfsmount *vfs_kern_mount(struct file_system_type *type,
|
||||
int flags, const char *name,
|
||||
void *data);
|
||||
|
||||
struct nameidata;
|
||||
|
||||
extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd,
|
||||
int mnt_flags, struct list_head *fslist);
|
||||
|
||||
extern void mark_mounts_for_expiry(struct list_head *mounts);
|
||||
extern void shrink_submounts(struct vfsmount *mountpoint, struct list_head *mounts);
|
||||
|
||||
extern spinlock_t vfsmount_lock;
|
||||
extern dev_t name_to_dev_t(char *name);
|
||||
|
||||
@@ -384,6 +384,7 @@ enum {
|
||||
NFSPROC4_CLNT_DELEGRETURN,
|
||||
NFSPROC4_CLNT_GETACL,
|
||||
NFSPROC4_CLNT_SETACL,
|
||||
NFSPROC4_CLNT_FS_LOCATIONS,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,6 +9,27 @@
|
||||
#ifndef _LINUX_NFS_FS_H
|
||||
#define _LINUX_NFS_FS_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <linux/sunrpc/debug.h>
|
||||
#include <linux/sunrpc/auth.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
|
||||
#include <linux/nfs.h>
|
||||
#include <linux/nfs2.h>
|
||||
#include <linux/nfs3.h>
|
||||
#include <linux/nfs4.h>
|
||||
#include <linux/nfs_xdr.h>
|
||||
|
||||
#include <linux/nfs_fs_sb.h>
|
||||
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/mempool.h>
|
||||
|
||||
/*
|
||||
* Enable debugging support for nfs client.
|
||||
@@ -41,27 +62,9 @@
|
||||
#define FLUSH_LOWPRI 8 /* low priority background flush */
|
||||
#define FLUSH_HIGHPRI 16 /* high priority memory reclaim flush */
|
||||
#define FLUSH_NOCOMMIT 32 /* Don't send the NFSv3/v4 COMMIT */
|
||||
#define FLUSH_INVALIDATE 64 /* Invalidate the page cache */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/in.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <linux/nfs_fs_sb.h>
|
||||
|
||||
#include <linux/sunrpc/debug.h>
|
||||
#include <linux/sunrpc/auth.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
|
||||
#include <linux/nfs.h>
|
||||
#include <linux/nfs2.h>
|
||||
#include <linux/nfs3.h>
|
||||
#include <linux/nfs4.h>
|
||||
#include <linux/nfs_xdr.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/mempool.h>
|
||||
|
||||
/*
|
||||
* NFSv3/v4 Access mode cache entry
|
||||
@@ -233,8 +236,12 @@ static inline int nfs_caches_unstable(struct inode *inode)
|
||||
|
||||
static inline void nfs_mark_for_revalidate(struct inode *inode)
|
||||
{
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS;
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
@@ -296,7 +303,7 @@ extern int nfs_release(struct inode *, struct file *);
|
||||
extern int nfs_attribute_timeout(struct inode *inode);
|
||||
extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);
|
||||
extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
|
||||
extern void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
|
||||
extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
|
||||
extern int nfs_setattr(struct dentry *, struct iattr *);
|
||||
extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);
|
||||
extern void nfs_begin_attr_update(struct inode *);
|
||||
@@ -306,6 +313,10 @@ extern void nfs_end_data_update(struct inode *);
|
||||
extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
|
||||
extern void put_nfs_open_context(struct nfs_open_context *ctx);
|
||||
extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode);
|
||||
extern struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent,
|
||||
const struct dentry *dentry,
|
||||
struct nfs_fh *fh,
|
||||
struct nfs_fattr *fattr);
|
||||
|
||||
/* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
|
||||
extern u32 root_nfs_parse_addr(char *name); /*__init*/
|
||||
@@ -391,6 +402,15 @@ extern void nfs_unregister_sysctl(void);
|
||||
#define nfs_unregister_sysctl() do { } while(0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* linux/fs/nfs/namespace.c
|
||||
*/
|
||||
extern struct list_head nfs_automount_list;
|
||||
extern struct inode_operations nfs_mountpoint_inode_operations;
|
||||
extern struct inode_operations nfs_referral_inode_operations;
|
||||
extern int nfs_mountpoint_expiry_timeout;
|
||||
extern void nfs_release_automount_timer(void);
|
||||
|
||||
/*
|
||||
* linux/fs/nfs/unlink.c
|
||||
*/
|
||||
|
||||
@@ -35,6 +35,7 @@ struct nfs_server {
|
||||
char * hostname; /* remote hostname */
|
||||
struct nfs_fh fh;
|
||||
struct sockaddr_in addr;
|
||||
struct nfs_fsid fsid;
|
||||
unsigned long mount_time; /* when this fs was mounted */
|
||||
#ifdef CONFIG_NFS_V4
|
||||
/* Our own IP address, as a null-terminated string.
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/nfs_fs_sb.h>
|
||||
#include <linux/sunrpc/auth.h>
|
||||
#include <linux/nfs_xdr.h>
|
||||
|
||||
@@ -63,8 +62,8 @@ extern void nfs_release_request(struct nfs_page *req);
|
||||
|
||||
extern int nfs_scan_lock_dirty(struct nfs_inode *nfsi, struct list_head *dst,
|
||||
unsigned long idx_start, unsigned int npages);
|
||||
extern int nfs_scan_list(struct list_head *, struct list_head *,
|
||||
unsigned long, unsigned int);
|
||||
extern int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *head, struct list_head *dst,
|
||||
unsigned long idx_start, unsigned int npages);
|
||||
extern int nfs_coalesce_requests(struct list_head *, struct list_head *,
|
||||
unsigned int);
|
||||
extern int nfs_wait_on_request(struct nfs_page *);
|
||||
|
||||
@@ -14,11 +14,19 @@
|
||||
#define NFS_DEF_FILE_IO_SIZE (4096U)
|
||||
#define NFS_MIN_FILE_IO_SIZE (1024U)
|
||||
|
||||
struct nfs4_fsid {
|
||||
__u64 major;
|
||||
__u64 minor;
|
||||
struct nfs_fsid {
|
||||
uint64_t major;
|
||||
uint64_t minor;
|
||||
};
|
||||
|
||||
/*
|
||||
* Helper for checking equality between 2 fsids.
|
||||
*/
|
||||
static inline int nfs_fsid_equal(const struct nfs_fsid *a, const struct nfs_fsid *b)
|
||||
{
|
||||
return a->major == b->major && a->minor == b->minor;
|
||||
}
|
||||
|
||||
struct nfs_fattr {
|
||||
unsigned short valid; /* which fields are valid */
|
||||
__u64 pre_size; /* pre_op_attr.size */
|
||||
@@ -40,10 +48,7 @@ struct nfs_fattr {
|
||||
} nfs3;
|
||||
} du;
|
||||
dev_t rdev;
|
||||
union {
|
||||
__u64 nfs3; /* also nfs2 */
|
||||
struct nfs4_fsid nfs4;
|
||||
} fsid_u;
|
||||
struct nfs_fsid fsid;
|
||||
__u64 fileid;
|
||||
struct timespec atime;
|
||||
struct timespec mtime;
|
||||
@@ -57,8 +62,8 @@ struct nfs_fattr {
|
||||
#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */
|
||||
#define NFS_ATTR_FATTR 0x0002 /* post-op attributes */
|
||||
#define NFS_ATTR_FATTR_V3 0x0004 /* NFSv3 attributes */
|
||||
#define NFS_ATTR_FATTR_V4 0x0008
|
||||
#define NFS_ATTR_PRE_CHANGE 0x0010
|
||||
#define NFS_ATTR_FATTR_V4 0x0008 /* NFSv4 change attribute */
|
||||
#define NFS_ATTR_FATTR_V4_REFERRAL 0x0010 /* NFSv4 referral */
|
||||
|
||||
/*
|
||||
* Info on the file system
|
||||
@@ -675,6 +680,40 @@ struct nfs4_server_caps_res {
|
||||
u32 has_symlinks;
|
||||
};
|
||||
|
||||
struct nfs4_string {
|
||||
unsigned int len;
|
||||
char *data;
|
||||
};
|
||||
|
||||
#define NFS4_PATHNAME_MAXCOMPONENTS 512
|
||||
struct nfs4_pathname {
|
||||
unsigned int ncomponents;
|
||||
struct nfs4_string components[NFS4_PATHNAME_MAXCOMPONENTS];
|
||||
};
|
||||
|
||||
#define NFS4_FS_LOCATION_MAXSERVERS 10
|
||||
struct nfs4_fs_location {
|
||||
unsigned int nservers;
|
||||
struct nfs4_string servers[NFS4_FS_LOCATION_MAXSERVERS];
|
||||
struct nfs4_pathname rootpath;
|
||||
};
|
||||
|
||||
#define NFS4_FS_LOCATIONS_MAXENTRIES 10
|
||||
struct nfs4_fs_locations {
|
||||
struct nfs_fattr fattr;
|
||||
const struct nfs_server *server;
|
||||
struct nfs4_pathname fs_path;
|
||||
int nlocations;
|
||||
struct nfs4_fs_location locations[NFS4_FS_LOCATIONS_MAXENTRIES];
|
||||
};
|
||||
|
||||
struct nfs4_fs_locations_arg {
|
||||
const struct nfs_fh *dir_fh;
|
||||
const struct qstr *name;
|
||||
struct page *page;
|
||||
const u32 *bitmask;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
|
||||
struct nfs_page;
|
||||
@@ -695,7 +734,7 @@ struct nfs_read_data {
|
||||
#ifdef CONFIG_NFS_V4
|
||||
unsigned long timestamp; /* For lease renewal */
|
||||
#endif
|
||||
struct page *page_array[NFS_PAGEVEC_SIZE + 1];
|
||||
struct page *page_array[NFS_PAGEVEC_SIZE];
|
||||
};
|
||||
|
||||
struct nfs_write_data {
|
||||
@@ -713,7 +752,7 @@ struct nfs_write_data {
|
||||
#ifdef CONFIG_NFS_V4
|
||||
unsigned long timestamp; /* For lease renewal */
|
||||
#endif
|
||||
struct page *page_array[NFS_PAGEVEC_SIZE + 1];
|
||||
struct page *page_array[NFS_PAGEVEC_SIZE];
|
||||
};
|
||||
|
||||
struct nfs_access_entry;
|
||||
|
||||
@@ -194,6 +194,7 @@ extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
|
||||
extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
|
||||
extern uint32_t *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
|
||||
extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
|
||||
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user