]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/nfsd/nfsctl.c
Blackfin arch: let PCI depend on BROKEN
[linux-2.6-omap-h63xx.git] / fs / nfsd / nfsctl.c
index 049d2a9c77159f8cd6437e62fac7488bf1872c48..c53e65f8f3a2b460d6c01424094b29c8082843a4 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/time.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
+#include <linux/namei.h>
 #include <linux/fcntl.h>
 #include <linux/net.h>
 #include <linux/in.h>
@@ -310,9 +311,12 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
 
 static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
 {
-       __be32 server_ip;
-       char *fo_path, c;
+       struct sockaddr_in sin = {
+               .sin_family     = AF_INET,
+       };
        int b1, b2, b3, b4;
+       char c;
+       char *fo_path;
 
        /* sanity check */
        if (size == 0)
@@ -326,11 +330,13 @@ static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
                return -EINVAL;
 
        /* get ipv4 address */
-       if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
+       if (sscanf(fo_path, NIPQUAD_FMT "%c", &b1, &b2, &b3, &b4, &c) != 4)
                return -EINVAL;
-       server_ip = htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4);
+       if (b1 > 255 || b2 > 255 || b3 > 255 || b4 > 255)
+               return -EINVAL;
+       sin.sin_addr.s_addr = htonl((b1 << 24) | (b2 << 16) | (b3 << 8) | b4);
 
-       return nlmsvc_unlock_all_by_ip(server_ip);
+       return nlmsvc_unlock_all_by_ip((struct sockaddr *)&sin);
 }
 
 static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size)
@@ -509,7 +515,7 @@ out_free:
        return rv;
 }
 
-static ssize_t write_versions(struct file *file, char *buf, size_t size)
+static ssize_t __write_versions(struct file *file, char *buf, size_t size)
 {
        /*
         * Format:
@@ -572,6 +578,16 @@ static ssize_t write_versions(struct file *file, char *buf, size_t size)
        return len;
 }
 
+static ssize_t write_versions(struct file *file, char *buf, size_t size)
+{
+       ssize_t rv;
+
+       mutex_lock(&nfsd_mutex);
+       rv = __write_versions(file, buf, size);
+       mutex_unlock(&nfsd_mutex);
+       return rv;
+}
+
 static ssize_t __write_ports(struct file *file, char *buf, size_t size)
 {
        if (size == 0) {
@@ -675,6 +691,7 @@ static ssize_t __write_ports(struct file *file, char *buf, size_t size)
 static ssize_t write_ports(struct file *file, char *buf, size_t size)
 {
        ssize_t rv;
+
        mutex_lock(&nfsd_mutex);
        rv = __write_ports(file, buf, size);
        mutex_unlock(&nfsd_mutex);
@@ -714,16 +731,17 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)
 #ifdef CONFIG_NFSD_V4
 extern time_t nfs4_leasetime(void);
 
-static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
+static ssize_t __write_leasetime(struct file *file, char *buf, size_t size)
 {
        /* if size > 10 seconds, call
         * nfs4_reset_lease() then write out the new lease (seconds) as reply
         */
        char *mesg = buf;
-       int rv;
+       int rv, lease;
 
        if (size > 0) {
-               int lease;
+               if (nfsd_serv)
+                       return -EBUSY;
                rv = get_int(&mesg, &lease);
                if (rv)
                        return rv;
@@ -735,24 +753,52 @@ static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
        return strlen(buf);
 }
 
-static ssize_t write_recoverydir(struct file *file, char *buf, size_t size)
+static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
+{
+       ssize_t rv;
+
+       mutex_lock(&nfsd_mutex);
+       rv = __write_leasetime(file, buf, size);
+       mutex_unlock(&nfsd_mutex);
+       return rv;
+}
+
+extern char *nfs4_recoverydir(void);
+
+static ssize_t __write_recoverydir(struct file *file, char *buf, size_t size)
 {
        char *mesg = buf;
        char *recdir;
        int len, status;
 
-       if (size == 0 || size > PATH_MAX || buf[size-1] != '\n')
-               return -EINVAL;
-       buf[size-1] = 0;
+       if (size > 0) {
+               if (nfsd_serv)
+                       return -EBUSY;
+               if (size > PATH_MAX || buf[size-1] != '\n')
+                       return -EINVAL;
+               buf[size-1] = 0;
 
-       recdir = mesg;
-       len = qword_get(&mesg, recdir, size);
-       if (len <= 0)
-               return -EINVAL;
+               recdir = mesg;
+               len = qword_get(&mesg, recdir, size);
+               if (len <= 0)
+                       return -EINVAL;
 
-       status = nfs4_reset_recoverydir(recdir);
+               status = nfs4_reset_recoverydir(recdir);
+       }
+       sprintf(buf, "%s\n", nfs4_recoverydir());
        return strlen(buf);
 }
+
+static ssize_t write_recoverydir(struct file *file, char *buf, size_t size)
+{
+       ssize_t rv;
+
+       mutex_lock(&nfsd_mutex);
+       rv = __write_recoverydir(file, buf, size);
+       mutex_unlock(&nfsd_mutex);
+       return rv;
+}
+
 #endif
 
 /*----------------------------------------------------------------------------*/