GoboLinux Downloads Documentation Community Recipes Screenshots

GoboLinux Recipe & Package Search Tool

71 versions of Linux.

ProgramAgeSizeByWWWSummary
Linux 4.13.2-r1 878  88794 Luca...
The Linux Kernel.
Linux 4.9.16-r3 1049  100651 Luca...
The Linux Kernel.
Linux 4.9.4-r5 1105  99374 Luca...
The Linux Kernel.
Linux 4.8.2-r2 1171  89394 Luca...
The Linux Kernel.
Linux 4.7.4-r1 1241  82767 Luca...
The Linux Kernel.
Linux 4.7.0-r4 1296  82585 Luca...
The Linux Kernel.
Linux 3.13.3-r1 2176  252629 Luca...
The Linux Kernel.
Linux 3.12.6-r1 2236  238949 Luca...
The Linux Kernel.
Linux 3.9.4-r2 2431  70048 Luca...
The Linux Kernel.
Linux 3.7.1-r2 2604  67579 Luca...
The Linux Kernel.
Linux 3.5.0-r1 2755  124391 Luca...
The Linux Kernel.
Linux 3.4.4-r1 2755  124348 Luca...
The Linux Kernel.
Linux 3.3.6-r1 2755  124410 Luca...
The Linux Kernel.
Linux 3.2.12-r2 2883  124345 Luca...
The Linux Kernel.
Linux 3.2.7-r1 2913  123550 Mich...
The Linux Kernel.
Linux 3.1.1-r1 3018  122907 Mich...
The Linux Kernel.
Linux 3.0.4-r4 3079  122754 Luca...
The Linux Kernel.
Linux 2.6.36.3-r1 3302  116087 Diog...
The Linux Kernel.
Linux 2.6.32.3-r1 3680  117990 Luca...
The Linux Kernel.
Linux 2.6.32-r1 3721  117751 Luca...
The Linux Kernel.
Linux 2.6.31.6-r3 3726  126499 Luca...
The Linux Kernel.
Linux 2.6.30.5-r1 3805  166102 Jona...
The Linux Kernel.
Linux 2.6.29.1-r1 3948  117500 Luca...
The Linux Kernel.
Linux 2.6.28.7-r1 4004  115518 Giam...
The Linux Kernel.
Linux 2.6.28.1-r1 4004  115487 Giam...
The Linux Kernel.
Linux 2.6.28-r1 4004  116681 Mich...
The Linux Kernel.
Linux 2.6.27.8-r1 4004  134160 Giam...
The Linux Kernel.
Linux 2.6.27.4-r3 4004  149529 Luca...
The Linux Kernel.
Linux 2.6.25.17-r1 4004  172834 Giam...
The Linux Kernel.
Linux 2.6.25.16-r1 4004  166500 Giam...
The Linux Kernel.
Linux 2.6.25.10-r2 4004  165320 Giam...
The Linux Kernel.
Linux 2.6.25.7-r1 4004  157294 Giam...
The Linux Kernel.
Linux 2.6.25.4-r1 4004  133017 Hopp...
The Linux Kernel.
Linux 2.6.25-r1 4004  133216 Luca...
The Linux Kernel.
Linux 2.6.24.4-r5 4004  150733
The Linux Kernel.
Linux 2.6.24.3-r5 4004  150221 Luca...
The Linux Kernel.
Linux 2.6.24.2-r3 4004  146488 Giam...
The Linux Kernel.
Linux 2.6.24.1-r1 4004  146454 Giam...
The Linux Kernel.
Linux 2.6.24-r1 4004  146428 Luca...
The Linux Kernel.
Linux 2.6.23.8-r4 4004  155842 Luca...
The Linux Kernel.
Linux 2.6.22.7-r4 4004  114727 Luca...
The Linux Kernel.
Linux 2.6.22.1-r1 4004  121391 Luca...
The Linux Kernel.
Linux 2.6.21.1-r3 4004  118854 Luca...
The Linux Kernel.
Linux 2.6.20.7-r1 4004  117945 Luca...
The Linux Kernel.
Linux 2.6.20.4-r3 4004  151150 Luca...
The Linux Kernel.
Linux 2.6.20-r1 4004  106429 Luca...
The Linux Kernel.
Linux 2.6.18.3-r2 4004  111124 Luca...
The Linux Kernel.
Linux 2.6.17.11-r1 4004  164053 Luca...
The Linux Kernel.
Linux 2.6.17.3-r1 4004  165067 Luca...
The Linux Kernel.
Linux 2.6.16.20-r1 4004  133625 Luca...
The Linux Kernel.
Linux 2.6.16.14-r1 4004  168270 Luca...
The Linux Kernel.
Linux 2.6.15.5-r1 4004  224686 Jona...
The Linux Kernel.
Linux 2.6.15.2-r1 4004  177165 Carl...
The Linux Kernel.
Linux 2.6.15.1-r1 4004  149219 Jona...
The Linux Kernel.
Linux 2.6.15-r1 4004  149214 Luca...
The Linux Kernel.
Linux 2.6.14.4-r1 4004  150166 Jona...
The Linux Kernel.
Linux 2.6.14.3-r1 4004  150060 Jona...
The Linux Kernel.
Linux 2.6.14.2-r1 4004  149791 Carl...
The Linux Kernel.
Linux 2.6.13.4-r1 4004  149559 Luca...
The Linux Kernel.
Linux 2.6.13.2-r1 4004  56611 Jona...
The Linux Kernel.
Linux 2.6.13.1-r1 4004  56378 Luca...
The Linux Kernel.
Linux 2.6.12.2-r1 4004  50355 Luca...
The Linux Kernel.
Linux 2.6.11.9-r1 4004  98969 Luca...
The Linux Kernel.
Linux 2.6.11.8-r1 4004  109424 Jona...
The Linux Kernel.
Linux 2.6.11-r1 4004  99032 Luca...
The Linux Kernel.
Linux 2.6.10-r1 4004  65969 Luca...
The Linux Kernel.
Linux 2.6.9-r1 4004  278461 Luca...
The Linux Kernel.
Linux 2.6.8.1-r1 4004  35576 Luca...
The Linux Kernel.
Linux 2.6.7-r1 4004  22610 Luca...
The Linux Kernel.
Linux 2.6.6-r1 4004  21958 Luca...
The Linux Kernel.
Linux 2.4.26-r1 4004  22359 Luca...
The Linux Kernel.
view entry at GitHub | download recipe.bz2 file
01-Makefile.patch
02-gobohide.patch
03-devfs.patch
04-drm.patch
Recipe
Resources/Dependencies
Resources/Description
dot-config
dot-config.old
diff -X dontdiff -Nur 2.4.26-vanilla/Documentation/Configure.help 2.4.26-gobohide/Documentation/Configure.help
--- 2.4.26-vanilla/Documentation/Configure.help	2004-04-14 10:05:24.000000000 -0300
+++ 2.4.26-gobohide/Documentation/Configure.help	2004-04-25 19:07:33.000000000 -0300
@@ -17685,6 +17685,17 @@
   module, say M here and read <file:Documentation/modules.txt>.  If
   unsure, say N. 
 
+GoboHide support on file systems
+CONFIG_GOBOHIDE_FS
+  GoboHide is a general interface for providing real hidden files
+  in a filesystem. Current supported filesystems are EXT2, EXT3,
+  ISOFS, JFS, JFFS2, ReiserFS and XFS.
+  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.
+
 UnixWare slices support
 CONFIG_UNIXWARE_DISKLABEL
   Like some systems, UnixWare uses its own slice table inside a
diff -X dontdiff -Nur 2.4.26-vanilla/fs/Config.in 2.4.26-gobohide/fs/Config.in
--- 2.4.26-vanilla/fs/Config.in	2004-02-18 10:36:31.000000000 -0300
+++ 2.4.26-gobohide/fs/Config.in	2004-04-25 19:05:52.000000000 -0300
@@ -65,6 +65,7 @@
 tristate 'Minix fs support' CONFIG_MINIX_FS
 
 tristate 'FreeVxFS file system support (VERITAS VxFS(TM) compatible)' CONFIG_VXFS_FS
+bool 'GoboHide support on file systems' CONFIG_GOBOHIDE_FS
 tristate 'NTFS file system support (read only)' CONFIG_NTFS_FS
 dep_mbool '  NTFS write support (DANGEROUS)' CONFIG_NTFS_RW $CONFIG_NTFS_FS $CONFIG_EXPERIMENTAL
 
diff -X dontdiff -Nur 2.4.26-vanilla/fs/ext2/dir.c 2.4.26-gobohide/fs/ext2/dir.c
--- 2.4.26-vanilla/fs/ext2/dir.c	2002-11-28 21:53:15.000000000 -0200
+++ 2.4.26-gobohide/fs/ext2/dir.c	2004-04-25 18:54:12.000000000 -0300
@@ -24,6 +24,7 @@
 #include <linux/fs.h>
 #include <linux/ext2_fs.h>
 #include <linux/pagemap.h>
+#include <linux/gobolinux.h>
 
 typedef struct ext2_dir_entry_2 ext2_dirent;
 
@@ -268,7 +269,11 @@
 		de = (ext2_dirent *)(kaddr+offset);
 		limit = kaddr + PAGE_CACHE_SIZE - EXT2_DIR_REC_LEN(1);
 		for ( ;(char*)de <= limit; de = ext2_next_entry(de))
+#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 -Nur 2.4.26-vanilla/fs/ext3/dir.c 2.4.26-gobohide/fs/ext3/dir.c
--- 2.4.26-vanilla/fs/ext3/dir.c	2001-11-09 20:25:04.000000000 -0200
+++ 2.4.26-gobohide/fs/ext3/dir.c	2004-04-25 18:55:26.000000000 -0300
@@ -21,6 +21,7 @@
 #include <linux/fs.h>
 #include <linux/jbd.h>
 #include <linux/ext3_fs.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
@@ -153,7 +154,12 @@
 				return stored;
 			}
 			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
diff -X dontdiff -Nur 2.4.26-vanilla/fs/ioctl.c 2.4.26-gobohide/fs/ioctl.c
--- 2.4.26-vanilla/fs/ioctl.c	2003-08-25 08:44:43.000000000 -0300
+++ 2.4.26-gobohide/fs/ioctl.c	2004-04-25 18:57:39.000000000 -0300
@@ -10,6 +10,7 @@
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
+#include <linux/gobolinux.h>
 
 static int file_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
 {
@@ -111,6 +112,19 @@
 			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:
 			error = -ENOTTY;
 			if (S_ISREG(filp->f_dentry->d_inode->i_mode))
diff -X dontdiff -Nur 2.4.26-vanilla/fs/isofs/dir.c 2.4.26-gobohide/fs/isofs/dir.c
--- 2.4.26-vanilla/fs/isofs/dir.c	2002-02-25 16:38:08.000000000 -0300
+++ 2.4.26-gobohide/fs/isofs/dir.c	2004-04-25 19:40:57.000000000 -0300
@@ -21,6 +21,7 @@
 #include <linux/sched.h>
 #include <linux/locks.h>
 #include <linux/config.h>
+#include <linux/gobolinux.h>
 
 #include <asm/uaccess.h>
 
@@ -106,7 +107,7 @@
 	unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
 	unsigned char bufbits = ISOFS_BUFFER_BITS(inode);
 	unsigned int block, offset;
-	int inode_number = 0;	/* Quiet GCC */
+	ino_t inode_number = 0;	/* Quiet GCC */
 	struct buffer_head *bh = NULL;
 	int len;
 	int map;
@@ -173,6 +174,11 @@
 		}
 		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 -Nur 2.4.26-vanilla/fs/jffs2/dir.c 2.4.26-gobohide/fs/jffs2/dir.c
--- 2.4.26-vanilla/fs/jffs2/dir.c	2003-11-28 16:26:21.000000000 -0200
+++ 2.4.26-gobohide/fs/jffs2/dir.c	2004-04-25 18:52:17.000000000 -0300
@@ -42,6 +42,7 @@
 #include <linux/jffs2.h>
 #include <linux/jffs2_fs_i.h>
 #include <linux/jffs2_fs_sb.h>
+#include <linux/gobolinux.h>
 #include "nodelist.h"
 #include <linux/crc32.h>
 
@@ -176,6 +177,12 @@
 			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 -Nur 2.4.26-vanilla/fs/jfs/jfs_dtree.c 2.4.26-gobohide/fs/jfs/jfs_dtree.c
--- 2.4.26-vanilla/fs/jfs/jfs_dtree.c	2004-04-14 10:05:40.000000000 -0300
+++ 2.4.26-gobohide/fs/jfs/jfs_dtree.c	2004-04-25 19:04:23.000000000 -0300
@@ -101,6 +101,7 @@
  */
 
 #include <linux/fs.h>
+#include <linux/gobolinux.h>
 #include "jfs_incore.h"
 #include "jfs_superblock.h"
 #include "jfs_filsys.h"
@@ -3157,6 +3158,12 @@
 				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 -Nur 2.4.26-vanilla/fs/namei.c 2.4.26-gobohide/fs/namei.c
--- 2.4.26-vanilla/fs/namei.c	2003-08-25 08:44:43.000000000 -0300
+++ 2.4.26-gobohide/fs/namei.c	2004-04-25 19:09:24.000000000 -0300
@@ -22,6 +22,7 @@
 #include <linux/dnotify.h>
 #include <linux/smp_lock.h>
 #include <linux/personality.h>
+#include <linux/gobolinux.h>
 
 #include <asm/namei.h>
 #include <asm/uaccess.h>
@@ -1419,6 +1420,10 @@
 	}
 	double_up(&dir->i_zombie, &dentry->d_inode->i_zombie);
 	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
 		inode_dir_notify(dir, DN_DELETE);
 		d_delete(dentry);
 	}
@@ -1484,8 +1489,14 @@
 				lock_kernel();
 				error = dir->i_op->unlink(dir, dentry);
 				unlock_kernel();
-				if (!error)
+				if (!error) {
+					if (dentry->d_inode && S_ISLNK (dentry->d_inode->i_mode))
+#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);
+				}
 			}
 		}
 	}
diff -X dontdiff -Nur 2.4.26-vanilla/fs/reiserfs/dir.c 2.4.26-gobohide/fs/reiserfs/dir.c
--- 2.4.26-vanilla/fs/reiserfs/dir.c	2003-08-25 08:44:43.000000000 -0300
+++ 2.4.26-gobohide/fs/reiserfs/dir.c	2004-04-25 19:09:42.000000000 -0300
@@ -10,6 +10,7 @@
 #include <linux/stat.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
+#include <linux/gobolinux.h>
 
 extern struct key  MIN_KEY;
 
@@ -113,6 +114,9 @@
 		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 -Nur 2.4.26-vanilla/fs/xfs/xfs_dir2_block.c 2.4.26-gobohide/fs/xfs/xfs_dir2_block.c
--- 2.4.26-vanilla/fs/xfs/xfs_dir2_block.c	2004-02-18 10:36:32.000000000 -0300
+++ 2.4.26-gobohide/fs/xfs/xfs_dir2_block.c	2004-04-25 19:20:51.000000000 -0300
@@ -63,6 +63,8 @@
 #include "xfs_dir2_trace.h"
 #include "xfs_error.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * Local function prototypes.
  */
@@ -536,6 +538,14 @@
 #endif
 		p.name = (char *)dep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		{
+			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 -Nur 2.4.26-vanilla/fs/xfs/xfs_dir2_leaf.c 2.4.26-gobohide/fs/xfs/xfs_dir2_leaf.c
--- 2.4.26-vanilla/fs/xfs/xfs_dir2_leaf.c	2004-02-18 10:36:32.000000000 -0300
+++ 2.4.26-gobohide/fs/xfs/xfs_dir2_leaf.c	2004-04-25 19:21:43.000000000 -0300
@@ -67,6 +67,8 @@
 #include "xfs_error.h"
 #include "xfs_bit.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * Local function declarations.
  */
@@ -1124,6 +1126,14 @@
 #endif
 		p.name = (char *)dep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		{
+			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 -Nur 2.4.26-vanilla/fs/xfs/xfs_dir2_sf.c 2.4.26-gobohide/fs/xfs/xfs_dir2_sf.c
--- 2.4.26-vanilla/fs/xfs/xfs_dir2_sf.c	2004-02-18 10:36:32.000000000 -0300
+++ 2.4.26-gobohide/fs/xfs/xfs_dir2_sf.c	2004-04-25 19:22:24.000000000 -0300
@@ -62,6 +62,8 @@
 #include "xfs_dir2_block.h"
 #include "xfs_dir2_trace.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * Prototypes for internal functions.
  */
@@ -844,6 +846,14 @@
 #endif
 		p.name = (char *)sfep->name;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		{
+			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 -Nur 2.4.26-vanilla/fs/xfs/xfs_dir_leaf.c 2.4.26-gobohide/fs/xfs/xfs_dir_leaf.c
--- 2.4.26-vanilla/fs/xfs/xfs_dir_leaf.c	2004-02-18 10:36:32.000000000 -0300
+++ 2.4.26-gobohide/fs/xfs/xfs_dir_leaf.c	2004-04-25 19:25:03.000000000 -0300
@@ -64,6 +64,8 @@
 #include "xfs_dir_leaf.h"
 #include "xfs_error.h"
 
+#include <linux/gobolinux.h>
+
 /*
  * xfs_dir_leaf.c
  *
@@ -567,6 +569,15 @@
 #endif
 		p.name = sbp->name;
 		p.namelen = sbp->namelen;
+
+#ifdef CONFIG_GOBOHIDE_FS
+		{
+			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 =
@@ -2147,6 +2158,14 @@
 		p.name = (char *)namest->name;
 		p.namelen = entry->namelen;
 
+#ifdef CONFIG_GOBOHIDE_FS
+		{
+			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 -Nur 2.4.26-vanilla/gobolinux/fs/gobohide.c 2.4.26-gobohide/gobolinux/fs/gobohide.c
--- 2.4.26-vanilla/gobolinux/fs/gobohide.c	1969-12-31 21:00:00.000000000 -0300
+++ 2.4.26-gobohide/gobolinux/fs/gobohide.c	2004-04-25 19:16:46.000000000 -0300
@@ -0,0 +1,278 @@
+/*
+ * 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:
+ * 25-Apr-2004 - Lucas C. Villa Real
+ *              Sync'ed with 2.6.5 patch, adding checkings against 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.
+ * 
+ * TODO:
+ * Deal with namespaces, to avoid the same inode number being hidden in 
+ * the wrong partition.
+ * 
+ */
+
+#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>
+#include <linux/proc_fs.h>
+#include <linux/stat.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, flags;
+	
+	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
+ * @part_info: contains information from inode's superblock
+ *
+ * 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 -Nur 2.4.26-vanilla/gobolinux/fs/ioctl.c 2.4.26-gobohide/gobolinux/fs/ioctl.c
--- 2.4.26-vanilla/gobolinux/fs/ioctl.c	1969-12-31 21:00:00.000000000 -0300
+++ 2.4.26-gobohide/gobolinux/fs/ioctl.c	2004-04-25 18:48:40.000000000 -0300
@@ -0,0 +1,80 @@
+/*
+ * 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>.
+ */
+
+#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_ISLNK(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->flags & ~PF_SUPERPRIV) {
+		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 -Nur 2.4.26-vanilla/gobolinux/fs/Makefile 2.4.26-gobohide/gobolinux/fs/Makefile
--- 2.4.26-vanilla/gobolinux/fs/Makefile	1969-12-31 21:00:00.000000000 -0300
+++ 2.4.26-gobohide/gobolinux/fs/Makefile	2004-04-25 18:48:40.000000000 -0300
@@ -0,0 +1,11 @@
+#
+# Makefile for the gobolinux-fs features.
+#
+
+O_TARGET := fs.o
+
+export-objs := ioctl.o gobohide.o 
+
+obj-y	:= ioctl.o gobohide.o
+
+include $(TOPDIR)/Rules.make
diff -X dontdiff -Nur 2.4.26-vanilla/gobolinux/Makefile 2.4.26-gobohide/gobolinux/Makefile
--- 2.4.26-vanilla/gobolinux/Makefile	1969-12-31 21:00:00.000000000 -0300
+++ 2.4.26-gobohide/gobolinux/Makefile	2004-04-25 18:48:40.000000000 -0300
@@ -0,0 +1,10 @@
+#
+# Makefile for gobolinux features.
+#
+
+O_TARGET := gobolinux.o
+
+subdir-y :=	fs
+obj-y	 :=	$(join $(subdir-y), $(patsubst %,/%.o,$(notdir $(subdir-y))))
+
+include $(TOPDIR)/Rules.make
diff -X dontdiff -Nur 2.4.26-vanilla/include/linux/fs.h 2.4.26-gobohide/include/linux/fs.h
--- 2.4.26-vanilla/include/linux/fs.h	2004-02-18 10:36:32.000000000 -0300
+++ 2.4.26-gobohide/include/linux/fs.h	2004-04-25 18:48:40.000000000 -0300
@@ -164,6 +164,7 @@
 
 #define IS_DEADDIR(inode)	((inode)->i_flags & S_DEAD)
 
+
 /* the read-only stuff doesn't really belong here, but any other place is
    probably as bad and I don't want to create yet another include file. */
 
@@ -194,6 +195,7 @@
 #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,sizeof(struct gobolinux_hide)) /* gobolinux-fs \
ioctl */
 
 #ifdef __KERNEL__
 
diff -X dontdiff -Nur 2.4.26-vanilla/include/linux/gobolinux.h 2.4.26-gobohide/include/linux/gobolinux.h
--- 2.4.26-vanilla/include/linux/gobolinux.h	1969-12-31 21:00:00.000000000 -0300
+++ 2.4.26-gobohide/include/linux/gobolinux.h	2004-04-25 18:48:40.000000000 -0300
@@ -0,0 +1,41 @@
+#ifndef _LINUX_GOBOLINUX_H
+#define _LINUX_GOBOLINUX_H
+
+#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  /* _LINUX_GOBOLINUX_H */
diff -X dontdiff -Nur 2.4.26-vanilla/Makefile 2.4.26-gobohide/Makefile
--- 2.4.26-vanilla/Makefile	2004-04-25 18:38:40.000000000 -0300
+++ 2.4.26-gobohide/Makefile	2004-04-25 18:48:40.000000000 -0300
@@ -128,7 +128,9 @@
 NETWORKS	=net/network.o
 
 LIBS		=$(TOPDIR)/lib/lib.a
-SUBDIRS		=kernel drivers mm fs net ipc lib crypto
+SUBDIRS		=kernel drivers mm fs net ipc lib crypto gobolinux
+
+GOBOLINUX	=gobolinux/gobolinux.o
 
 DRIVERS-n :=
 DRIVERS-y :=
@@ -291,6 +293,7 @@
 		$(CORE_FILES) \
 		$(DRIVERS) \
 		$(NETWORKS) \
+		$(GOBOLINUX) \
 		$(LIBS) \
 		--end-group \
 		-o vmlinux