From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shailabh Subject: Help on automatic population of directories Date: Fri, 05 Mar 2004 11:55:09 -0500 Sender: linux-fsdevel-owner@vger.kernel.org Message-ID: <4048B0ED.1010702@watson.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from e6.ny.us.ibm.com ([32.97.182.106]:25269 "EHLO e6.ny.us.ibm.com") by vger.kernel.org with ESMTP id S262656AbUCEQzN (ORCPT ); Fri, 5 Mar 2004 11:55:13 -0500 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i25GtA4i586062 for ; Fri, 5 Mar 2004 11:55:10 -0500 Received: from watson.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i25GtKB8077298 for ; Fri, 5 Mar 2004 11:55:20 -0500 To: linux-fsdevel List-Id: linux-fsdevel.vger.kernel.org Hi, I'm writing a ram-based filesystem. I want the filesystem to automatically create a few files inside every directory that a user creates. I'm trying to do this within the mkdir dir_inode op of the fs using code which looks like this: >>>>>>>>>>>>>>>>>> /* rcfs_mknod and rcfs_get_inode are replicas of corresponding code from fs/ramfs/inode.c */ static int rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) { struct inode * inode = rcfs_get_inode(dir->i_sb, mode, dev); int error = -ENOSPC, i=0; if (inode) { if (dir->i_mode & S_ISGID) { inode->i_gid = dir->i_gid; if (S_ISDIR(mode)) inode->i_mode |= S_ISGID; } d_instantiate(dentry, inode); dget(dentry); /* Extra count - pin the dentry in core */ error = 0; } return error; } static int rcfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) { int retval = rcfs_mknod(dir, dentry, mode | S_IFDIR, 0); /* rcfs_mknod is a complete replica of fs/ramfs/inode.c:ramfs_mknod */ if (!retval) dir->i_nlink++; /* Do something here to create some "magic" files in this directory before returning to the user */ return retval; } <<<<<<<<<<<<<<<<<<<<<<<<<< Q1: is there sufficient info in the dir/dentry variables for a file to be created within rcfs_mkdir (at the comment point) ? If so, what would be the best way to do this ? Q2: How can one find the vfsmnt given the dentry of a directory that has just been created ? I was thinking of using d_path() to lookup the complete path of the just-created directory and then calling a modified version of sys_mknod on the resulting string. Probably not the best way of doing this but it was simpler to understand :-) But I'm having trouble determining the vfsmnt from the dentry returned from rcfs_mknod - I tried using current->namespace->root and also current->fs->rootmnt with no success - dpath returns blank or garbage as the resulting string and not "/rcfs/hello/" which is what I expect when directory hello is being created. I'm new to filesystem development and still not completely clear about the relationships between mount points, dentries etc....Any pointers on useful functions would be much appreciated ! Thanks, Shailabh