You might find it easier to prototype ACLs on reiserfs.

Hans

Andreas Gruenbacher wrote:

> Dear all,
>
> I would like to bring to your attention the current Linux ACL development
> efforts. AFAIK, there are two competing implementations:
>
> ACLs for ext2
>   <http://aerobee.informatik.uni-bremen.de/acl_eng.html>
>
> Posix ACLs for Linux
>   <http://acl.bestbits.at/>
>
> We have started some discussions about general ACL support for Linux on
> <[EMAIL PROTECTED]> (subscription is via <[EMAIL PROTECTED]>).
> Developers from both projects are now on that list.
>
> We have also prepared a patch that prepares the kernel for ACL support
> (attached). This patch is against 2.2.13, but umask handling hasn't changed
> until 2.3.31 at least. Please comment.
>
> Best regards,
> Andreas
>
> [Sorry for the accidental previous posting.]
>
> ------------------------------------------------------------------------
>  Andreas Gruenbacher, [EMAIL PROTECTED]
>  Contact information: http://www.infosys.tuwien.ac.at/~agruenba
>
>   --------------------------------------------------------------------------------
> Move kernel umask handling from VFS to underlying FS
>
> (patch is against linux-2.2.13)
>
> PROBLEM
>   The current VFS applies the current umask to the mode parameter in the
>   create, mkdir, and mknod syscalls prior to passing the mode parameter
>   to the physical filesystems. Some filesystems (especially Posix ACL
>   support for ext2) need the original mode parameter.
>
> SOLUTION
>   Remove umask handling from the VFS, and add it to the physical
>   filesystems.
>
> DEPENDENCIES
>   VFS, all filesystems that support inode creation
>
> (C) Andreas Gruenbacher and Raymond S. Brand
>
> diff -Nur linux-2.2.13/fs/affs/namei.c linux-2.2.13-prep/fs/affs/namei.c
> --- linux-2.2.13/fs/affs/namei.c        Sat Apr 24 06:20:37 1999
> +++ linux-2.2.13-prep/fs/affs/namei.c   Tue Dec  7 05:52:19 1999
> @@ -281,7 +281,7 @@
>         error = affs_add_entry(dir,NULL,inode,dentry,ST_FILE);
>         if (error)
>                 goto out_iput;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         inode->u.affs_i.i_protect = mode_to_prot(inode->i_mode);
>         d_instantiate(dentry,inode);
>         mark_inode_dirty(inode);
> diff -Nur linux-2.2.13/fs/coda/dir.c linux-2.2.13-prep/fs/coda/dir.c
> --- linux-2.2.13/fs/coda/dir.c  Mon Aug  9 21:05:10 1999
> +++ linux-2.2.13-prep/fs/coda/dir.c     Tue Dec  7 05:52:19 1999
> @@ -235,7 +235,7 @@
>         dircnp = ITOC(dir);
>
>         error = venus_create(dir->i_sb, &(dircnp->c_fid), name, length,
> -                               0, mode, 0, &newfid, &attrs);
> +                               0, mode & ~current->fs->umask, 0, &newfid, &attrs);
>
>          if ( error ) {
>                 CDEBUG(D_INODE, "create: %s, result %d\n",
> @@ -280,7 +280,7 @@
>         dircnp = ITOC(dir);
>
>         error = venus_create(dir->i_sb, &(dircnp->c_fid), name, length,
> -                               0, mode, rdev, &newfid, &attrs);
> +                               0, mode & ~current->fs->umask, rdev, &newfid, 
>&attrs);
>
>          if ( error ) {
>                 CDEBUG(D_INODE, "mknod: %s, result %d\n",
> @@ -323,7 +323,7 @@
>         CDEBUG(D_INODE, "mkdir %s (len %d) in %s, mode %o.\n",
>                name, len, coda_f2s(&(dircnp->c_fid)), mode);
>
> -       attr.va_mode = mode;
> +       attr.va_mode = mode & ~current->fs->umask;
>         error = venus_mkdir(dir->i_sb, &(dircnp->c_fid),
>                                name, len, &newfid, &attr);
>
> diff -Nur linux-2.2.13/fs/ext2/ialloc.c linux-2.2.13-prep/fs/ext2/ialloc.c
> --- linux-2.2.13/fs/ext2/ialloc.c       Tue Oct 20 23:08:14 1998
> +++ linux-2.2.13-prep/fs/ext2/ialloc.c  Tue Dec  7 05:52:19 1999
> @@ -460,7 +460,7 @@
>                 cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1);
>         mark_buffer_dirty(sb->u.ext2_sb.s_sbh, 1);
>         sb->s_dirt = 1;
> -       inode->i_mode = mode;
> +       /*inode->i_mode = mode;*/  /* done in ext2_{create,mkdir,mknod} */
>         inode->i_sb = sb;
>         inode->i_nlink = 1;
>         inode->i_dev = sb->s_dev;
> @@ -469,8 +469,8 @@
>                 inode->i_gid = dir->i_gid;
>         else if (dir->i_mode & S_ISGID) {
>                 inode->i_gid = dir->i_gid;
> -               if (S_ISDIR(mode))
> -                       mode |= S_ISGID;
> +               /*if (S_ISDIR(mode))
> +                       mode |= S_ISGID;*/  /* wrong field, but done in 
>ext2_{create,mkdir,mknod} anyway */
>         } else
>                 inode->i_gid = current->fsgid;
>
> diff -Nur linux-2.2.13/fs/ext2/namei.c linux-2.2.13-prep/fs/ext2/namei.c
> --- linux-2.2.13/fs/ext2/namei.c        Wed Oct 20 02:14:01 1999
> +++ linux-2.2.13-prep/fs/ext2/namei.c   Tue Dec  7 05:52:19 1999
> @@ -370,7 +370,7 @@
>                 return err;
>
>         inode->i_op = &ext2_file_inode_operations;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         mark_inode_dirty(inode);
>         bh = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, 
>&err);
>         if (!bh) {
> @@ -406,7 +406,7 @@
>                 goto out;
>
>         inode->i_uid = current->fsuid;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         inode->i_op = NULL;
>         bh = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, 
>&err);
>         if (!bh)
> diff -Nur linux-2.2.13/fs/hfs/dir.c linux-2.2.13-prep/fs/hfs/dir.c
> --- linux-2.2.13/fs/hfs/dir.c   Mon Apr 12 19:03:45 1999
> +++ linux-2.2.13-prep/fs/hfs/dir.c      Tue Dec  7 05:52:19 1999
> @@ -190,7 +190,7 @@
>                 return -EEXIST;
>
>         if ((error = hfs_cat_create(entry, &key,
> -                              (mode & S_IWUSR) ? 0 : HFS_FIL_LOCK,
> +                              (mode & ~current->fs->umask & S_IWUSR) ? 0 : 
>HFS_FIL_LOCK,
>                                HFS_SB(dir->i_sb)->s_type,
>                                HFS_SB(dir->i_sb)->s_creator, &new)))
>                 return error;
> diff -Nur linux-2.2.13/fs/minix/namei.c linux-2.2.13-prep/fs/minix/namei.c
> --- linux-2.2.13/fs/minix/namei.c       Fri May 14 08:25:58 1999
> +++ linux-2.2.13-prep/fs/minix/namei.c  Tue Dec  7 05:52:19 1999
> @@ -221,7 +221,7 @@
>         if (!inode)
>                 return -ENOSPC;
>         inode->i_op = &minix_file_inode_operations;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         mark_inode_dirty(inode);
>         error = minix_add_entry(dir, dentry->d_name.name,
>                                 dentry->d_name.len, &bh ,&de);
> @@ -249,7 +249,7 @@
>         if (!inode)
>                 return -ENOSPC;
>         inode->i_uid = current->fsuid;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         inode->i_op = NULL;
>         if (S_ISREG(inode->i_mode))
>                 inode->i_op = &minix_file_inode_operations;
> diff -Nur linux-2.2.13/fs/namei.c linux-2.2.13-prep/fs/namei.c
> --- linux-2.2.13/fs/namei.c     Wed Oct 20 02:14:02 1999
> +++ linux-2.2.13-prep/fs/namei.c        Tue Dec  7 05:52:19 1999
> @@ -652,7 +652,7 @@
>         struct inode *inode;
>         struct dentry *dentry;
>
> -       mode &= S_IALLUGO & ~current->fs->umask;
> +       mode &= S_IALLUGO /*& ~current->fs->umask*/;  /* done in the filesystem code 
>*/
>         mode |= S_IFREG;
>
>         dentry = lookup_dentry(pathname, NULL, lookup_flags(flag));
> @@ -792,7 +792,7 @@
>         struct dentry *dir;
>         struct dentry *dentry, *retval;
>
> -       mode &= ~current->fs->umask;
> +       /*mode &= ~current->fs->umask;*/  /* done in the filesystem code */
>         dentry = lookup_dentry(filename, NULL, 0);
>         if (IS_ERR(dentry))
>                 return dentry;
> @@ -893,7 +893,7 @@
>                 goto exit_lock;
>
>         DQUOT_INIT(dir->d_inode);
> -       mode &= 0777 & ~current->fs->umask;
> +       mode &= 0777 /*& ~current->fs->umask*/;  /* done in the filesystem code */
>         error = dir->d_inode->i_op->mkdir(dir->d_inode, dentry, mode);
>
>  exit_lock:
> diff -Nur linux-2.2.13/fs/nfs/dir.c linux-2.2.13-prep/fs/nfs/dir.c
> --- linux-2.2.13/fs/nfs/dir.c   Wed Oct 20 02:14:02 1999
> +++ linux-2.2.13-prep/fs/nfs/dir.c      Tue Dec  7 05:52:19 1999
> @@ -624,7 +624,7 @@
>         dfprintk(VFS, "NFS: create(%x/%ld, %s\n",
>                 dir->i_dev, dir->i_ino, dentry->d_name.name);
>
> -       sattr.mode = mode;
> +       sattr.mode = mode & ~current->fs->umask;
>         sattr.uid = sattr.gid = sattr.size = (unsigned) -1;
>         sattr.atime.seconds = sattr.mtime.seconds = (unsigned) -1;
>
> @@ -654,7 +654,7 @@
>         dfprintk(VFS, "NFS: mknod(%x/%ld, %s\n",
>                 dir->i_dev, dir->i_ino, dentry->d_name.name);
>
> -       sattr.mode = mode;
> +       sattr.mode = mode & ~current->fs->umask;
>         sattr.uid = sattr.gid = sattr.size = (unsigned) -1;
>         if (S_ISCHR(mode) || S_ISBLK(mode))
>                 sattr.size = rdev; /* get out your barf bag */
> @@ -683,7 +683,7 @@
>         dfprintk(VFS, "NFS: mkdir(%x/%ld, %s\n",
>                 dir->i_dev, dir->i_ino, dentry->d_name.name);
>
> -       sattr.mode = mode | S_IFDIR;
> +       sattr.mode = (mode & ~current->fs->umask) | S_IFDIR;
>         sattr.uid = sattr.gid = sattr.size = (unsigned) -1;
>         sattr.atime.seconds = sattr.mtime.seconds = (unsigned) -1;
>
> diff -Nur linux-2.2.13/fs/sysv/namei.c linux-2.2.13-prep/fs/sysv/namei.c
> --- linux-2.2.13/fs/sysv/namei.c        Fri May 14 08:25:58 1999
> +++ linux-2.2.13-prep/fs/sysv/namei.c   Tue Dec  7 05:52:19 1999
> @@ -204,7 +204,7 @@
>         if (!inode)
>                 return -ENOSPC;
>         inode->i_op = &sysv_file_inode_operations;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         mark_inode_dirty(inode);
>         error = sysv_add_entry(dir, dentry->d_name.name,
>                                dentry->d_name.len, &bh, &de);
> @@ -238,7 +238,7 @@
>         if (!inode)
>                 return -ENOSPC;
>         inode->i_uid = current->fsuid;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         inode->i_op = NULL;
>         if (S_ISREG(inode->i_mode))
>                 inode->i_op = &sysv_file_inode_operations;
> diff -Nur linux-2.2.13/fs/ufs/namei.c linux-2.2.13-prep/fs/ufs/namei.c
> --- linux-2.2.13/fs/ufs/namei.c Mon May 10 23:14:28 1999
> +++ linux-2.2.13-prep/fs/ufs/namei.c    Tue Dec  7 05:52:19 1999
> @@ -420,11 +420,11 @@
>          */
>         UFSD(("ENTER\n"))
>
> -       inode = ufs_new_inode (dir, mode, &err);
> +       inode = ufs_new_inode (dir, mode & ~current->fs->umask, &err);
>         if (!inode)
>                 return err;
>         inode->i_op = &ufs_file_inode_operations;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         mark_inode_dirty(inode);
>         bh = ufs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
>         if (!bh) {
> @@ -462,12 +462,12 @@
>         flags = sb->u.ufs_sb.s_flags;
>         swab = sb->u.ufs_sb.s_swab;
>
> -       inode = ufs_new_inode (dir, mode, &err);
> +       inode = ufs_new_inode (dir, mode & ~current->fs->umask, &err);
>         if (!inode)
>                 goto out;
>
>         inode->i_uid = current->fsuid;
> -       inode->i_mode = mode;
> +       inode->i_mode = mode & ~current->fs->umask;
>         inode->i_op = NULL;
>         if (S_ISREG(inode->i_mode))
>                 inode->i_op = &ufs_file_inode_operations;
> diff -Nur linux-2.2.13/fs/umsdos/namei.c linux-2.2.13-prep/fs/umsdos/namei.c
> --- linux-2.2.13/fs/umsdos/namei.c      Sat Apr 24 06:20:38 1999
> +++ linux-2.2.13-prep/fs/umsdos/namei.c Tue Dec  7 16:42:54 1999
> @@ -299,7 +299,7 @@
>   */
>  int UMSDOS_create (struct inode *dir, struct dentry *dentry, int mode)
>  {
> -       return umsdos_create_any (dir, dentry, mode, 0, 0);
> +       return umsdos_create_any (dir, dentry, mode & ~current->fs->umask, 0, 0);
>  }
>
>
> @@ -759,7 +759,7 @@
>         if (ret)
>                 goto out;
>
> -       info.entry.mode = mode | S_IFDIR;
> +       info.entry.mode = (mode & ~current->fs->umask) | S_IFDIR;
>         info.entry.rdev = 0;
>         info.entry.uid = current->fsuid;
>         info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
> @@ -845,7 +845,7 @@
>  int UMSDOS_mknod (struct inode *dir, struct dentry *dentry,
>                  int mode, int rdev)
>  {
> -       return umsdos_create_any (dir, dentry, mode, rdev, 0);
> +       return umsdos_create_any (dir, dentry, mode & ~current->fs->umask, rdev, 0);
>  }
>
>  /*

--
Get Linux (http://www.kernel.org) plus ReiserFS
 (http://devlinux.org/namesys).  If you sell an OS or
internet appliance, buy a port of ReiserFS!  If you
need customizations and industrial grade support, we sell them.


Reply via email to