Name: File Logging Patch Status: Untested Signed-off-by: Rusty Russell Tridge and I were discussing this a while back: a method of keeping a record of all changes to files on a mount point, using a finite amount of room. Here's my attempt to implement it. diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .8843-linux-2.6.9-rc1-bk9/fs/filetrack.c .8843-linux-2.6.9-rc1-bk9.updated/fs/filetrack.c --- .8843-linux-2.6.9-rc1-bk9/fs/filetrack.c 1970-01-01 10:00:00.000000000 +1000 +++ .8843-linux-2.6.9-rc1-bk9.updated/fs/filetrack.c 2004-09-06 18:41:52.000000000 +1000 @@ -0,0 +1,27 @@ +#include + +#define TF_DELETED 0x01 +#define TF_ADDED 0x02 +#define TF_WRITTEN 0x04 + +struct tracked_file +{ + struct dentry *me; + int flags; + int cost; +}; + + + +void filetrack_delete(struct dentry *dentry) +{ +} + +void filetrack_add(struct dentry *dentry) +{ + +} + +void filetrack_write(struct dentry *dentry) +{ +} diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .8843-linux-2.6.9-rc1-bk9/fs/namei.c .8843-linux-2.6.9-rc1-bk9.updated/fs/namei.c --- .8843-linux-2.6.9-rc1-bk9/fs/namei.c 2004-09-03 09:31:01.000000000 +1000 +++ .8843-linux-2.6.9-rc1-bk9.updated/fs/namei.c 2004-09-03 14:57:24.000000000 +1000 @@ -1227,6 +1227,7 @@ int vfs_create(struct inode *dir, struct if (!error) { inode_dir_notify(dir, DN_CREATE); security_inode_post_create(dir, dentry, mode); + filetrack_add(dentry); } return error; } @@ -2126,6 +2127,8 @@ int vfs_rename(struct inode *old_dir, st inode_dir_notify(old_dir, DN_DELETE); inode_dir_notify(new_dir, DN_CREATE); } + filetrack_delete(old_dentry); + filetrack_add(new_dentry); } return error; } diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .8843-linux-2.6.9-rc1-bk9/fs/read_write.c .8843-linux-2.6.9-rc1-bk9.updated/fs/read_write.c --- .8843-linux-2.6.9-rc1-bk9/fs/read_write.c 2004-08-16 10:16:33.000000000 +1000 +++ .8843-linux-2.6.9-rc1-bk9.updated/fs/read_write.c 2004-09-03 14:58:33.000000000 +1000 @@ -260,8 +260,10 @@ ssize_t vfs_write(struct file *file, con ret = file->f_op->write(file, buf, count, pos); else ret = do_sync_write(file, buf, count, pos); - if (ret > 0) + if (ret > 0) { dnotify_parent(file->f_dentry, DN_MODIFY); + filetrack_write(file->f_dentry); + } } } diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .8843-linux-2.6.9-rc1-bk9/include/linux/filetrack.h .8843-linux-2.6.9-rc1-bk9.updated/include/linux/filetrack.h --- .8843-linux-2.6.9-rc1-bk9/include/linux/filetrack.h 1970-01-01 10:00:00.000000000 +1000 +++ .8843-linux-2.6.9-rc1-bk9.updated/include/linux/filetrack.h 2004-09-03 14:52:42.000000000 +1000 @@ -0,0 +1,20 @@ +#ifndef _LINUX_FILETRACKING_H +#define _LINUX_FILETRACKING_H + +#include + +#ifdef CONFIG_FILETRACKING +void filetrack_delete(struct dentry *dentry); +void filetrack_add(struct dentry *dentry); +void filetrack_write(struct dentry *dentry); +#else +static inline void filetrack_delete(struct dentry *dentry) +{ +} +static inline void filetrack_add(struct dentry *dentry) +{ +} +static inline void filetrack_write(struct dentry *dentry) +{ +} +#endif /* _LINUX_FILETRACKING_H */ diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .8843-linux-2.6.9-rc1-bk9/mm/mmap.c .8843-linux-2.6.9-rc1-bk9.updated/mm/mmap.c --- .8843-linux-2.6.9-rc1-bk9/mm/mmap.c 2004-09-03 09:31:09.000000000 +1000 +++ .8843-linux-2.6.9-rc1-bk9.updated/mm/mmap.c 2004-09-03 15:04:43.000000000 +1000 @@ -1587,6 +1587,10 @@ detach_vmas_to_be_unmapped(struct mm_str insertion_point = (prev ? &prev->vm_next : &mm->mmap); do { + /* For want of a good time, we mark "write" at munmap. */ + if (vma->vm_file && (vma->vm_flags & VM_WRITE)) + filetrack_write(vma->vm_file->f_dentry); + rb_erase(&vma->vm_rb, &mm->mm_rb); mm->map_count--; tail_vma = vma;