First part of fix for rcfs inode leak seen if classes are repeatedly
created and deleted. Use the same function to create both files and
directories and remove unnecessary inode link count increments.
Signed-off-by: Shailabh Nagar <[EMAIL PROTECTED]>
Signed-off-by: Gerrit Huizenga <[EMAIL PROTECTED]>
-------------
fs/rcfs/inode.c | 52 ++++++++++++++++++++++++++--------------------------
1 files changed, 26 insertions(+), 26 deletions(-)
Index: linux-2.6.13-ckrm2/fs/rcfs/inode.c
===================================================================
--- linux-2.6.13-ckrm2.orig/fs/rcfs/inode.c 2005-09-09 21:41:36.000000000
-0700
+++ linux-2.6.13-ckrm2/fs/rcfs/inode.c 2005-09-09 21:43:04.000000000 -0700
@@ -96,41 +96,41 @@ int rcfs_mknod(struct inode *dir, struct
return error;
}
+static struct dentry *rcfs_get_dentry(struct dentry *parent, const char *name)
+{
+ struct qstr qstr;
+
+ qstr.name = name;
+ qstr.len = strlen(name);
+ qstr.hash = full_name_hash(name,qstr.len);
+ return lookup_hash(&qstr,parent);
+}
+
struct dentry *rcfs_create_internal(struct dentry *parent,
struct rcfs_magf *magf, int magic)
{
- struct qstr qstr;
struct dentry *mfdentry;
+ int lockrc, err=0, mode;
- /* Get new dentry for name */
- qstr.name = magf->name;
- qstr.len = strlen(magf->name);
- qstr.hash = full_name_hash(magf->name, qstr.len);
- mfdentry = lookup_hash(&qstr, parent);
+ lockrc = down_trylock(&parent->d_inode->i_sem);
+ mfdentry = rcfs_get_dentry(parent, magf->name);
if (!IS_ERR(mfdentry)) {
- int err;
- down(&parent->d_inode->i_sem);
- if (magic && (magf->mode & S_IFDIR))
- err = parent->d_inode->i_op->mkdir(parent->d_inode,
- mfdentry,
- magf->mode);
- else {
- err = rcfs_mknod(parent->d_inode, mfdentry,
- magf->mode, 0);
- /*
- * rcfs_mknod doesn't increment parent's link count,
- * i_op->mkdir does.
- */
- parent->d_inode->i_nlink++;
- }
- up(&parent->d_inode->i_sem);
- if (err) {
- dput(mfdentry);
- return mfdentry;
- }
+ mode = magf->mode;
+ if ((mode & S_IFMT) == S_IFDIR)
+ mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
+ else
+ mode = (mode & S_IALLUGO) | S_IFREG ;
+
+ err = rcfs_mknod(parent->d_inode, mfdentry, mode, 0);
}
+ if (!lockrc)
+ up(&parent->d_inode->i_sem);
+
+ if (err)
+ mfdentry = ERR_PTR(err);
+
return mfdentry;
}
--
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech