summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/export.c2
-rw-r--r--fs/nfsd/nfs3proc.c2
-rw-r--r--fs/nfsd/nfscache.c4
-rw-r--r--fs/nfsd/nfsctl.c2
-rw-r--r--fs/nfsd/nfsfh.c3
-rw-r--r--fs/nfsd/nfsproc.c17
-rw-r--r--fs/nfsd/nfssvc.c2
-rw-r--r--fs/nfsd/nfsxdr.c13
-rw-r--r--fs/nfsd/vfs.c2
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>