--- zzzz-none-000/linux-2.6.19.2/fs/readdir.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/fs/readdir.c 2007-01-19 14:42:56.000000000 +0000 @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include @@ -65,6 +67,7 @@ struct readdir_callback { struct old_linux_dirent __user * dirent; + struct file * file; int result; }; @@ -80,6 +83,10 @@ d_ino = ino; if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) return -EOVERFLOW; + + if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) + return 0; + buf->result++; dirent = buf->dirent; if (!access_ok(VERIFY_WRITE, dirent, @@ -111,6 +118,7 @@ buf.result = 0; buf.dirent = dirent; + buf.file = file; error = vfs_readdir(file, fillonedir, &buf); if (error >= 0) @@ -137,6 +145,7 @@ struct getdents_callback { struct linux_dirent __user * current_dir; struct linux_dirent __user * previous; + struct file * file; int count; int error; }; @@ -155,6 +164,10 @@ d_ino = ino; if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) return -EOVERFLOW; + + if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) + return 0; + dirent = buf->previous; if (dirent) { if (__put_user(offset, &dirent->d_off)) @@ -201,6 +214,7 @@ buf.previous = NULL; buf.count = count; buf.error = 0; + buf.file = file; error = vfs_readdir(file, filldir, &buf); if (error < 0) @@ -225,6 +239,7 @@ struct getdents_callback64 { struct linux_dirent64 __user * current_dir; struct linux_dirent64 __user * previous; + struct file *file; int count; int error; }; @@ -239,6 +254,10 @@ buf->error = -EINVAL; /* only used if we fail.. */ if (reclen > buf->count) return -EINVAL; + + if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) + return 0; + dirent = buf->previous; if (dirent) { if (__put_user(offset, &dirent->d_off)) @@ -285,6 +304,7 @@ buf.current_dir = dirent; buf.previous = NULL; + buf.file = file; buf.count = count; buf.error = 0;