GoboLinux Downloads Documentation Community Recipes Screenshots

GoboLinux Recipe & Package Search Tool

71 versions of Linux.

ProgramAgeSizeByWWWSummary
Linux 4.13.2-r1 784  88794 Luca...
The Linux Kernel.
Linux 4.9.16-r3 955  100651 Luca...
The Linux Kernel.
Linux 4.9.4-r5 1011  99374 Luca...
The Linux Kernel.
Linux 4.8.2-r2 1077  89394 Luca...
The Linux Kernel.
Linux 4.7.4-r1 1147  82767 Luca...
The Linux Kernel.
Linux 4.7.0-r4 1202  82585 Luca...
The Linux Kernel.
Linux 3.13.3-r1 2082  252629 Luca...
The Linux Kernel.
Linux 3.12.6-r1 2142  238949 Luca...
The Linux Kernel.
Linux 3.9.4-r2 2337  70048 Luca...
The Linux Kernel.
Linux 3.7.1-r2 2510  67579 Luca...
The Linux Kernel.
Linux 3.5.0-r1 2661  124391 Luca...
The Linux Kernel.
Linux 3.4.4-r1 2661  124348 Luca...
The Linux Kernel.
Linux 3.3.6-r1 2661  124410 Luca...
The Linux Kernel.
Linux 3.2.12-r2 2789  124345 Luca...
The Linux Kernel.
Linux 3.2.7-r1 2819  123550 Mich...
The Linux Kernel.
Linux 3.1.1-r1 2924  122907 Mich...
The Linux Kernel.
Linux 3.0.4-r4 2985  122754 Luca...
The Linux Kernel.
Linux 2.6.36.3-r1 3208  116087 Diog...
The Linux Kernel.
Linux 2.6.32.3-r1 3586  117990 Luca...
The Linux Kernel.
Linux 2.6.32-r1 3627  117751 Luca...
The Linux Kernel.
Linux 2.6.31.6-r3 3632  126499 Luca...
The Linux Kernel.
Linux 2.6.30.5-r1 3711  166102 Jona...
The Linux Kernel.
Linux 2.6.29.1-r1 3854  117500 Luca...
The Linux Kernel.
Linux 2.6.28.7-r1 3910  115518 Giam...
The Linux Kernel.
Linux 2.6.28.1-r1 3910  115487 Giam...
The Linux Kernel.
Linux 2.6.28-r1 3910  116681 Mich...
The Linux Kernel.
Linux 2.6.27.8-r1 3910  134160 Giam...
The Linux Kernel.
Linux 2.6.27.4-r3 3910  149529 Luca...
The Linux Kernel.
Linux 2.6.25.17-r1 3910  172834 Giam...
The Linux Kernel.
Linux 2.6.25.16-r1 3910  166500 Giam...
The Linux Kernel.
Linux 2.6.25.10-r2 3910  165320 Giam...
The Linux Kernel.
Linux 2.6.25.7-r1 3910  157294 Giam...
The Linux Kernel.
Linux 2.6.25.4-r1 3910  133017 Hopp...
The Linux Kernel.
Linux 2.6.25-r1 3910  133216 Luca...
The Linux Kernel.
Linux 2.6.24.4-r5 3910  150733
The Linux Kernel.
view entry at GitHub | download recipe.bz2 file
01-gobohide.patch
02-unionfs-2.3.2_for_2.6.24.4.patch
03-squashfs-3.3-cvs_20080310.patch
04-squashfs-3.3-cvs_20080310-fix.patch
04-thinkpad-acpi-0.19-20080107_v2.6.24.patch
05-applesmc-case-led.patch
06-applesmc_int.patch
07-applesmc-macbook2.patch
08-applesmc-retry-when-accessing-keys.patch
09-appletouch-add-macbook3-trackpad.patch
10-appletouch.patch
11-appletouch-new.patch
12-sigmatel_audio_display_all_controls_when_subsystem_id_is_wrong.patch
13-sigmatel_audio_fix_macbook_v2.patch
14-appletouch-2.6.24_rc8.patch
15-macbook3rd-2.6.24_rc8.patch
16-usbhid-macbook3_1-quirks.patch
17-applesmc_led_unregister.patch
18-vm_splice_fix.patch
Recipe
Resources/BuildInformation
Resources/Dependencies
Resources/Description
Resources/NewDependencies
i686/Recipe
i686/dot-config
ppc/Recipe
ppc/dot-config
diff -Nurp linux-2.6.24.3.orig/fs/gobohide.c linux-2.6.24.3/fs/gobohide.c
--- linux-2.6.24.3.orig/fs/gobohide.c	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.24.3/fs/gobohide.c	2008-03-20 19:16:10.000000000 -0700
@@ -0,0 +1,393 @@
+/*
+ * Copyright (C) 2002-2008 GoboLinux.org
+ *
+ * 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@gmail.com>.
+ * Original idea: Lucas C. Villa Real <lucasvr@gobolinux.org>
+ *
+ * Changes:
+ * 18-May-2007 - Lucas C. Villa Real
+ *               Added support to unionfs.
+ *
+ * 04-Jul-2006 - Lucas C. Villa Real
+ *               Added GoboHide support to all filesystems through the VFS.
+ *               
+ * 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/gobohide.h>
+#include <linux/spinlock.h>
+#include <linux/proc_fs.h>
+#include <linux/stat.h>
+#include <linux/mount.h>
+
+#ifdef CONFIG_UNION_FS
+#include "unionfs/union.h"
+#endif
+
+#include <asm/uaccess.h>
+
+static LIST_HEAD(inode_list);
+static rwlock_t inode_rwlock = RW_LOCK_UNLOCKED;
+
+struct file *gobolinux_get_filp(ino_t ino, const char *pathname, int *ret);
+static int gobolinux_resolve_path(struct hide *inode);
+
+	/** 
+ * 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:
+		   do {
+			   int len, ret;
+			   struct hide n;
+
+			   n.filp = gobolinux_get_filp(hide->inode, hide->pathname, &ret);
+			   if (!n.filp) {
+				   error = -ENOENT;
+				   goto out;
+			   }
+			   len = gobolinux_resolve_path(&n);
+			   if (len < 0) {
+				   error = -ENOENT;
+				   goto out;
+			   }
+			   error = gobolinux_inode_del(n.filp->f_dentry->d_inode);
+		   } while(0);
+           break;
+       case GETSTATSUIDNUMBER:
+           error = gobolinux_count_hidden(hide);
+           break;
+       case GETSTATSUID:
+           error = gobolinux_show_hidden(hide);
+           break;
+       default:
+           return -EOPNOTSUPP;
+   }
+
+out:
+   return error;
+}
+
+/** 
+ * gobolinux_resolve_path - Resolves the pathname of a given dentry
+ * @inode: structure holding the dentry structure and the destination buffer
+ */
+static int gobolinux_resolve_path(struct hide *inode)
+{
+   int len;
+   struct file *filp = inode->filp;
+   
+   inode->page = __get_free_page(GFP_USER);
+   if (! inode->page)
+       return -ENOMEM;
+   
+   inode->pathname = d_path(filp->f_dentry, filp->f_vfsmnt, 
+           (char *) inode->page, PAGE_SIZE);
+   len = PAGE_SIZE + inode->page - (unsigned long) inode->pathname;
+
+   return len < PATH_MAX ? len : PATH_MAX;
+}
+
+/**
+ * gobolinux_count_hidden - Counts how many inodes are hidden.
+ * @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_rwlock, 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_rwlock, flags);
+   return 0;
+}
+
+/**
+ * gobolinux_show_hidden - Lists the currently hidden inodes.
+ * @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)
+{
+   struct list_head *p, *next;
+   struct hide *inode;
+   struct gobolinux_hide_stats *stats;
+   
+   hide->stats.filled_size = 0;
+   
+   list_for_each_safe(p, next, &inode_list) {
+       inode = list_entry(p, struct hide, head);
+       stats = &hide->stats;
+       if (inode && (stats->filled_size < stats->hidden_inodes)) { 
+           if (copy_to_user(stats->hidden_list[stats->filled_size++],
+               inode->pathname, strlen(inode->pathname))) {
+               return -EFAULT;
+           }
+       } 
+   }
+   return 0;
+}
+
+/**
+ * gobolinux_get_filp - Returns the struct file related to a given descriptor.
+ * @ino: the inode number
+ * @pathname: the pathname associated with @ino
+ * @ret: a pointer which holds the result of the user_path_walk_link operation
+ */
+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;
+}
+
+ino_t gobolinux_translate_inode_nr(struct inode *inode)
+{
+   ino_t ino = inode->i_ino;
+#ifdef CONFIG_UNION_FS
+   if (inode->i_sb->s_op == &unionfs_sops) {
+	   /* we must take the inode number from the underlying filesystem */
+	   struct inode *lower_inode = unionfs_lower_inode(inode);
+	   ino = lower_inode ? lower_inode->i_ino : inode->i_ino;
+   }
+#endif
+   return ino;
+}
+
+/**
+ * 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 len, ret = 0;
+   struct hide *n;
+   struct dentry *dentry;
+   unsigned long flags;
+   
+   n = kmalloc(sizeof(struct hide), GFP_KERNEL);
+   if (!n)
+       return -ENOMEM;
+   
+   n->filp = gobolinux_get_filp(ino, pathname, &ret);
+   if (!n->filp) 
+       goto out;
+
+   len = gobolinux_resolve_path(n);
+   if (len < 0) {
+       ret = len;
+       goto out;
+   }
+
+   dentry = n->filp->f_dentry;
+   if (! dentry)
+	   goto out;
+
+   n->i_ino = gobolinux_translate_inode_nr(dentry->d_inode);
+   if (gobolinux_hidden(n->i_ino, dentry->d_name.name, dentry->d_name.len+1, dentry)) \
{
+       ret = -EEXIST;
+       goto out;
+   }
+   
+   write_lock_irqsave(&inode_rwlock, flags);
+   INIT_LIST_HEAD(&n->head);
+   
+   list_add(&n->head, &inode_list);
+   write_unlock_irqrestore(&inode_rwlock, flags);
+out:
+   return ret;
+}
+
+/**
+ * gobolinux_do_remove - Effectively removes the inode from the inode_list.
+ * @hide: struct hide to be removed
+ */
+int gobolinux_do_remove(struct hide *hide)
+{
+	list_del(&hide->head);
+	free_page(hide->page);
+	filp_close(hide->filp, current->files);
+	kfree(hide);
+	return 0;
+}
+
+/**
+ * gobolinux_inode_del - Remove the inode from the "must hide" list 
+ * @ino: inode to be removed
+ */
+int gobolinux_inode_del(struct inode *inode)
+{
+   struct hide *entry, *aux;
+   unsigned long flags;
+
+   ino_t ino = gobolinux_translate_inode_nr(inode);
+
+   write_lock_irqsave(&inode_rwlock, flags);
+   list_for_each_entry_safe(entry, aux, &inode_list, head) {
+       if (entry->i_ino == ino) {
+		   gobolinux_do_remove(entry);
+           break;
+       }
+   }
+
+   write_unlock_irqrestore(&inode_rwlock, flags);
+   return 0;
+}
+
+/** 
+ * gobolinux_hidden - Test if the inode is in the "must hide" list,
+ *       comparing against the inode number and the superblock.
+ *
+ * @i_ino: inode being readdir'd
+ * @filename: inode's filename
+ * @namelen: inodes's filename length in bytes
+ * @dentry: the root's dentry for the given inode.
+ *
+ * If the inode number is in the inode_list, returns a pointer to its entry
+ * in the inode_list or NULL if it isn't there.
+ */
+struct hide *gobolinux_hidden(ino_t i_ino, const char *filename, int namelen, struct \
dentry *dentry)
+{
+   struct hide *ret = NULL, *inode = NULL;
+   struct dentry *hidden_dentry, *i_dentry;
+   unsigned long flags;
+
+   if (! i_ino)
+       goto out;
+
+   read_lock_irqsave(&inode_rwlock, flags);
+   list_for_each_entry(inode, &inode_list, head) {
+	   hidden_dentry = inode->filp->f_dentry;
+       if (inode->i_ino == i_ino && hidden_dentry->d_sb == dentry->d_sb) {
+		   if (hidden_dentry->d_name.len != namelen)
+			   break;
+		   
+		   hidden_dentry = hidden_dentry->d_parent;
+	       i_dentry = dentry;
+   		   while(hidden_dentry && i_dentry) {
+   		       if (hidden_dentry->d_name.len != i_dentry->d_name.len)
+				   break;
+			   if (strncmp(hidden_dentry->d_name.name, i_dentry->d_name.name, i_dentry->d_name.len))
+				   break;
+		       if (hidden_dentry->d_parent == hidden_dentry || i_dentry->d_parent == i_dentry)
+				   break;
+			   hidden_dentry = hidden_dentry->d_parent;
+			   i_dentry = i_dentry->d_parent;
+		   }	
+		   if (hidden_dentry == i_dentry) {
+			   ret = inode;
+			   break;
+		   }
+       }
+   }
+   read_unlock_irqrestore(&inode_rwlock, flags );
+out:
+   return ret;
+}
+
+/* We need to export this function to add support on the VFS */
+EXPORT_SYMBOL(gobolinux_hidden);
+EXPORT_SYMBOL(gobolinux_do_remove);
+
+/**
+ * These are only exported for the ioctl handler's sake 
+ */
+EXPORT_SYMBOL(gobolinux_fs_ioctl);
+EXPORT_SYMBOL(gobolinux_inode_add);
+EXPORT_SYMBOL(gobolinux_inode_del);
+EXPORT_SYMBOL(gobolinux_show_hidden);
+EXPORT_SYMBOL(gobolinux_count_hidden);
diff -Nurp linux-2.6.24.3.orig/fs/ioctl.c linux-2.6.24.3/fs/ioctl.c
--- linux-2.6.24.3.orig/fs/ioctl.c	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/fs/ioctl.c	2008-03-20 19:16:06.000000000 -0700
@@ -12,6 +12,7 @@
 #include <linux/fs.h>
 #include <linux/security.h>
 #include <linux/module.h>
+#include <linux/gobohide.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -144,6 +145,18 @@ 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_path.dentry->d_inode->i_mode))
 				error = file_ioctl(filp, cmd, arg);
diff -Nurp linux-2.6.24.3.orig/fs/Kconfig linux-2.6.24.3/fs/Kconfig
--- linux-2.6.24.3.orig/fs/Kconfig	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/fs/Kconfig	2008-03-20 19:16:06.000000000 -0700
@@ -1467,6 +1467,18 @@ config QNX4FS_RW
 	  answer 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. GoboHide now supports all filesystems, including
+     EXT3, SquashFS and any other sitted on the top of the VFS.
+     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 SYSV_FS
 	tristate "System V/Xenix/V7/Coherent file system support"
diff -Nurp linux-2.6.24.3.orig/fs/Makefile linux-2.6.24.3/fs/Makefile
--- linux-2.6.24.3.orig/fs/Makefile	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/fs/Makefile	2008-03-20 19:16:06.000000000 -0700
@@ -54,6 +54,7 @@ obj-$(CONFIG_QFMT_V2)		+= quota_v2.o
 obj-$(CONFIG_QUOTACTL)		+= quota.o
 
 obj-$(CONFIG_DNOTIFY)		+= dnotify.o
+obj-$(CONFIG_GOBOHIDE_FS)  += gobohide.o
 
 obj-$(CONFIG_PROC_FS)		+= proc/
 obj-y				+= partitions/
diff -Nurp linux-2.6.24.3.orig/fs/namei.c linux-2.6.24.3/fs/namei.c
--- linux-2.6.24.3.orig/fs/namei.c	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/fs/namei.c	2008-03-20 19:16:10.000000000 -0700
@@ -30,6 +30,7 @@
 #include <linux/capability.h>
 #include <linux/file.h>
 #include <linux/fcntl.h>
+#include <linux/gobohide.h>
 #include <asm/namei.h>
 #include <asm/uaccess.h>
 
@@ -2086,6 +2087,10 @@ void dentry_unhash(struct dentry *dentry
 
 int vfs_rmdir(struct inode *dir, struct dentry *dentry)
 {
+#ifdef CONFIG_GOBOHIDE_FS
+	ino_t ino = dentry->d_inode ? gobolinux_translate_inode_nr(dentry->d_inode) : 0;
+	struct hide *hidden = ino ? gobolinux_hidden(ino, dentry->d_name.name, dentry->d_name.len, \
dentry->d_parent) : NULL;
+#endif
 	int error = may_delete(dir, dentry, 1);
 
 	if (error)
@@ -2110,6 +2115,10 @@ int vfs_rmdir(struct inode *dir, struct 
 	}
 	mutex_unlock(&dentry->d_inode->i_mutex);
 	if (!error) {
+#ifdef CONFIG_GOBOHIDE_FS
+		if (hidden)
+			gobolinux_do_remove(hidden);
+#endif
 		d_delete(dentry);
 	}
 	dput(dentry);
@@ -2166,6 +2175,10 @@ asmlinkage long sys_rmdir(const char __u
 
 int vfs_unlink(struct inode *dir, struct dentry *dentry)
 {
+#ifdef CONFIG_GOBOHIDE_FS
+	ino_t ino = dentry->d_inode ? gobolinux_translate_inode_nr(dentry->d_inode) : 0;
+	struct hide *hidden = ino ? gobolinux_hidden(ino, dentry->d_name.name, dentry->d_name.len, \
dentry->d_parent) : NULL;
+#endif
 	int error = may_delete(dir, dentry, 0);
 
 	if (error)
@@ -2188,6 +2201,10 @@ 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 (hidden)
+			gobolinux_do_remove(hidden);
+#endif
 		d_delete(dentry);
 	}
 
diff -Nurp linux-2.6.24.3.orig/fs/readdir.c linux-2.6.24.3/fs/readdir.c
--- linux-2.6.24.3.orig/fs/readdir.c	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/fs/readdir.c	2008-03-20 19:16:10.000000000 -0700
@@ -16,6 +16,7 @@
 #include <linux/security.h>
 #include <linux/syscalls.h>
 #include <linux/unistd.h>
+#include <linux/gobohide.h>
 
 #include <asm/uaccess.h>
 
@@ -65,6 +66,9 @@ struct old_linux_dirent {
 struct readdir_callback {
 	struct old_linux_dirent __user * dirent;
 	int result;
+#ifdef CONFIG_GOBOHIDE_FS
+	struct dentry *dentry;
+#endif
 };
 
 static int fillonedir(void * __buf, const char * name, int namlen, loff_t offset,
@@ -110,6 +114,9 @@ asmlinkage long old_readdir(unsigned int
 
 	buf.result = 0;
 	buf.dirent = dirent;
+#ifdef CONFIG_GOBOHIDE_FS
+	buf.dentry = file->f_dentry;
+#endif
 
 	error = vfs_readdir(file, fillonedir, &buf);
 	if (error >= 0)
@@ -138,6 +145,9 @@ struct getdents_callback {
 	struct linux_dirent __user * previous;
 	int count;
 	int error;
+#ifdef CONFIG_GOBOHIDE_FS
+	struct dentry *dentry;
+#endif
 };
 
 static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
@@ -156,10 +166,18 @@ static int filldir(void * __buf, const c
 		return -EOVERFLOW;
 	dirent = buf->previous;
 	if (dirent) {
+#ifdef CONFIG_GOBOHIDE_FS
+		if (gobolinux_hidden(d_ino, name, namlen, buf->dentry))
+			return 0;
+#endif
 		if (__put_user(offset, &dirent->d_off))
 			goto efault;
 	}
 	dirent = buf->current_dir;
+#ifdef CONFIG_GOBOHIDE_FS
+	if (gobolinux_hidden(d_ino, name, namlen, buf->dentry))
+		return 0;
+#endif
 	if (__put_user(d_ino, &dirent->d_ino))
 		goto efault;
 	if (__put_user(reclen, &dirent->d_reclen))
@@ -200,6 +218,9 @@ asmlinkage long sys_getdents(unsigned in
 	buf.previous = NULL;
 	buf.count = count;
 	buf.error = 0;
+#ifdef CONFIG_GOBOHIDE_FS
+	buf.dentry = file->f_dentry;
+#endif
 
 	error = vfs_readdir(file, filldir, &buf);
 	if (error < 0)
@@ -224,6 +245,9 @@ struct getdents_callback64 {
 	struct linux_dirent64 __user * previous;
 	int count;
 	int error;
+#ifdef CONFIG_GOBOHIDE_FS
+	struct dentry *dentry;
+#endif
 };
 
 static int filldir64(void * __buf, const char * name, int namlen, loff_t offset,
@@ -238,10 +262,18 @@ static int filldir64(void * __buf, const
 		return -EINVAL;
 	dirent = buf->previous;
 	if (dirent) {
+#ifdef CONFIG_GOBOHIDE_FS
+		if (gobolinux_hidden(ino, name, namlen, buf->dentry))
+			return 0;
+#endif
 		if (__put_user(offset, &dirent->d_off))
 			goto efault;
 	}
 	dirent = buf->current_dir;
+#ifdef CONFIG_GOBOHIDE_FS
+	if (gobolinux_hidden(ino, name, namlen, buf->dentry))
+		return 0;
+#endif
 	if (__put_user(ino, &dirent->d_ino))
 		goto efault;
 	if (__put_user(0, &dirent->d_off))
@@ -284,6 +316,9 @@ asmlinkage long sys_getdents64(unsigned 
 	buf.previous = NULL;
 	buf.count = count;
 	buf.error = 0;
+#ifdef CONFIG_GOBOHIDE_FS
+	buf.dentry = file->f_dentry;
+#endif
 
 	error = vfs_readdir(file, filldir64, &buf);
 	if (error < 0)
diff -Nurp linux-2.6.24.3.orig/include/linux/fs.h linux-2.6.24.3/include/linux/fs.h
--- linux-2.6.24.3.orig/include/linux/fs.h	2008-02-25 16:20:20.000000000 -0800
+++ linux-2.6.24.3/include/linux/fs.h	2008-03-20 19:16:06.000000000 -0700
@@ -221,6 +221,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 */
 
 #define	FS_IOC_GETFLAGS			_IOR('f', 1, long)
 #define	FS_IOC_SETFLAGS			_IOW('f', 2, long)
diff -Nurp linux-2.6.24.3.orig/include/linux/gobohide.h linux-2.6.24.3/include/linux/gobohide.h
--- linux-2.6.24.3.orig/include/linux/gobohide.h	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.24.3/include/linux/gobohide.h	2008-03-20 19:16:10.000000000 -0700
@@ -0,0 +1,50 @@
+#ifndef _LINUX_GOBOLINUX_H
+#define _LINUX_GOBOLINUX_H
+
+#ifdef CONFIG_GOBOHIDE_FS
+#include <linux/fs.h>
+#include <linux/dcache.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 {
+   ino_t i_ino;            /* shortcut to inode number */
+   struct file *filp;      /* used to recover the inode's pathname */
+   char *pathname;         /* a fresh cache of the inode's pathname */
+   unsigned long page;     /* page on which pathname has been copied to */
+   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 in 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;  /* holds statistics */
+};
+
+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);
+ino_t gobolinux_translate_inode_nr(struct inode *inode);
+struct hide *gobolinux_hidden(ino_t i_ino, const char *filename, int namelen, struct \
dentry *dentry);
+int  gobolinux_hidden_simple(ino_t ino, struct super_block *sb);
+int  gobolinux_inode_add(ino_t ino, const char *pathname);
+int  gobolinux_inode_del(struct inode *inode);
+int  gobolinux_do_remove(struct hide *hide);
+int  gobolinux_fs_ioctl(struct inode *inode, struct gobolinux_hide *hide);
+
+#endif  /* CONFIG_GOBOHIDE_FS */
+#endif  /* _LINUX_GOBOLINUX_H */
Linux 2.6.24.3-r5 3910  150221 Luca...
The Linux Kernel.
Linux 2.6.24.2-r3 3910  146488 Giam...
The Linux Kernel.
Linux 2.6.24.1-r1 3910  146454 Giam...
The Linux Kernel.
Linux 2.6.24-r1 3910  146428 Luca...
The Linux Kernel.
Linux 2.6.23.8-r4 3910  155842 Luca...
The Linux Kernel.
Linux 2.6.22.7-r4 3910  114727 Luca...
The Linux Kernel.
Linux 2.6.22.1-r1 3910  121391 Luca...
The Linux Kernel.
Linux 2.6.21.1-r3 3910  118854 Luca...
The Linux Kernel.
Linux 2.6.20.7-r1 3910  117945 Luca...
The Linux Kernel.
Linux 2.6.20.4-r3 3910  151150 Luca...
The Linux Kernel.
Linux 2.6.20-r1 3910  106429 Luca...
The Linux Kernel.
Linux 2.6.18.3-r2 3910  111124 Luca...
The Linux Kernel.
Linux 2.6.17.11-r1 3910  164053 Luca...
The Linux Kernel.
Linux 2.6.17.3-r1 3910  165067 Luca...
The Linux Kernel.
Linux 2.6.16.20-r1 3910  133625 Luca...
The Linux Kernel.
Linux 2.6.16.14-r1 3910  168270 Luca...
The Linux Kernel.
Linux 2.6.15.5-r1 3910  224686 Jona...
The Linux Kernel.
Linux 2.6.15.2-r1 3910  177165 Carl...
The Linux Kernel.
Linux 2.6.15.1-r1 3910  149219 Jona...
The Linux Kernel.
Linux 2.6.15-r1 3910  149214 Luca...
The Linux Kernel.
Linux 2.6.14.4-r1 3910  150166 Jona...
The Linux Kernel.
Linux 2.6.14.3-r1 3910  150060 Jona...
The Linux Kernel.
Linux 2.6.14.2-r1 3910  149791 Carl...
The Linux Kernel.
Linux 2.6.13.4-r1 3910  149559 Luca...
The Linux Kernel.
Linux 2.6.13.2-r1 3910  56611 Jona...
The Linux Kernel.
Linux 2.6.13.1-r1 3910  56378 Luca...
The Linux Kernel.
Linux 2.6.12.2-r1 3910  50355 Luca...
The Linux Kernel.
Linux 2.6.11.9-r1 3910  98969 Luca...
The Linux Kernel.
Linux 2.6.11.8-r1 3910  109424 Jona...
The Linux Kernel.
Linux 2.6.11-r1 3910  99032 Luca...
The Linux Kernel.
Linux 2.6.10-r1 3910  65969 Luca...
The Linux Kernel.
Linux 2.6.9-r1 3910  278461 Luca...
The Linux Kernel.
Linux 2.6.8.1-r1 3910  35576 Luca...
The Linux Kernel.
Linux 2.6.7-r1 3910  22610 Luca...
The Linux Kernel.
Linux 2.6.6-r1 3910  21958 Luca...
The Linux Kernel.
Linux 2.4.26-r1 3910  22359 Luca...
The Linux Kernel.