in-core AFS multiplexor and PAG support
Subsystems (6)
PATCH 1/1 in-core AFS multiplexor and PAG support
Hi Linus,
Here's a patch to add three things that are required for AFS and that may be of use to other stuff (such as NFSv4 and Samba):
(1) PAG (Process Authentication Group) support. A PAG is ID'd by a unique number, and is represented in memory as a structure that has a ring of associated authentication tokens.
Each process can either be part of a PAG, or it can PAG-less - in which case it has no authentication tokens.
Two new syscalls are added: setpag and getpag.
(2) Authentication token support. An authentication token is a blob of binary data that is keyed by filesystem name and fs-specific key (such as AFS cell name or SMB workgroup).
These are retained in two places: each PAG has a ring of tokens appropriate to the group of processes within that PAG; and each struct file has a pointer to the single token governing that file (if there is one).
(3) AFS multiplexor support. Not complete at the moment, but implemented far enough to provide access to the PAG mechanism. Further patches will be forthcoming to make this fully functional.
It is my intention to add Trond's vfs_cred stuff in at some point, but that has a lot greater impact than this patch (which has negligible impact).
David
arch/i386/kernel/entry.S +3 -2
@@ -721,7 +721,7 @@ .long sys_bdflush .long sys_sysfs /* 135 */ .long sys_personality - .long sys_ni_syscall /* reserved for afs_syscall */ + .long sys_afs .long sys_setfsuid16 .long sys_setfsgid16 .long sys_llseek /* 140 */
@@ -852,6 +852,7 @@ .long sys_clock_gettime /* 265 */ .long sys_clock_getres .long sys_clock_nanosleep - + .long sys_setpag + .long sys_getpag nr_syscalls=(.-sys_call_table)/4
fs/afssyscall.c +223 -0
223 lines not on this page · raw message
fs/file_table.c +1 -0
@@ -166,6 +166,7 @@if (file->f_op && file->f_op->release) file->f_op->release (inode, file);security_file_free (file); +if (file->f_token)vfs_token_put (file->f_token);fops_put (file->f_op);if (file->f_mode &FMODE_WRITE )put_write_access (inode);
fs/Makefile +2 -1
@@ -10,7 +10,8 @@ namei.o fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \ dcache.o inode.o attr.o bad_inode.o file.o dnotify.o \ filesystems.o namespace.o seq_file.o xattr.o libfs.o \ - fs-writeback.o mpage.o direct-io.o aio.o eventpoll.o + fs-writeback.o mpage.o direct-io.o aio.o eventpoll.o \ + afssyscall.o obj-$(CONFIG_COMPAT) += compat.o
fs/open.c +1 -1
@@ -46,7 +46,7 @@struct nameidata nd;int error; - error =user_path_walk (path, &nd); + error =user_path_walk (path,&nd);if (!error) {struct statfs tmp; error =vfs_statfs (nd.dentry->d_inode->i_sb, &tmp);
fs/proc/array.c +2 -1
@@ -154,13 +154,14 @@read_lock (&tasklist_lock); buffer += sprintf(buffer, "State:\t%s\n" + "Pag:\t%d\n" "Tgid:\t%d\n" "Pid:\t%d\n" "PPid:\t%d\n" "TracerPid:\t%d\n" "Uid:\t%d\t%d\t%d\t%d\n" "Gid:\t%d\t%d\t%d\t%d\n", - get_task_state(p), p->tgid, + get_task_state(p), p->vfspag ? p->vfspag->pag : 0, p->tgid, p->pid, p->pid ? p->real_parent->pid : 0, p->pid && p->ptrace ? p->parent->pid : 0, p->uid, p->euid, p->suid, p->fsuid,
include/asm-i386/posix_types.h +1 -0
@@ -13,6 +13,7 @@typedef unsigned short __kernel_nlink_t ;typedef long __kernel_off_t ;typedef int __kernel_pid_t ; +typedef int __kernel_pag_t ;typedef unsigned short __kernel_ipc_pid_t ;typedef unsigned short __kernel_uid_t ;typedef unsigned short __kernel_gid_t ;
include/asm-i386/unistd.h +3 -1
@@ -273,8 +273,10 @@#define __NR_clock_gettime (__NR_timer_create+6)#define __NR_clock_getres (__NR_timer_create+7)#define __NR_clock_nanosleep (__NR_timer_create+8) +#define __NR_setpag 268 +#define __NR_getpag 269 -#define NR_syscalls 268 +#define NR_syscalls 270/* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
include/linux/afs_syscall.h +159 -0
159 lines not on this page · raw message
include/linux/cred.h +79 -0
79 lines not on this page · raw message
include/linux/fs.h +1 -0
@@ -430,6 +430,7 @@mode_t f_mode;loff_t f_pos;struct fown_struct f_owner; +struct vfs_token *f_token;/* governing credential */ unsigned int f_uid, f_gid;int f_error;struct file_ra_state f_ra;
include/linux/sched.h +2 -0
@@ -28,6 +28,7 @@#include <linux/completion.h> #include <linux/pid.h> #include <linux/percpu.h> +#include <linux/cred.h> struct exec_domain ;
@@ -387,6 +388,7 @@gid_t gid,egid,sgid,fsgid;int ngroups;gid_t groups[NGROUPS ]; +struct vfs_pag *vfspag;kernel_cap_t cap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1;struct user_struct *user;
include/linux/types.h +1 -0
@@ -24,6 +24,7 @@typedef __kernel_nlink_t nlink_t ;typedef __kernel_off_t off_t ;typedef __kernel_pid_t pid_t ; +typedef __kernel_pag_t pag_t ;typedef __kernel_daddr_t daddr_t ;typedef __kernel_key_t key_t ;typedef __kernel_suseconds_t suseconds_t ;
init/main.c +2 -0
@@ -80,6 +80,7 @@extern void pidhash_init (void );extern void pidmap_init (void );extern void pte_chain_init (void ); +extern void credentials_init (void );extern void radix_tree_init (void );extern void free_initmem (void );extern void populate_rootfs (void );
@@ -434,6 +435,7 @@pidmap_init ();pgtable_cache_init ();pte_chain_init (); +credentials_init ();fork_init (num_physpages);proc_caches_init ();security_scaffolding_startup ();
kernel/cred.c +367 -0
367 lines not on this page · raw message
kernel/fork.c +3 -0
@@ -884,6 +884,9 @@if (clone_flags &CLONE_CHILD_SETTID ) p->set_child_tid = child_tidptr; + +if (p->vfspag)vfs_pag_get (p->vfspag); +/* * Clear TID on mm_release()? */
kernel/Makefile +1 -1
@@ -3,7 +3,7 @@ # obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ - exit.o itimer.o time.o softirq.o resource.o \ + cred.o exit.o itimer.o time.o softirq.o resource.o \ sysctl.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o futex.o pid.o \ rcupdate.o intermodule.o extable.o params.o posix-timers.o