Procfs interface: /proc/<pid>/status, /proc/<pid>/{root-shdw, cwd-shdw}.

Signed-off-by: Jaroslav Sykora <[EMAIL PROTECTED]>

 fs/proc/array.c |   23 +++++++++++++++++++
 fs/proc/base.c  |   53 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)

--- orig/fs/proc/base.c 2007-10-07 19:00:20.000000000 +0200
+++ new/fs/proc/base.c  2007-10-07 13:39:08.000000000 +0200
@@ -171,6 +171,32 @@ static int proc_cwd_link(struct inode *i
        return result;
 }
 
+static int proc_shdwcwd_link(struct inode *inode, struct dentry **dentry,
+                            struct vfsmount **mnt)
+{
+       struct task_struct *task = get_proc_task(inode);
+       struct fs_struct *fs = NULL;
+       int result = -ENOENT;
+
+       if (task) {
+               fs = get_fs_struct(task);
+               put_task_struct(task);
+       }
+       if (fs) {
+               read_lock(&fs->lock);
+               *dentry = dget(fs->shdwpwd);
+               if (fs->shdwpwd)
+                       *mnt = mntget(fs->shdwpwdmnt);
+               else
+                       *mnt = NULL;
+               read_unlock(&fs->lock);
+               if (*dentry)
+                       result = 0;
+               put_fs_struct(fs);
+       }
+       return result;
+}
+
 static int proc_root_link(struct inode *inode, struct dentry **dentry, struct 
vfsmount **mnt)
 {
        struct task_struct *task = get_proc_task(inode);
@@ -192,6 +218,29 @@ static int proc_root_link(struct inode *
        return result;
 }
 
+static int proc_shdwroot_link(struct inode *inode, struct dentry **dentry,
+                             struct vfsmount **mnt)
+{
+       struct task_struct *task = get_proc_task(inode);
+       struct fs_struct *fs = NULL;
+       int result = -ENOENT;
+
+       if (task) {
+               fs = get_fs_struct(task);
+               put_task_struct(task);
+       }
+       if (fs) {
+               read_lock(&fs->lock);
+               *mnt = mntget(fs->shdwrootmnt);
+               *dentry = dget(fs->shdwroot);
+               read_unlock(&fs->lock);
+               if (*dentry)
+                       result = 0;
+               put_fs_struct(fs);
+       }
+       return result;
+}
+
 #define MAY_PTRACE(task) \
        (task == current || \
        (task->parent == current && \
@@ -2094,6 +2143,8 @@ static const struct pid_entry tgid_base_
 #if defined(USE_ELF_CORE_DUMP) && defined(CONFIG_ELF_CORE)
        REG("coredump_filter", S_IRUGO|S_IWUSR, coredump_filter),
 #endif
+       LNK("root-shdw",  shdwroot),
+       LNK("cwd-shdw",   shdwcwd),
 #ifdef CONFIG_TASK_IO_ACCOUNTING
        INF("io",       S_IRUGO, pid_io_accounting),
 #endif
@@ -2377,6 +2428,8 @@ static const struct pid_entry tid_base_s
 #ifdef CONFIG_FAULT_INJECTION
        REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
 #endif
+       LNK("root-shdw", shdwroot),
+       LNK("cwd-shdw",  shdwcwd),
 };
 
 static int proc_tid_base_readdir(struct file * filp,
--- orig/fs/proc/array.c        2007-10-07 19:00:20.000000000 +0200
+++ new/fs/proc/array.c 2007-10-07 19:57:03.000000000 +0200
@@ -298,6 +298,28 @@ static inline char *task_context_switch_
                            p->nivcsw);
 }
 
+static inline char *task_fsinfo(struct task_struct *p, char *buffer)
+{
+       int enabled = 0, use_esc = 0, esc_ch = 0;
+
+       rcu_read_lock();
+       task_lock(p);
+       if (p->fs) {
+               read_lock(&p->fs->lock);
+               enabled = (p->fs->flags & SHDW_ENABLED) ? 1 : 0;
+               use_esc = (p->fs->flags & SHDW_USE_ESC) ? 1 : 0;
+               esc_ch = p->fs->shdw_escch;
+               read_unlock(&p->fs->lock);
+       }
+       task_unlock(p);
+       rcu_read_unlock();
+
+       return buffer + sprintf(buffer, "Shdw_Enabled:\t%d\n"
+                               "Shdw_UseEscChar: %d\n"
+                               "Shdw_EscChar:\t%u\n",
+                               enabled, use_esc, (unsigned int)esc_ch);
+}
+
 int proc_pid_status(struct task_struct *task, char *buffer)
 {
        char *orig = buffer;
@@ -317,6 +339,7 @@ int proc_pid_status(struct task_struct *
        buffer = task_show_regs(task, buffer);
 #endif
        buffer = task_context_switch_counts(task, buffer);
+       buffer = task_fsinfo(task, buffer);
        return buffer - orig;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to