X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=fs%2F9p%2Fvfs_dentry.c;h=f9534f18df0a1a2bafdf70cd1b00466b8c5fb6b7;hb=9e88ba4e45ecad2425c4cc4e0861a26f4e36c6da;hp=062daa6000ab55a33441b8bcac7aa4375727fe14;hpb=86579dd06deecfa6ac88d5e84e4d63c397cd6f6d;p=linux-2.6 diff --git a/fs/9p/vfs_dentry.c b/fs/9p/vfs_dentry.c index 062daa6000..f9534f18df 100644 --- a/fs/9p/vfs_dentry.c +++ b/fs/9p/vfs_dentry.c @@ -30,14 +30,14 @@ #include #include #include -#include #include #include #include +#include +#include +#include -#include "debug.h" #include "v9fs.h" -#include "9p.h" #include "v9fs_vfs.h" #include "fid.h" @@ -52,41 +52,60 @@ static int v9fs_dentry_delete(struct dentry *dentry) { - dprintk(DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry); + P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry); + return 1; } /** - * v9fs_dentry_release - called when dentry is going to be freed - * @dentry: dentry that is being release + * v9fs_cached_dentry_delete - called when dentry refcount equals 0 + * @dentry: dentry in question + * + * Only return 1 if our inode is invalid. Only non-synthetic files + * (ones without mtime == 0) should be calling this function. * */ -void v9fs_dentry_release(struct dentry *dentry) +static int v9fs_cached_dentry_delete(struct dentry *dentry) { - int err; + struct inode *inode = dentry->d_inode; + P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry); - dprintk(DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry); + if(!inode) + return 1; - if (dentry->d_fsdata != NULL) { - struct list_head *fid_list = dentry->d_fsdata; - struct v9fs_fid *temp = NULL; - struct v9fs_fid *current_fid = NULL; + return 0; +} - list_for_each_entry_safe(current_fid, temp, fid_list, list) { - err = v9fs_t_clunk(current_fid->v9ses, current_fid->fid); +/** + * v9fs_dentry_release - called when dentry is going to be freed + * @dentry: dentry that is being release + * + */ - if (err < 0) - dprintk(DEBUG_ERROR, "clunk failed: %d name %s\n", - err, dentry->d_iname); +void v9fs_dentry_release(struct dentry *dentry) +{ + struct v9fs_dentry *dent; + struct p9_fid *temp, *current_fid; - v9fs_fid_destroy(current_fid); + P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry); + dent = dentry->d_fsdata; + if (dent) { + list_for_each_entry_safe(current_fid, temp, &dent->fidlist, + dlist) { + p9_client_clunk(current_fid); } - kfree(dentry->d_fsdata); /* free the list_head */ + kfree(dent); + dentry->d_fsdata = NULL; } } +struct dentry_operations v9fs_cached_dentry_operations = { + .d_delete = v9fs_cached_dentry_delete, + .d_release = v9fs_dentry_release, +}; + struct dentry_operations v9fs_dentry_operations = { .d_delete = v9fs_dentry_delete, .d_release = v9fs_dentry_release,