i) iterate over all mounted filesystems

   struct vfsmount {
        struct list_head mnt_hash;
        ...
        struct dentry *mnt_root;        /* root of the mounted tree */
        ...
   };

   for (u = 0; i < HASH_SIZE; u++) {
       struct vfsmount *mnt;
       list_for_each_entry(mnt, &mount_hashtable[u], mnt_hash) {
          struct dentry *root;
          root = mnt->mnt_root;
          ...
       }
   }

   ii) recursively walk the dentries of each tree starting from root dentry
       and clear d_name and d_iname

   struct dentry {
        ...
        struct qstr d_name;
        ...
        unsigned char d_iname[DNAME_INLINE_LEN];        /* small names */
        ...
        struct list_head d_subdirs;     /* our children */
        ...
   };

   void walk_dentries(struct dentry *dentry)
   {
       struct dentry *child;
       memset(dentry->d_iname, 0, DNAME_INLINE_LEN);
       memset(dentry->d_name.name, 0, dentry->d_name.len);
       list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child)
           walk_dentries(child);
   }

Signed-off-by: Aruna Balakrishnaiah <[email protected]>
---
 eppic_scripts/dir_names.c |   78 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)
 create mode 100644 eppic_scripts/dir_names.c

diff --git a/eppic_scripts/dir_names.c b/eppic_scripts/dir_names.c
new file mode 100644
index 0000000..dbe6d00
--- /dev/null
+++ b/eppic_scripts/dir_names.c
@@ -0,0 +1,78 @@
+string
+vfs_opt()
+{
+           return "l";
+}
+
+string
+vfs_usage()
+{
+           return "\n";
+}
+
+static void
+vfs_showusage()
+{
+           printf("usage : vfs %s", vfs_usage());
+}
+
+string
+vfs_help()
+{
+           return "Help";
+}
+
+void
+rm_names(struct dentry *dir)
+{
+       struct list_head *next, *head;
+
+       memset(dir->d_iname, 0, 0x20);
+       memset(dir->d_name.name, 0, 0x20);
+
+       head = (struct list_head *)&(dir->d_subdirs);
+       next = (struct list_head *)dir->d_subdirs.next;
+
+       while (next != head)
+       {
+               struct dentry *child, *off = 0;
+
+               child = (struct dentry *)((unsigned long)next - (unsigned 
long)&(off->d_u));
+               rm_names(child);
+               next = child->d_u.d_child.next;
+       }
+
+       return;
+}
+
+int
+vfs()
+{
+       int i;
+       struct list_head *tab;
+
+       tab = (struct list_head *)mount_hashtable;
+
+       for (i = 0; i < 256; i++)
+       {
+               struct list_head *head, *next;
+
+               head = (struct list_head *) (tab + i);
+               next = (struct list_head *) head->next;
+
+               if (!next)
+                       continue;
+
+               while (next != head)
+               {
+                       struct mount *mntfs;
+                       struct dentry *root;
+
+                       mntfs = (struct mount *)((unsigned long)next);
+                       root = (struct dentry *)mntfs->mnt.mnt_root;
+                       rm_names(root);
+                       next = mntfs->mnt_hash.next;
+               }
+       }
+       return 1;
+}


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to