]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/nfsd/nfsctl.c
[ARM] 4331/3: Support for Micrel/Kendin KS8695 processor
[linux-2.6-omap-h63xx.git] / fs / nfsd / nfsctl.c
index 5c6a477c20ec30693267f0425a4117e1f93caef5..71c686dc7257140f3c12c7cd0549d93af3f48816 100644 (file)
@@ -57,6 +57,7 @@ enum {
        NFSD_Pool_Threads,
        NFSD_Versions,
        NFSD_Ports,
+       NFSD_MaxBlkSize,
        /*
         * The below MUST come last.  Otherwise we leave a hole in nfsd_files[]
         * with !CONFIG_NFSD_V4 and simple_fill_super() goes oops
@@ -82,6 +83,7 @@ static ssize_t write_threads(struct file *file, char *buf, size_t size);
 static ssize_t write_pool_threads(struct file *file, char *buf, size_t size);
 static ssize_t write_versions(struct file *file, char *buf, size_t size);
 static ssize_t write_ports(struct file *file, char *buf, size_t size);
+static ssize_t write_maxblksize(struct file *file, char *buf, size_t size);
 #ifdef CONFIG_NFSD_V4
 static ssize_t write_leasetime(struct file *file, char *buf, size_t size);
 static ssize_t write_recoverydir(struct file *file, char *buf, size_t size);
@@ -100,6 +102,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {
        [NFSD_Pool_Threads] = write_pool_threads,
        [NFSD_Versions] = write_versions,
        [NFSD_Ports] = write_ports,
+       [NFSD_MaxBlkSize] = write_maxblksize,
 #ifdef CONFIG_NFSD_V4
        [NFSD_Leasetime] = write_leasetime,
        [NFSD_RecoveryDir] = write_recoverydir,
@@ -108,7 +111,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {
 
 static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos)
 {
-       ino_t ino =  file->f_dentry->d_inode->i_ino;
+       ino_t ino =  file->f_path.dentry->d_inode->i_ino;
        char *data;
        ssize_t rv;
 
@@ -120,7 +123,7 @@ static ssize_t nfsctl_transaction_write(struct file *file, const char __user *bu
                return PTR_ERR(data);
 
        rv =  write_op[ino](file, data, size);
-       if (rv>0) {
+       if (rv >= 0) {
                simple_transaction_set(file, rv);
                rv = size;
        }
@@ -523,18 +526,20 @@ static ssize_t write_ports(struct file *file, char *buf, size_t size)
                err = nfsd_create_serv();
                if (!err) {
                        int proto = 0;
-                       err = lockd_up(proto);
-                       if (!err) {
-                               err = svc_addsock(nfsd_serv, fd, buf, &proto);
-                               if (err)
-                                       lockd_down();
+                       err = svc_addsock(nfsd_serv, fd, buf, &proto);
+                       if (err >= 0) {
+                               err = lockd_up(proto);
+                               if (err < 0)
+                                       svc_sock_names(buf+strlen(buf)+1, nfsd_serv, buf);
                        }
                        /* Decrease the count, but don't shutdown the
                         * the service
                         */
+                       lock_kernel();
                        nfsd_serv->sv_nrthreads--;
+                       unlock_kernel();
                }
-               return err;
+               return err < 0 ? err : 0;
        }
        if (buf[0] == '-') {
                char *toclose = kstrdup(buf+1, GFP_KERNEL);
@@ -545,12 +550,43 @@ static ssize_t write_ports(struct file *file, char *buf, size_t size)
                if (nfsd_serv)
                        len = svc_sock_names(buf, nfsd_serv, toclose);
                unlock_kernel();
+               if (len >= 0)
+                       lockd_down();
                kfree(toclose);
                return len;
        }
        return -EINVAL;
 }
 
+int nfsd_max_blksize;
+
+static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)
+{
+       char *mesg = buf;
+       if (size > 0) {
+               int bsize;
+               int rv = get_int(&mesg, &bsize);
+               if (rv)
+                       return rv;
+               /* force bsize into allowed range and
+                * required alignment.
+                */
+               if (bsize < 1024)
+                       bsize = 1024;
+               if (bsize > NFSSVC_MAXBLKSIZE)
+                       bsize = NFSSVC_MAXBLKSIZE;
+               bsize &= ~(1024-1);
+               lock_kernel();
+               if (nfsd_serv && nfsd_serv->sv_nrthreads) {
+                       unlock_kernel();
+                       return -EBUSY;
+               }
+               nfsd_max_blksize = bsize;
+               unlock_kernel();
+       }
+       return sprintf(buf, "%d\n", nfsd_max_blksize);
+}
+
 #ifdef CONFIG_NFSD_V4
 extern time_t nfs4_leasetime(void);
 
@@ -616,6 +652,7 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent)
                [NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
+               [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
 #ifdef CONFIG_NFSD_V4
                [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_RecoveryDir] = {"nfsv4recoverydir", &transaction_ops, S_IWUSR|S_IRUSR},