diff options
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/export.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfs3proc.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfscache.c | 4 | ||||
-rw-r--r-- | fs/nfsd/nfsctl.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfsfh.c | 3 | ||||
-rw-r--r-- | fs/nfsd/nfsproc.c | 17 | ||||
-rw-r--r-- | fs/nfsd/nfssvc.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfsxdr.c | 13 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 2 |
9 files changed, 32 insertions, 15 deletions
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 2beed5cf9..3db60bcc2 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -15,7 +15,7 @@ */ #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/stat.h> #include <linux/in.h> diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index a513bfbe0..8051b15f8 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -18,7 +18,7 @@ #include <linux/in.h> #include <linux/version.h> #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/major.h> #include <linux/sunrpc/svc.h> diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index 8a061ebcb..2157f622a 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -12,7 +12,7 @@ #include <linux/kernel.h> #include <linux/sched.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/string.h> #include <linux/sunrpc/svc.h> @@ -192,7 +192,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp, int type) xid == rp->c_xid && proc == rp->c_proc && proto == rp->c_prot && vers == rp->c_vers && time_before(jiffies, rp->c_timestamp + 120*HZ) && - memcmp((char*)&rqstp->rq_addr, (char*)&rp->c_addr, rqstp->rq_addrlen)==0) { + memcmp((char*)&rqstp->rq_addr, (char*)&rp->c_addr, sizeof(rp->c_addr))==0) { nfsdstats.rchits++; goto found_entry; } diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 7a80fe990..7641c5b52 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -18,7 +18,7 @@ #include <linux/net.h> #include <linux/in.h> #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/proc_fs.h> #include <linux/nfs.h> diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 78c729c09..6e2c98a55 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -9,7 +9,7 @@ */ #include <linux/sched.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/fs.h> #include <linux/unistd.h> #include <linux/string.h> @@ -454,6 +454,7 @@ find_fh_dentry(struct super_block *sb, ino_t ino, int generation, ino_t dirino, if (tmp != dentry) { /* we lost a race, try again */ + dput(pdentry); dput(tmp); dput(dentry); dput(result); /* this will discard the whole free path, so we can up the semaphore */ diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index b5057d57b..303792b58 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -18,7 +18,7 @@ #include <linux/in.h> #include <linux/version.h> #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/sunrpc/svc.h> #include <linux/nfsd/nfsd.h> @@ -252,8 +252,19 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, if (attr->ia_valid & ATTR_MODE) { type = attr->ia_mode & S_IFMT; mode = attr->ia_mode & ~S_IFMT; - if (!type) /* HP weirdness */ - type = S_IFREG; + if (!type) { + /* no type, so if target exists, assume same as that, + * else assume a file */ + if (inode) { + type = inode->i_mode & S_IFMT; + if (type == S_IFCHR || type == S_IFBLK) { + /* reserve rdev for later checking */ + attr->ia_size = inode->i_rdev; + attr->ia_valid |= ATTR_SIZE; + } + } else + type = S_IFREG; + } } else if (inode) { type = inode->i_mode & S_IFMT; mode = inode->i_mode & ~S_IFMT; diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index a4a642c44..0537c06d7 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -19,7 +19,7 @@ #include <linux/uio.h> #include <linux/version.h> #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/smp.h> #include <linux/smp_lock.h> diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index fcbddc5ed..7bcc37c41 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -26,7 +26,7 @@ * Mapping of S_IF* types to NFS file types */ static u32 nfs_ftypes[] = { - NFNON, NFFIFO, NFCHR, NFBAD, + NFNON, NFCHR, NFCHR, NFBAD, NFDIR, NFBAD, NFBLK, NFBAD, NFREG, NFBAD, NFLNK, NFBAD, NFSOCK, NFBAD, NFLNK, NFBAD, @@ -136,20 +136,25 @@ decode_sattr(u32 *p, struct iattr *iap) static inline u32 * encode_fattr(struct svc_rqst *rqstp, u32 *p, struct inode *inode) { + int type = (inode->i_mode & S_IFMT); if (!inode) return 0; - *p++ = htonl(nfs_ftypes[(inode->i_mode & S_IFMT) >> 12]); + *p++ = htonl(nfs_ftypes[type >> 12]); *p++ = htonl((u32) inode->i_mode); *p++ = htonl((u32) inode->i_nlink); *p++ = htonl((u32) nfsd_ruid(rqstp, inode->i_uid)); *p++ = htonl((u32) nfsd_rgid(rqstp, inode->i_gid)); - if (S_ISLNK(inode->i_mode) && inode->i_size > NFS_MAXPATHLEN) { + + if (S_ISLNK(type) && inode->i_size > NFS_MAXPATHLEN) { *p++ = htonl(NFS_MAXPATHLEN); } else { *p++ = htonl((u32) inode->i_size); } *p++ = htonl((u32) inode->i_blksize); - *p++ = htonl((u32) inode->i_rdev); + if (S_ISCHR(type) || S_ISBLK(type)) + *p++ = htonl((u32) inode->i_rdev); + else + *p++ = htonl(0xffffffff); *p++ = htonl((u32) inode->i_blocks); *p++ = htonl((u32) inode->i_dev); *p++ = htonl((u32) inode->i_ino); diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index bd01b57f5..43fc14a4f 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -29,7 +29,7 @@ #include <linux/fcntl.h> #include <linux/net.h> #include <linux/unistd.h> -#include <linux/malloc.h> +#include <linux/slab.h> #include <linux/in.h> #define __NO_VERSION__ #include <linux/module.h> |