diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r-- | fs/nfsd/nfsctl.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 161afdcb8f7d..841c562991e8 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
@@ -51,6 +51,7 @@ enum { | |||
51 | NFSD_Fh, | 51 | NFSD_Fh, |
52 | NFSD_Threads, | 52 | NFSD_Threads, |
53 | NFSD_Leasetime, | 53 | NFSD_Leasetime, |
54 | NFSD_RecoveryDir, | ||
54 | }; | 55 | }; |
55 | 56 | ||
56 | /* | 57 | /* |
@@ -66,6 +67,7 @@ static ssize_t write_getfs(struct file *file, char *buf, size_t size); | |||
66 | static ssize_t write_filehandle(struct file *file, char *buf, size_t size); | 67 | static ssize_t write_filehandle(struct file *file, char *buf, size_t size); |
67 | static ssize_t write_threads(struct file *file, char *buf, size_t size); | 68 | static ssize_t write_threads(struct file *file, char *buf, size_t size); |
68 | static ssize_t write_leasetime(struct file *file, char *buf, size_t size); | 69 | static ssize_t write_leasetime(struct file *file, char *buf, size_t size); |
70 | static ssize_t write_recoverydir(struct file *file, char *buf, size_t size); | ||
69 | 71 | ||
70 | static ssize_t (*write_op[])(struct file *, char *, size_t) = { | 72 | static ssize_t (*write_op[])(struct file *, char *, size_t) = { |
71 | [NFSD_Svc] = write_svc, | 73 | [NFSD_Svc] = write_svc, |
@@ -78,6 +80,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = { | |||
78 | [NFSD_Fh] = write_filehandle, | 80 | [NFSD_Fh] = write_filehandle, |
79 | [NFSD_Threads] = write_threads, | 81 | [NFSD_Threads] = write_threads, |
80 | [NFSD_Leasetime] = write_leasetime, | 82 | [NFSD_Leasetime] = write_leasetime, |
83 | [NFSD_RecoveryDir] = write_recoverydir, | ||
81 | }; | 84 | }; |
82 | 85 | ||
83 | static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) | 86 | static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) |
@@ -349,6 +352,25 @@ static ssize_t write_leasetime(struct file *file, char *buf, size_t size) | |||
349 | return strlen(buf); | 352 | return strlen(buf); |
350 | } | 353 | } |
351 | 354 | ||
355 | static ssize_t write_recoverydir(struct file *file, char *buf, size_t size) | ||
356 | { | ||
357 | char *mesg = buf; | ||
358 | char *recdir; | ||
359 | int len, status; | ||
360 | |||
361 | if (size > PATH_MAX || buf[size-1] != '\n') | ||
362 | return -EINVAL; | ||
363 | buf[size-1] = 0; | ||
364 | |||
365 | recdir = mesg; | ||
366 | len = qword_get(&mesg, recdir, size); | ||
367 | if (len <= 0) | ||
368 | return -EINVAL; | ||
369 | |||
370 | status = nfs4_reset_recoverydir(recdir); | ||
371 | return strlen(buf); | ||
372 | } | ||
373 | |||
352 | /*----------------------------------------------------------------------------*/ | 374 | /*----------------------------------------------------------------------------*/ |
353 | /* | 375 | /* |
354 | * populating the filesystem. | 376 | * populating the filesystem. |
@@ -369,6 +391,7 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) | |||
369 | [NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR}, | 391 | [NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR}, |
370 | #ifdef CONFIG_NFSD_V4 | 392 | #ifdef CONFIG_NFSD_V4 |
371 | [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, | 393 | [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, |
394 | [NFSD_RecoveryDir] = {"nfsv4recoverydir", &transaction_ops, S_IWUSR|S_IRUSR}, | ||
372 | #endif | 395 | #endif |
373 | /* last one */ {""} | 396 | /* last one */ {""} |
374 | }; | 397 | }; |
@@ -397,9 +420,8 @@ static int __init init_nfsd(void) | |||
397 | nfsd_cache_init(); /* RPC reply cache */ | 420 | nfsd_cache_init(); /* RPC reply cache */ |
398 | nfsd_export_init(); /* Exports table */ | 421 | nfsd_export_init(); /* Exports table */ |
399 | nfsd_lockd_init(); /* lockd->nfsd callbacks */ | 422 | nfsd_lockd_init(); /* lockd->nfsd callbacks */ |
400 | #ifdef CONFIG_NFSD_V4 | 423 | nfs4_state_init(); /* NFSv4 locking state */ |
401 | nfsd_idmap_init(); /* Name to ID mapping */ | 424 | nfsd_idmap_init(); /* Name to ID mapping */ |
402 | #endif /* CONFIG_NFSD_V4 */ | ||
403 | if (proc_mkdir("fs/nfs", NULL)) { | 425 | if (proc_mkdir("fs/nfs", NULL)) { |
404 | struct proc_dir_entry *entry; | 426 | struct proc_dir_entry *entry; |
405 | entry = create_proc_entry("fs/nfs/exports", 0, NULL); | 427 | entry = create_proc_entry("fs/nfs/exports", 0, NULL); |
@@ -426,9 +448,7 @@ static void __exit exit_nfsd(void) | |||
426 | remove_proc_entry("fs/nfs", NULL); | 448 | remove_proc_entry("fs/nfs", NULL); |
427 | nfsd_stat_shutdown(); | 449 | nfsd_stat_shutdown(); |
428 | nfsd_lockd_shutdown(); | 450 | nfsd_lockd_shutdown(); |
429 | #ifdef CONFIG_NFSD_V4 | ||
430 | nfsd_idmap_shutdown(); | 451 | nfsd_idmap_shutdown(); |
431 | #endif /* CONFIG_NFSD_V4 */ | ||
432 | unregister_filesystem(&nfsd_fs_type); | 452 | unregister_filesystem(&nfsd_fs_type); |
433 | } | 453 | } |
434 | 454 | ||