GoboLinux Downloads Documentation Community Recipes Screenshots

GoboLinux Recipe & Package Search Tool

71 versions of Linux.

ProgramAgeSizeByWWWSummary
Linux 4.13.2-r1 791  88794 Luca...
The Linux Kernel.
Linux 4.9.16-r3 962  100651 Luca...
The Linux Kernel.
Linux 4.9.4-r5 1018  99374 Luca...
The Linux Kernel.
Linux 4.8.2-r2 1084  89394 Luca...
The Linux Kernel.
Linux 4.7.4-r1 1154  82767 Luca...
The Linux Kernel.
Linux 4.7.0-r4 1209  82585 Luca...
The Linux Kernel.
Linux 3.13.3-r1 2089  252629 Luca...
The Linux Kernel.
Linux 3.12.6-r1 2149  238949 Luca...
The Linux Kernel.
Linux 3.9.4-r2 2344  70048 Luca...
The Linux Kernel.
Linux 3.7.1-r2 2517  67579 Luca...
The Linux Kernel.
Linux 3.5.0-r1 2668  124391 Luca...
The Linux Kernel.
Linux 3.4.4-r1 2668  124348 Luca...
The Linux Kernel.
Linux 3.3.6-r1 2668  124410 Luca...
The Linux Kernel.
Linux 3.2.12-r2 2796  124345 Luca...
The Linux Kernel.
Linux 3.2.7-r1 2826  123550 Mich...
The Linux Kernel.
Linux 3.1.1-r1 2931  122907 Mich...
The Linux Kernel.
Linux 3.0.4-r4 2992  122754 Luca...
The Linux Kernel.
Linux 2.6.36.3-r1 3215  116087 Diog...
The Linux Kernel.
Linux 2.6.32.3-r1 3593  117990 Luca...
The Linux Kernel.
Linux 2.6.32-r1 3634  117751 Luca...
The Linux Kernel.
Linux 2.6.31.6-r3 3639  126499 Luca...
The Linux Kernel.
Linux 2.6.30.5-r1 3718  166102 Jona...
The Linux Kernel.
Linux 2.6.29.1-r1 3861  117500 Luca...
The Linux Kernel.
Linux 2.6.28.7-r1 3917  115518 Giam...
The Linux Kernel.
Linux 2.6.28.1-r1 3917  115487 Giam...
The Linux Kernel.
Linux 2.6.28-r1 3917  116681 Mich...
The Linux Kernel.
Linux 2.6.27.8-r1 3917  134160 Giam...
The Linux Kernel.
Linux 2.6.27.4-r3 3917  149529 Luca...
The Linux Kernel.
Linux 2.6.25.17-r1 3917  172834 Giam...
The Linux Kernel.
Linux 2.6.25.16-r1 3917  166500 Giam...
The Linux Kernel.
Linux 2.6.25.10-r2 3917  165320 Giam...
The Linux Kernel.
Linux 2.6.25.7-r1 3917  157294 Giam...
The Linux Kernel.
Linux 2.6.25.4-r1 3917  133017 Hopp...
The Linux Kernel.
Linux 2.6.25-r1 3917  133216 Luca...
The Linux Kernel.
Linux 2.6.24.4-r5 3917  150733
The Linux Kernel.
Linux 2.6.24.3-r5 3917  150221 Luca...
The Linux Kernel.
Linux 2.6.24.2-r3 3917  146488 Giam...
The Linux Kernel.
Linux 2.6.24.1-r1 3917  146454 Giam...
The Linux Kernel.
Linux 2.6.24-r1 3917  146428 Luca...
The Linux Kernel.
Linux 2.6.23.8-r4 3917  155842 Luca...
The Linux Kernel.
Linux 2.6.22.7-r4 3917  114727 Luca...
The Linux Kernel.
Linux 2.6.22.1-r1 3917  121391 Luca...
The Linux Kernel.
Linux 2.6.21.1-r3 3917  118854 Luca...
The Linux Kernel.
Linux 2.6.20.7-r1 3917  117945 Luca...
The Linux Kernel.
Linux 2.6.20.4-r3 3917  151150 Luca...
The Linux Kernel.
Linux 2.6.20-r1 3917  106429 Luca...
The Linux Kernel.
Linux 2.6.18.3-r2 3917  111124 Luca...
The Linux Kernel.
Linux 2.6.17.11-r1 3917  164053 Luca...
The Linux Kernel.
Linux 2.6.17.3-r1 3917  165067 Luca...
The Linux Kernel.
Linux 2.6.16.20-r1 3917  133625 Luca...
The Linux Kernel.
Linux 2.6.16.14-r1 3917  168270 Luca...
The Linux Kernel.
Linux 2.6.15.5-r1 3917  224686 Jona...
The Linux Kernel.
Linux 2.6.15.2-r1 3917  177165 Carl...
The Linux Kernel.
view entry at GitHub | download recipe.bz2 file
01-gobohide.patch
02-squashfs2.2.patch
03-squashfs-gobohide.patch
04-devfs.patch
05-bootsplash-3.1.6.patch
06-bootsplash-generic_fbdev.patch
07-unionfs_kmod.patch
Recipe
Resources/Dependencies
Resources/Description
Resources/NewDependencies
i686/Recipe
i686/dot-config
ppc/Recipe
ppc/dot-config
diff -X dontdiff-2.6 -Nurp linux-2.6.15/Makefile linux-2.6.15-lucasvr/Makefile
--- linux-2.6.15/Makefile	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/Makefile	2006-01-08 21:07:43.000000000 -0200
@@ -584,7 +584,7 @@ export MODLIB
 
 
 ifeq ($(KBUILD_EXTMOD),)
-core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
+core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/ gobolinux/
 
 vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
 		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/Kconfig linux-2.6.15-lucasvr/fs/Kconfig
--- linux-2.6.15/fs/Kconfig	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/Kconfig	2006-01-08 21:07:13.000000000 -0200
@@ -1167,6 +1167,18 @@ config VXFS_FS
 	  To compile this as a module, choose M here: the module will be
 	  called freevxfs.  If unsure, say N.
 
+config GOBOHIDE_FS
+	bool "GoboHide support on file systems"
+	default y
+	help
+	  GoboHide is a general interface for providing real hidden files 
+	  in a filesystem. Current supported filesystems are EXT2, EXT3, 
+	  ISOFS, JFS, JFFS2, ReiserFS, XFS and SquashFS.
+	  This patch was created especially for GoboLinux, in order to remove
+	  the legacy tree from the usual system view.
+	  To use it, see the documentation of the gobohide userspace tool.
+
+	  GoboLinux users will normally want to say Y.
 
 config HPFS_FS
 	tristate "OS/2 HPFS file system support"
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/ext2/dir.c linux-2.6.15-lucasvr/fs/ext2/dir.c
--- linux-2.6.15/fs/ext2/dir.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/ext2/dir.c	2006-01-08 21:07:13.000000000 -0200
@@ -24,6 +24,7 @@
 #include "ext2.h"
 #include <linux/pagemap.h>
 #include <linux/smp_lock.h>
+#include <linux/gobolinux.h>
 
 typedef struct ext2_dir_entry_2 ext2_dirent;
 
@@ -293,7 +294,11 @@ ext2_readdir (struct file * filp, void *
 				ext2_put_page(page);
 				goto done;
 			}
+#ifdef CONFIG_GOBOHIDE_FS
+			if (de->inode && (gobolinux_hide (de->inode, inode) <= 0)) {
+#else
 			if (de->inode) {
+#endif
 				int over;
 				unsigned char d_type = DT_UNKNOWN;
 
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/ext3/dir.c linux-2.6.15-lucasvr/fs/ext3/dir.c
--- linux-2.6.15/fs/ext3/dir.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/ext3/dir.c	2006-01-08 21:07:13.000000000 -0200
@@ -28,6 +28,7 @@
 #include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <linux/rbtree.h>
+#include <linux/gobolinux.h>
 
 static unsigned char ext3_filetype_table[] = {
 	DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK
@@ -198,7 +199,12 @@ revalidate:
 				goto out;
 			}
 			offset += le16_to_cpu(de->rec_len);
+#ifdef CONFIG_GOBOHIDE_FS
+			if (le32_to_cpu(de->inode) && 
+			(gobolinux_hide (le32_to_cpu(de->inode), inode) <= 0)) {
+#else
 			if (le32_to_cpu(de->inode)) {
+#endif
 				/* We might block in the next section
 				 * if the data destination is
 				 * currently swapped out.  So, use a
@@ -490,7 +496,12 @@ static int ext3_dx_readdir(struct file *
 		fname = rb_entry(info->curr_node, struct fname, rb_hash);
 		info->curr_hash = fname->hash;
 		info->curr_minor_hash = fname->minor_hash;
+#ifdef CONFIG_GOBOHIDE_FS
+		if ((gobolinux_hide (fname->inode, inode) <= 0) &&
+			call_filldir(filp, dirent, filldir, fname))
+#else
 		if (call_filldir(filp, dirent, filldir, fname))
+#endif
 			break;
 
 		info->curr_node = rb_next(info->curr_node);
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/ioctl.c linux-2.6.15-lucasvr/fs/ioctl.c
--- linux-2.6.15/fs/ioctl.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/ioctl.c	2006-01-08 21:07:13.000000000 -0200
@@ -12,6 +12,7 @@
 #include <linux/fs.h>
 #include <linux/security.h>
 #include <linux/module.h>
+#include <linux/gobolinux.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -146,6 +147,19 @@ int vfs_ioctl(struct file *filp, unsigne
 			else
 				error = -ENOTTY;
 			break;
+#ifdef CONFIG_GOBOHIDE_FS
+		case FIGOBOLINUX:
+			do {
+				struct inode *inode = filp->f_dentry->d_inode;
+
+				if (!arg) {
+					error = -EINVAL;
+					break;
+				}
+				error = gobolinux_fs_ioctl (inode, (struct gobolinux_hide *) arg);
+			}while (0);
+			break;
+#endif
 		default:
 			if (S_ISREG(filp->f_dentry->d_inode->i_mode))
 				error = file_ioctl(filp, cmd, arg);
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/isofs/dir.c linux-2.6.15-lucasvr/fs/isofs/dir.c
--- linux-2.6.15/fs/isofs/dir.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/isofs/dir.c	2006-01-08 21:07:13.000000000 -0200
@@ -12,6 +12,7 @@
  */
 #include <linux/config.h>
 #include <linux/smp_lock.h>
+#include <linux/gobolinux.h>
 #include "isofs.h"
 
 static int isofs_readdir(struct file *, void *, filldir_t);
@@ -172,6 +173,10 @@ static int do_isofs_readdir(struct inode
 		}
 		first_de = 1;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		if (inode_number && (gobolinux_hide (inode_number, inode) > 0))
+			continue;
+#endif
 		/* Handle the case of the '.' directory */
 		if (de->name_len[0] == 1 && de->name[0] == 0) {
 			if (filldir(dirent, ".", 1, filp->f_pos, inode->i_ino, DT_DIR) < 0)
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/jffs2/dir.c linux-2.6.15-lucasvr/fs/jffs2/dir.c
--- linux-2.6.15/fs/jffs2/dir.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/jffs2/dir.c	2006-01-08 21:07:13.000000000 -0200
@@ -20,6 +20,7 @@
 #include <linux/jffs2_fs_i.h>
 #include <linux/jffs2_fs_sb.h>
 #include <linux/time.h>
+#include <linux/gobolinux.h>
 #include "nodelist.h"
 
 static int jffs2_readdir (struct file *, void *, filldir_t);
@@ -157,6 +158,14 @@ static int jffs2_readdir(struct file *fi
 			continue;
 		}
 		D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, \
fd->ino, fd->type));
+
+#ifdef CONFIG_GOBOHIDE_FS
+		if (gobolinux_hide (fd->ino, inode) > 0) {
+			offset++;
+			continue;
+		}
+#endif
+		
 		if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
 			break;
 		offset++;
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/jfs/jfs_dtree.c linux-2.6.15-lucasvr/fs/jfs/jfs_dtree.c
--- linux-2.6.15/fs/jfs/jfs_dtree.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/jfs/jfs_dtree.c	2006-01-08 21:07:13.000000000 -0200
@@ -102,6 +102,7 @@
 
 #include <linux/fs.h>
 #include <linux/quotaops.h>
+#include <linux/gobolinux.h>
 #include "jfs_incore.h"
 #include "jfs_superblock.h"
 #include "jfs_filsys.h"
@@ -3195,7 +3196,11 @@ int jfs_readdir(struct file *filp, void 
 				overflow = 1;
 				break;
 			}
-
+#ifdef CONFIG_GOBOHIDE_FS
+			/* Check if inode is in the GoboLinux hidden list */
+			if (d->inumber && (gobolinux_hide(d->inumber, ip) > 0))
+				continue;
+#endif
 			d_namleft = d->namlen;
 			name_ptr = jfs_dirent->name;
 			jfs_dirent->ino = le32_to_cpu(d->inumber);
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/namei.c linux-2.6.15-lucasvr/fs/namei.c
--- linux-2.6.15/fs/namei.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/namei.c	2006-01-08 21:08:01.000000000 -0200
@@ -1,4 +1,4 @@
-/*
+	/*
  *  linux/fs/namei.c
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
@@ -29,6 +29,7 @@
 #include <linux/mount.h>
 #include <linux/audit.h>
 #include <linux/file.h>
+#include <linux/gobolinux.h>
 #include <asm/namei.h>
 #include <asm/uaccess.h>
 
@@ -1899,6 +1900,10 @@ int vfs_rmdir(struct inode *dir, struct 
 	}
 	up(&dentry->d_inode->i_sem);
 	if (!error) {
+#ifdef CONFIG_GOBOHIDE_FS
+		if (gobolinux_hide(dentry->d_inode->i_ino, dir) > 0)
+			gobolinux_inode_del(dentry->d_inode->i_ino);
+#endif
 		d_delete(dentry);
 	}
 	dput(dentry);
@@ -1971,6 +1976,11 @@ int vfs_unlink(struct inode *dir, struct
 
 	/* We don't d_delete() NFS sillyrenamed files--they still exist. */
 	if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
+#ifdef CONFIG_GOBOHIDE_FS
+		if (dentry->d_inode && (S_ISLNK(dentry->d_inode->i_mode) || S_ISDIR(dentry->d_inode->i_mode)))
+			if (gobolinux_hide(dentry->d_inode->i_ino, dir) > 0)
+				gobolinux_inode_del(dentry->d_inode->i_ino);
+#endif
 		d_delete(dentry);
 	}
 
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/reiserfs/dir.c linux-2.6.15-lucasvr/fs/reiserfs/dir.c
--- linux-2.6.15/fs/reiserfs/dir.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/reiserfs/dir.c	2006-01-08 21:07:13.000000000 -0200
@@ -10,6 +10,7 @@
 #include <linux/stat.h>
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
+#include <linux/gobolinux.h>
 #include <asm/uaccess.h>
 
 extern struct reiserfs_key MIN_KEY;
@@ -147,6 +148,9 @@ static int reiserfs_readdir(struct file 
 				d_off = deh_offset(deh);
 				filp->f_pos = d_off;
 				d_ino = deh_objectid(deh);
+#ifdef CONFIG_GOBOHIDE_FS
+				if (gobolinux_hide (d_ino, inode) > 0) continue;
+#endif
 				if (d_reclen <= 32) {
 					local_buf = small_buf;
 				} else {
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/xfs/xfs_dir2_block.c linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_block.c
--- linux-2.6.15/fs/xfs/xfs_dir2_block.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_block.c	2006-01-08 21:07:13.000000000 -0200
@@ -41,6 +41,8 @@
 #include "xfs_dir2_trace.h"
 #include "xfs_error.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * Local function prototypes.
  */
@@ -514,6 +516,15 @@ xfs_dir2_block_getdents(
 #endif
 		p.name = (char *)dep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		/* Check if inode is in the GoboLinux hidden list */
+		{
+			struct vnode *vnode = XFS_ITOV (dp);
+			if (p.ino && (gobolinux_hide (p.ino, &vnode->v_inode)) > 0)
+				continue;
+		}
+#endif
+
 		/*
 		 * Put the entry in the caller's buffer.
 		 */
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/xfs/xfs_dir2_leaf.c linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_leaf.c
--- linux-2.6.15/fs/xfs/xfs_dir2_leaf.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_leaf.c	2006-01-08 21:07:13.000000000 -0200
@@ -58,6 +58,8 @@ static void xfs_dir2_leaf_log_bests(stru
 static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf *bp);
 
 
+#include <linux/gobolinux.h>
+
 /*
  * Convert a block form directory to a leaf form directory.
  */
@@ -1104,6 +1106,15 @@ xfs_dir2_leaf_getdents(
 #endif
 		p.name = (char *)dep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		/* Check if inode is in the GoboLinux hidden list */
+		{
+			struct vnode *vnode = XFS_ITOV (dp);
+			if (p.ino && (gobolinux_hide (p.ino, &vnode->v_inode)) > 0)
+				continue;
+		}
+#endif
+		
 		error = p.put(&p);
 
 		/*
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/xfs/xfs_dir2_sf.c linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_sf.c
--- linux-2.6.15/fs/xfs/xfs_dir2_sf.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/xfs/xfs_dir2_sf.c	2006-01-08 21:07:13.000000000 -0200
@@ -41,6 +41,8 @@
 #include "xfs_dir2_block.h"
 #include "xfs_dir2_trace.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * Prototypes for internal functions.
  */
@@ -821,6 +823,15 @@ xfs_dir2_sf_getdents(
 #endif
 		p.name = (char *)sfep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		/* Check if inode is in the GoboLinux hidden list */
+		{
+			struct vnode *vnode = XFS_ITOV (dp);
+			if (p.ino && (gobolinux_hide (p.ino, &vnode->v_inode)) > 0)
+				continue;
+		}
+#endif
+		
 		error = p.put(&p);
 
 		if (!p.done) {
diff -X dontdiff-2.6 -Nurp linux-2.6.15/fs/xfs/xfs_dir_leaf.c linux-2.6.15-lucasvr/fs/xfs/xfs_dir_leaf.c
--- linux-2.6.15/fs/xfs/xfs_dir_leaf.c	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/fs/xfs/xfs_dir_leaf.c	2006-01-08 21:07:13.000000000 -0200
@@ -42,6 +42,8 @@
 #include "xfs_dir_leaf.h"
 #include "xfs_error.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * xfs_dir_leaf.c
  *
@@ -549,6 +551,16 @@ xfs_dir_shortform_getdents(xfs_inode_t *
 #endif
 		p.name = sbp->name;
 		p.namelen = sbp->namelen;
+
+#ifdef CONFIG_GOBOHIDE_FS
+		/* Check if inode is in the GoboLinux hidden list */
+		{
+			struct vnode *vnode = XFS_ITOV (dp);
+			if ((gobolinux_hide (p.ino, &vnode->v_inode)) > 0)
+				continue;
+		}
+#endif
+
 		retval = p.put(&p);
 		if (!p.done) {
 			uio->uio_offset =
@@ -2129,6 +2141,15 @@ xfs_dir_leaf_getdents_int(
 		p.name = (char *)namest->name;
 		p.namelen = entry->namelen;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		/* Check if inode is in the GoboLinux hidden list */
+		{
+			struct vnode *vnode = XFS_ITOV (dp);
+			if ((gobolinux_hide (p.ino, &vnode->v_inode)) > 0)
+				continue;
+		}
+#endif
+		
 		retval = p.put(&p);
 
 		if (!p.done) {
diff -X dontdiff-2.6 -Nurp linux-2.6.15/gobolinux/Makefile linux-2.6.15-lucasvr/gobolinux/Makefile
--- linux-2.6.15/gobolinux/Makefile	1969-12-31 21:00:00.000000000 -0300
+++ linux-2.6.15-lucasvr/gobolinux/Makefile	2006-01-08 21:07:13.000000000 -0200
@@ -0,0 +1,5 @@
+#
+# Makefile for the gobolinux features
+#
+
+obj-$(CONFIG_GOBOHIDE_FS) := fs/
diff -X dontdiff-2.6 -Nurp linux-2.6.15/gobolinux/fs/Makefile linux-2.6.15-lucasvr/gobolinux/fs/Makefile
--- linux-2.6.15/gobolinux/fs/Makefile	1969-12-31 21:00:00.000000000 -0300
+++ linux-2.6.15-lucasvr/gobolinux/fs/Makefile	2006-01-08 21:07:13.000000000 -0200
@@ -0,0 +1,5 @@
+#
+# Makefile for the gobolinux-fs features
+#
+
+obj-$(CONFIG_GOBOHIDE_FS) := ioctl.o gobohide.o
diff -X dontdiff-2.6 -Nurp linux-2.6.15/gobolinux/fs/gobohide.c linux-2.6.15-lucasvr/gobolinux/fs/gobohide.c
--- linux-2.6.15/gobolinux/fs/gobohide.c	1969-12-31 21:00:00.000000000 -0300
+++ linux-2.6.15-lucasvr/gobolinux/fs/gobohide.c	2006-01-08 21:07:13.000000000 -0200
@@ -0,0 +1,271 @@
+/*
+ * gobolinux.c: Modifications (features/bug fixes) used by the 
+ * GoboLinux distro
+ */
+
+/*
+ * Copyright (C) 2002 CScience.ORG World Domination Inc.
+ *
+ * These modifications are released under the GNU General Public License
+ * version 2 or later, incorporated herein by reference.
+ * Modifications/features/bug fixes based on or derived from this code 
+ * fall under the GPL and must retain the authorship, copyright and license 
+ * notice.  This file is not a complete program and may only be used when 
+ * the entire operating system is licensed under the GPL. 
+ *
+ * See the file COPYING in this distribution for more information.
+ *
+ * Author: Felipe W Damasio <felipewd@terra.com.br>.
+ * Original idea: Lucas C V Real <lucasvr@gobolinux.org>
+ *
+ * Changes:
+ * 21-Feb-2004 - Lucas C. Villa Real
+ *              Added an extra check for the inode's VFS root, so that
+ *              the same inode number on different partitions don't get
+ *              hidden mistakenly.
+ *              
+ * 11-Nov-2003 - Lucas C. Villa Real
+ *              Removed the spinlocks from gobolinux_show_hidden(), since
+ *              we were already working with list_for_each_safe(), which
+ *              iterates safely against removal of list entries.
+ *
+ * 05-May-2003 - Felipe W Damasio
+ *              Using read-write locks instead of spinlocks,
+ *              improving quite a bit read operations
+ *              (allow concurrent readers, but only a single writer)
+ *
+ * 28-Apr-2003 - Lucas C. Villa Real
+ *              Centralized checks for UID on gobolinux/fs/ioctl.c.
+ *              Fixed get_free_page() to work on 64-bit archs as well.
+ *
+ * 12-Apr-2003 - Lucas C. Villa Real
+ *              Removed support for UID's different than 0 hide inodes.
+ *              
+ * 24-Mar-2003 - Lucas C. Villa Real
+ *              Modified struct hide and calls so we have pathnames related
+ *              to the "real" root dir and not the the mount point.
+ *              
+ * 17-Mar-2003 - Lucas C. Villa Real
+ *              Added support for full pathname, rather than dealing only
+ *              with inode numbers.
+ *
+ * 10-Jan-2003 - Lucas C. Villa Real
+ *              Added statistics support.
+ */
+#include <linux/fs.h>
+#include <linux/namei.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/file.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gobolinux.h>
+#include <linux/spinlock.h>
+#include <linux/proc_fs.h>
+#include <linux/stat.h>
+#include <linux/mount.h>
+
+#include <asm/uaccess.h>
+
+static LIST_HEAD(inode_list);
+static rwlock_t inode_lock = RW_LOCK_UNLOCKED;
+
+/**
+ * gobolinux_count_hidden - Count how many inodes a given user is hiding
+ * @hide: the structure containing a pointer to store the number of inodes 
+ *        hidden.
+ */
+int gobolinux_count_hidden (struct gobolinux_hide *hide)
+{
+	struct list_head *p, *next;
+	struct hide *inode;
+	unsigned long flags;
+	
+	hide->stats.hidden_inodes = 0;
+	
+	read_lock_irqsave (&inode_lock, flags);
+	list_for_each_safe(p, next, &inode_list) {
+		inode = list_entry(p, struct hide, head);
+		if (inode)
+			hide->stats.hidden_inodes++;
+	}
+	read_unlock_irqrestore (&inode_lock, flags);
+	return 0;
+}
+
+/**
+ * gobolinux_show_hidden - List the hidden inodes for a given user
+ * @hide: the structure containing a pointer to a previous-allocated array
+ *        of no more than @hide->stats.hidden_inodes elements of unsigned long. \

+ *
+ * This array is filled with the directories being hidden.
+ */
+int gobolinux_show_hidden (struct gobolinux_hide *hide)
+{
+	int ret = 0;
+	struct list_head *p, *next;
+	struct hide *inode;
+	unsigned long page;
+	
+	hide->stats.filled_size = 0;
+	page = __get_free_page (GFP_USER);
+	if (!page) {
+		ret = -ENOMEM;
+		goto out;
+	}
+	
+	list_for_each_safe(p, next, &inode_list) {
+		inode = list_entry(p, struct hide, head);
+		
+		if (inode && (hide->stats.filled_size < hide->stats.hidden_inodes)) {
+			int len;
+			char *pathname = d_path (inode->filp->f_dentry, 
+					         inode->filp->f_vfsmnt,
+						 (char *) page, 
+						 PAGE_SIZE);
+			len = PAGE_SIZE + page - (unsigned long) pathname;
+			if (copy_to_user(hide->stats.hidden_list[hide->stats.filled_size++],
+				pathname, len < PATH_MAX ? len : PATH_MAX)) {
+				ret = -EFAULT;
+				goto out_free;
+			}
+		} 
+	}
+
+out_free:
+	free_page (page);
+out:
+	return ret;
+}
+
+/**
+ * gobolinux_get_filp - Returns the struct file related to a
+ *                      given descriptor.
+ * @ino: the inode number
+ * @pathname: the pathname associated with @ino
+ */
+struct file *gobolinux_get_filp (ino_t ino, const char *pathname, int *ret)
+{
+	struct nameidata nd;
+	
+	*ret = user_path_walk_link (pathname, &nd);
+	if (*ret)
+		return NULL;
+
+	if (nd.dentry->d_inode->i_ino == ino)
+		return dentry_open (nd.dentry, nd.mnt, 0);
+	return NULL;
+}
+
+/**
+ * gobolinux_inode_add - Add the inode to the "must hide" list 
+ * @ino: inode to be added
+ * @pathname: the pathname associated with @ino
+ */
+int gobolinux_inode_add (ino_t ino, const char *pathname)
+{
+	int ret = 0;
+	struct hide *n;
+	struct file *filp;
+	struct inode part_info;
+	unsigned long flags;
+	
+	filp = gobolinux_get_filp (ino, pathname, &ret);
+	if (!filp) 
+		goto out;
+	
+	part_info.i_sb = filp->f_dentry->d_sb;
+	if (gobolinux_hide (ino, &part_info)) {
+		ret = -EEXIST;
+		goto out;
+	}	
+	
+	n = kmalloc (sizeof (struct hide), GFP_KERNEL);
+	if (!n) {
+		ret = -ENOMEM;
+		goto out;
+	}
+	
+	write_lock_irqsave (&inode_lock, flags);
+	n->filp = filp;
+	INIT_LIST_HEAD(&n->head);
+	
+	list_add (&n->head, &inode_list);
+	write_unlock_irqrestore (&inode_lock, flags);
+out:
+	return ret;
+}
+
+/**
+ * gobolinux_inode_del - Remove the inode from the "must hide" list 
+ * @ino: inode to be removed
+ */
+int gobolinux_inode_del (ino_t ino)
+{
+	struct list_head *p, *next;
+	struct hide *inode;
+	unsigned long flags;
+	
+	write_lock_irqsave (&inode_lock, flags);
+	list_for_each_safe(p, next, &inode_list) {
+		inode = list_entry(p, struct hide, head);
+		if (inode && (inode->filp->f_dentry->d_inode->i_ino== ino)) {
+			list_del(&inode->head);
+			kfree (inode);
+			goto out;
+		}
+	}
+out:
+	write_unlock_irqrestore (&inode_lock, flags);
+	return 0;
+}
+
+/** 
+ * gobolinux_hide - Test if the inode is in the "must hide" list.
+ * @ino: inode being readdir'd
+ *
+ * Should be pretty straight-forward: If the inode number is in
+ * the inode_list, returns 1. If it isn't, returns 0.
+ * Returns -1 if an invalid inode is received 
+ */
+int gobolinux_hide (ino_t ino, struct inode *part_info)
+{
+	struct list_head *p;
+	int ret = -1;
+	struct hide *inode;
+	unsigned long flags;
+	
+	if (!ino)
+		goto out;
+
+	ret = 0;
+/** 
+ * FIXME: We are O(n) for searches. We could be at least O(n/2) with
+ * binary searches.
+ */
+	read_lock_irqsave (&inode_lock, flags);
+	list_for_each(p, &inode_list) {
+		inode = list_entry (p, struct hide, head);
+		if (inode->filp->f_dentry->d_inode->i_ino == ino) {
+			if (inode->filp->f_dentry->d_sb == part_info->i_sb) {
+				ret = 1;
+			}
+			break;
+		}
+	}
+	read_unlock_irqrestore (&inode_lock, flags);
+out:
+	return ret;
+}
+
+/* We need to export this function to add support on a specific FS */
+EXPORT_SYMBOL(gobolinux_hide);
+
+/**
+ * These are only exported for the ioctl handler's sake 
+ */
+EXPORT_SYMBOL(gobolinux_inode_add);
+EXPORT_SYMBOL(gobolinux_inode_del);
+EXPORT_SYMBOL(gobolinux_show_hidden);
+EXPORT_SYMBOL(gobolinux_count_hidden);
diff -X dontdiff-2.6 -Nurp linux-2.6.15/gobolinux/fs/ioctl.c linux-2.6.15-lucasvr/gobolinux/fs/ioctl.c
--- linux-2.6.15/gobolinux/fs/ioctl.c	1969-12-31 21:00:00.000000000 -0300
+++ linux-2.6.15-lucasvr/gobolinux/fs/ioctl.c	2006-01-08 21:08:14.000000000 -0200
@@ -0,0 +1,84 @@
+/*
+ * ioctl.c: ioctl handling for gobolinux-fs
+ */
+
+/*
+ * Copyright (C) 2002 CScience.ORG World Domination Inc.
+ *
+ * These modifications are released under the GNU General Public License
+ * version 2 or later, incorporated herein by reference.
+ * Modifications/features/bug fixes based on or derived from this code 
+ * fall under the GPL and must retain the authorship, copyright and license 
+ * notice.  This file is not a complete program and may only be used when 
+ * the entire operating system is licensed under the GPL. 
+ *
+ * See the file COPYING in this distribution for more information.
+ *
+ * Author: Felipe W Damasio <felipewd@terra.com.br>.
+ *
+ * Changes:
+ * 18-Oct-2005 - Lucas C. Villa Real
+ *              Allowing to hide symlinks which points to files
+ */
+
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/file.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gobolinux.h>
+#include <linux/spinlock.h>
+
+/** 
+ * gobolinux_fs_ioctl - Handle fs-related ioctls 
+ * @inode: inode number being added/removed from the hide-list
+ * @hide: structure containing the user's request 
+ */
+
+int
+gobolinux_fs_ioctl (struct inode *inode, struct gobolinux_hide *hide)
+{
+	int error = 0;
+	
+	if (!hide) {
+		error = -EFAULT;
+		goto out;
+	}
+
+	/* We only support symbolic links and directories */
+	if (hide->inode && !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) {
+		error = -EINVAL;
+		goto out;
+	}
+
+	/* We only allow process with admin privileges 
+	 * to use the fs-related gobo ioctls 
+	 */
+	if (current->uid != 0 && current->euid != 0) {
+		error = -EPERM;
+		goto out;
+	}
+
+	switch (hide->operation) {
+		case GOBOLINUX_HIDEINODE:
+			error = gobolinux_inode_add (hide->inode, hide->pathname);
+			break;
+		case GOBOLINUX_UNHIDEINODE:
+			error = gobolinux_inode_del (hide->inode);
+			break;
+		case GETSTATSUIDNUMBER:
+			error = gobolinux_count_hidden (hide);
+			break;
+		case GETSTATSUID:
+			error = gobolinux_show_hidden (hide);
+			break;
+		default: return -EOPNOTSUPP;
+	}
+
+out:
+	return error;
+}
+
+EXPORT_SYMBOL(gobolinux_fs_ioctl);
diff -X dontdiff-2.6 -Nurp linux-2.6.15/include/linux/fs.h linux-2.6.15-lucasvr/include/linux/fs.h
--- linux-2.6.15/include/linux/fs.h	2006-01-03 01:21:10.000000000 -0200
+++ linux-2.6.15-lucasvr/include/linux/fs.h	2006-01-08 21:07:13.000000000 -0200
@@ -204,7 +204,7 @@ extern int dir_notify_enable;
 #define BMAP_IOCTL 1		/* obsolete - kept for compatibility */
 #define FIBMAP	   _IO(0x00,1)	/* bmap access */
 #define FIGETBSZ   _IO(0x00,2)	/* get the block size used for bmap */
-
+#define FIGOBOLINUX _IOW(0x00, 0x22,size_t) /* gobolinux-fs ioctl */
 #ifdef __KERNEL__
 
 #include <linux/linkage.h>
diff -X dontdiff-2.6 -Nurp linux-2.6.15/include/linux/gobolinux.h linux-2.6.15-lucasvr/include/linux/gobolinux.h
--- linux-2.6.15/include/linux/gobolinux.h	1969-12-31 21:00:00.000000000 -0300
+++ linux-2.6.15-lucasvr/include/linux/gobolinux.h	2006-01-08 21:07:13.000000000 \
-0200
@@ -0,0 +1,43 @@
+#ifndef _LINUX_GOBOLINUX_H
+#define _LINUX_GOBOLINUX_H
+
+#ifdef CONFIG_GOBOHIDE_FS
+#include <linux/fs.h>
+
+/* Gobolinux internal ioctls */
+
+#define GOBOLINUX_HIDEINODE   0x0000001 /* Hide a given inode number */
+#define GOBOLINUX_UNHIDEINODE 0x0000002 /* Unhide a given inode number */
+#define GETSTATSUIDNUMBER     0x0000003 /* Get the _number_ of inodes 
+					   being hidden */
+#define GETSTATSUID           0x0000004 /* Get the inodes hidden */
+
+struct hide {
+	struct file *filp;      /* a file pointer, used to recover the inode's pathname \
*/
+	struct list_head head;  /* a simple doubly linked list */
+};
+
+struct gobolinux_hide_stats {
+	int hidden_inodes;      /* how many inodes we're hiding */
+	int filled_size;        /* how many inodes we filled on the hidden_list */
+	char **hidden_list;     /* the hidden list */
+};
+
+struct gobolinux_hide {
+	ino_t inode;                        /* the inode number */
+	const char *pathname;               /* the pathname being submitted */
+	char symlink;                       /* is inode a symlink? */
+	char operation;                     /* the operation to be performed */
+	struct gobolinux_hide_stats stats;  /* statistics about the inodes being hidden \
*/
+};
+
+struct dentry *gobolinux_get_dentry (ino_t ino, const char *pathname);
+int  gobolinux_count_hidden (struct gobolinux_hide *hide);
+int  gobolinux_show_hidden (struct gobolinux_hide *hide);
+int  gobolinux_hide (ino_t ino, struct inode *part_info); 
+int  gobolinux_inode_add (ino_t ino, const char *pathname);
+int  gobolinux_inode_del (ino_t ino);
+int  gobolinux_fs_ioctl (struct inode *inode, struct gobolinux_hide *hide);
+
+#endif  /* CONFIG_GOBOHIDE_FS */
+#endif  /* _LINUX_GOBOLINUX_H */
Linux 2.6.15.1-r1 3917  149219 Jona...
The Linux Kernel.
Linux 2.6.15-r1 3917  149214 Luca...
The Linux Kernel.
Linux 2.6.14.4-r1 3917  150166 Jona...
The Linux Kernel.
Linux 2.6.14.3-r1 3917  150060 Jona...
The Linux Kernel.
Linux 2.6.14.2-r1 3917  149791 Carl...
The Linux Kernel.
Linux 2.6.13.4-r1 3917  149559 Luca...
The Linux Kernel.
Linux 2.6.13.2-r1 3917  56611 Jona...
The Linux Kernel.
Linux 2.6.13.1-r1 3917  56378 Luca...
The Linux Kernel.
Linux 2.6.12.2-r1 3917  50355 Luca...
The Linux Kernel.
Linux 2.6.11.9-r1 3917  98969 Luca...
The Linux Kernel.
Linux 2.6.11.8-r1 3917  109424 Jona...
The Linux Kernel.
Linux 2.6.11-r1 3917  99032 Luca...
The Linux Kernel.
Linux 2.6.10-r1 3917  65969 Luca...
The Linux Kernel.
Linux 2.6.9-r1 3917  278461 Luca...
The Linux Kernel.
Linux 2.6.8.1-r1 3917  35576 Luca...
The Linux Kernel.
Linux 2.6.7-r1 3917  22610 Luca...
The Linux Kernel.
Linux 2.6.6-r1 3917  21958 Luca...
The Linux Kernel.
Linux 2.4.26-r1 3917  22359 Luca...
The Linux Kernel.