aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfsctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r--fs/nfsd/nfsctl.c66
1 files changed, 53 insertions, 13 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 049d2a9c7715..2c2eb8796c10 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -509,7 +509,7 @@ out_free:
509 return rv; 509 return rv;
510} 510}
511 511
512static ssize_t write_versions(struct file *file, char *buf, size_t size) 512static ssize_t __write_versions(struct file *file, char *buf, size_t size)
513{ 513{
514 /* 514 /*
515 * Format: 515 * Format:
@@ -572,6 +572,16 @@ static ssize_t write_versions(struct file *file, char *buf, size_t size)
572 return len; 572 return len;
573} 573}
574 574
575static ssize_t write_versions(struct file *file, char *buf, size_t size)
576{
577 ssize_t rv;
578
579 mutex_lock(&nfsd_mutex);
580 rv = __write_versions(file, buf, size);
581 mutex_unlock(&nfsd_mutex);
582 return rv;
583}
584
575static ssize_t __write_ports(struct file *file, char *buf, size_t size) 585static ssize_t __write_ports(struct file *file, char *buf, size_t size)
576{ 586{
577 if (size == 0) { 587 if (size == 0) {
@@ -675,6 +685,7 @@ static ssize_t __write_ports(struct file *file, char *buf, size_t size)
675static ssize_t write_ports(struct file *file, char *buf, size_t size) 685static ssize_t write_ports(struct file *file, char *buf, size_t size)
676{ 686{
677 ssize_t rv; 687 ssize_t rv;
688
678 mutex_lock(&nfsd_mutex); 689 mutex_lock(&nfsd_mutex);
679 rv = __write_ports(file, buf, size); 690 rv = __write_ports(file, buf, size);
680 mutex_unlock(&nfsd_mutex); 691 mutex_unlock(&nfsd_mutex);
@@ -714,16 +725,17 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)
714#ifdef CONFIG_NFSD_V4 725#ifdef CONFIG_NFSD_V4
715extern time_t nfs4_leasetime(void); 726extern time_t nfs4_leasetime(void);
716 727
717static ssize_t write_leasetime(struct file *file, char *buf, size_t size) 728static ssize_t __write_leasetime(struct file *file, char *buf, size_t size)
718{ 729{
719 /* if size > 10 seconds, call 730 /* if size > 10 seconds, call
720 * nfs4_reset_lease() then write out the new lease (seconds) as reply 731 * nfs4_reset_lease() then write out the new lease (seconds) as reply
721 */ 732 */
722 char *mesg = buf; 733 char *mesg = buf;
723 int rv; 734 int rv, lease;
724 735
725 if (size > 0) { 736 if (size > 0) {
726 int lease; 737 if (nfsd_serv)
738 return -EBUSY;
727 rv = get_int(&mesg, &lease); 739 rv = get_int(&mesg, &lease);
728 if (rv) 740 if (rv)
729 return rv; 741 return rv;
@@ -735,24 +747,52 @@ static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
735 return strlen(buf); 747 return strlen(buf);
736} 748}
737 749
738static ssize_t write_recoverydir(struct file *file, char *buf, size_t size) 750static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
751{
752 ssize_t rv;
753
754 mutex_lock(&nfsd_mutex);
755 rv = __write_leasetime(file, buf, size);
756 mutex_unlock(&nfsd_mutex);
757 return rv;
758}
759
760extern char *nfs4_recoverydir(void);
761
762static ssize_t __write_recoverydir(struct file *file, char *buf, size_t size)
739{ 763{
740 char *mesg = buf; 764 char *mesg = buf;
741 char *recdir; 765 char *recdir;
742 int len, status; 766 int len, status;
743 767
744 if (size == 0 || size > PATH_MAX || buf[size-1] != '\n') 768 if (size > 0) {
745 return -EINVAL; 769 if (nfsd_serv)
746 buf[size-1] = 0; 770 return -EBUSY;
771 if (size > PATH_MAX || buf[size-1] != '\n')
772 return -EINVAL;
773 buf[size-1] = 0;
747 774
748 recdir = mesg; 775 recdir = mesg;
749 len = qword_get(&mesg, recdir, size); 776 len = qword_get(&mesg, recdir, size);
750 if (len <= 0) 777 if (len <= 0)
751 return -EINVAL; 778 return -EINVAL;
752 779
753 status = nfs4_reset_recoverydir(recdir); 780 status = nfs4_reset_recoverydir(recdir);
781 }
782 sprintf(buf, "%s\n", nfs4_recoverydir());
754 return strlen(buf); 783 return strlen(buf);
755} 784}
785
786static ssize_t write_recoverydir(struct file *file, char *buf, size_t size)
787{
788 ssize_t rv;
789
790 mutex_lock(&nfsd_mutex);
791 rv = __write_recoverydir(file, buf, size);
792 mutex_unlock(&nfsd_mutex);
793 return rv;
794}
795
756#endif 796#endif
757 797
758/*----------------------------------------------------------------------------*/ 798/*----------------------------------------------------------------------------*/