Commit 9d8719a4 authored by Ian Kent's avatar Ian Kent Committed by Linus Torvalds

autofs: change catatonic setting to a bit flag

Change the superblock info.  catatonic setting to be part of a flags bit
field.

Link: http://lkml.kernel.org/r/154296973142.9889.17275721668508589639.stgit@pluto-themaw-netSigned-off-by: default avatarIan Kent <raven@themaw.net>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9bf964c9
...@@ -103,16 +103,18 @@ struct autofs_wait_queue { ...@@ -103,16 +103,18 @@ struct autofs_wait_queue {
#define AUTOFS_SBI_MAGIC 0x6d4a556d #define AUTOFS_SBI_MAGIC 0x6d4a556d
#define AUTOFS_SBI_CATATONIC 0x0001
struct autofs_sb_info { struct autofs_sb_info {
u32 magic; u32 magic;
int pipefd; int pipefd;
struct file *pipe; struct file *pipe;
struct pid *oz_pgrp; struct pid *oz_pgrp;
int catatonic;
int version; int version;
int sub_version; int sub_version;
int min_proto; int min_proto;
int max_proto; int max_proto;
unsigned int flags;
unsigned long exp_timeout; unsigned long exp_timeout;
unsigned int type; unsigned int type;
struct super_block *sb; struct super_block *sb;
...@@ -142,7 +144,8 @@ static inline struct autofs_info *autofs_dentry_ino(struct dentry *dentry) ...@@ -142,7 +144,8 @@ static inline struct autofs_info *autofs_dentry_ino(struct dentry *dentry)
*/ */
static inline int autofs_oz_mode(struct autofs_sb_info *sbi) static inline int autofs_oz_mode(struct autofs_sb_info *sbi)
{ {
return sbi->catatonic || task_pgrp(current) == sbi->oz_pgrp; return ((sbi->flags & AUTOFS_SBI_CATATONIC) ||
task_pgrp(current) == sbi->oz_pgrp);
} }
struct inode *autofs_get_inode(struct super_block *, umode_t); struct inode *autofs_get_inode(struct super_block *, umode_t);
......
...@@ -350,7 +350,7 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp, ...@@ -350,7 +350,7 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp,
pipefd = param->setpipefd.pipefd; pipefd = param->setpipefd.pipefd;
mutex_lock(&sbi->wq_mutex); mutex_lock(&sbi->wq_mutex);
if (!sbi->catatonic) { if (!(sbi->flags & AUTOFS_SBI_CATATONIC)) {
mutex_unlock(&sbi->wq_mutex); mutex_unlock(&sbi->wq_mutex);
return -EBUSY; return -EBUSY;
} else { } else {
...@@ -377,7 +377,7 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp, ...@@ -377,7 +377,7 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp,
swap(sbi->oz_pgrp, new_pid); swap(sbi->oz_pgrp, new_pid);
sbi->pipefd = pipefd; sbi->pipefd = pipefd;
sbi->pipe = pipe; sbi->pipe = pipe;
sbi->catatonic = 0; sbi->flags &= ~AUTOFS_SBI_CATATONIC;
} }
out: out:
put_pid(new_pid); put_pid(new_pid);
......
...@@ -227,12 +227,12 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -227,12 +227,12 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
sbi->magic = AUTOFS_SBI_MAGIC; sbi->magic = AUTOFS_SBI_MAGIC;
sbi->pipefd = -1; sbi->pipefd = -1;
sbi->pipe = NULL; sbi->pipe = NULL;
sbi->catatonic = 1;
sbi->exp_timeout = 0; sbi->exp_timeout = 0;
sbi->oz_pgrp = NULL; sbi->oz_pgrp = NULL;
sbi->sb = s; sbi->sb = s;
sbi->version = 0; sbi->version = 0;
sbi->sub_version = 0; sbi->sub_version = 0;
sbi->flags = AUTOFS_SBI_CATATONIC;
set_autofs_type_indirect(&sbi->type); set_autofs_type_indirect(&sbi->type);
sbi->min_proto = 0; sbi->min_proto = 0;
sbi->max_proto = 0; sbi->max_proto = 0;
...@@ -318,7 +318,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -318,7 +318,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
if (ret < 0) if (ret < 0)
goto fail_fput; goto fail_fput;
sbi->pipe = pipe; sbi->pipe = pipe;
sbi->catatonic = 0; sbi->flags &= ~AUTOFS_SBI_CATATONIC;
/* /*
* Success! Install the root dentry now to indicate completion. * Success! Install the root dentry now to indicate completion.
......
...@@ -510,7 +510,8 @@ static struct dentry *autofs_lookup(struct inode *dir, ...@@ -510,7 +510,8 @@ static struct dentry *autofs_lookup(struct inode *dir,
sbi = autofs_sbi(dir->i_sb); sbi = autofs_sbi(dir->i_sb);
pr_debug("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d\n", pr_debug("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d\n",
current->pid, task_pgrp_nr(current), sbi->catatonic, current->pid, task_pgrp_nr(current),
sbi->flags & AUTOFS_SBI_CATATONIC,
autofs_oz_mode(sbi)); autofs_oz_mode(sbi));
active = autofs_lookup_active(dentry); active = autofs_lookup_active(dentry);
...@@ -563,7 +564,7 @@ static int autofs_dir_symlink(struct inode *dir, ...@@ -563,7 +564,7 @@ static int autofs_dir_symlink(struct inode *dir,
* autofs mount is catatonic but the state of an autofs * autofs mount is catatonic but the state of an autofs
* file system needs to be preserved over restarts. * file system needs to be preserved over restarts.
*/ */
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -EACCES; return -EACCES;
BUG_ON(!ino); BUG_ON(!ino);
...@@ -626,7 +627,7 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry) ...@@ -626,7 +627,7 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry)
* autofs mount is catatonic but the state of an autofs * autofs mount is catatonic but the state of an autofs
* file system needs to be preserved over restarts. * file system needs to be preserved over restarts.
*/ */
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -EACCES; return -EACCES;
if (atomic_dec_and_test(&ino->count)) { if (atomic_dec_and_test(&ino->count)) {
...@@ -714,7 +715,7 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry) ...@@ -714,7 +715,7 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry)
* autofs mount is catatonic but the state of an autofs * autofs mount is catatonic but the state of an autofs
* file system needs to be preserved over restarts. * file system needs to be preserved over restarts.
*/ */
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -EACCES; return -EACCES;
spin_lock(&sbi->lookup_lock); spin_lock(&sbi->lookup_lock);
...@@ -759,7 +760,7 @@ static int autofs_dir_mkdir(struct inode *dir, ...@@ -759,7 +760,7 @@ static int autofs_dir_mkdir(struct inode *dir,
* autofs mount is catatonic but the state of an autofs * autofs mount is catatonic but the state of an autofs
* file system needs to be preserved over restarts. * file system needs to be preserved over restarts.
*/ */
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -EACCES; return -EACCES;
pr_debug("dentry %p, creating %pd\n", dentry, dentry); pr_debug("dentry %p, creating %pd\n", dentry, dentry);
......
...@@ -20,14 +20,14 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi) ...@@ -20,14 +20,14 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi)
struct autofs_wait_queue *wq, *nwq; struct autofs_wait_queue *wq, *nwq;
mutex_lock(&sbi->wq_mutex); mutex_lock(&sbi->wq_mutex);
if (sbi->catatonic) { if (sbi->flags & AUTOFS_SBI_CATATONIC) {
mutex_unlock(&sbi->wq_mutex); mutex_unlock(&sbi->wq_mutex);
return; return;
} }
pr_debug("entering catatonic mode\n"); pr_debug("entering catatonic mode\n");
sbi->catatonic = 1; sbi->flags |= AUTOFS_SBI_CATATONIC;
wq = sbi->queues; wq = sbi->queues;
sbi->queues = NULL; /* Erase all wait queues */ sbi->queues = NULL; /* Erase all wait queues */
while (wq) { while (wq) {
...@@ -255,7 +255,7 @@ static int validate_request(struct autofs_wait_queue **wait, ...@@ -255,7 +255,7 @@ static int validate_request(struct autofs_wait_queue **wait,
struct autofs_wait_queue *wq; struct autofs_wait_queue *wq;
struct autofs_info *ino; struct autofs_info *ino;
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -ENOENT; return -ENOENT;
/* Wait in progress, continue; */ /* Wait in progress, continue; */
...@@ -290,7 +290,7 @@ static int validate_request(struct autofs_wait_queue **wait, ...@@ -290,7 +290,7 @@ static int validate_request(struct autofs_wait_queue **wait,
if (mutex_lock_interruptible(&sbi->wq_mutex)) if (mutex_lock_interruptible(&sbi->wq_mutex))
return -EINTR; return -EINTR;
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -ENOENT; return -ENOENT;
wq = autofs_find_wait(sbi, qstr); wq = autofs_find_wait(sbi, qstr);
...@@ -359,7 +359,7 @@ int autofs_wait(struct autofs_sb_info *sbi, ...@@ -359,7 +359,7 @@ int autofs_wait(struct autofs_sb_info *sbi,
pid_t tgid; pid_t tgid;
/* In catatonic mode, we don't wait for nobody */ /* In catatonic mode, we don't wait for nobody */
if (sbi->catatonic) if (sbi->flags & AUTOFS_SBI_CATATONIC)
return -ENOENT; return -ENOENT;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment