]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/nfsd/nfsctl.c
knfsd: clean up nfsd filesystem interfaces
[linux-2.6-omap-h63xx.git] / fs / nfsd / nfsctl.c
index 049d2a9c77159f8cd6437e62fac7488bf1872c48..2c2eb8796c108479deb50d92e312338722e6351a 100644 (file)
@@ -509,7 +509,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 +572,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 +685,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 +725,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 +747,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
 
 /*----------------------------------------------------------------------------*/