From 254ac6a6066ec1eb9d440fef6d9cd053ac273b1b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 11 Aug 2008 15:47:47 -0700 Subject: [PATCH] kclient: some refcounting fixes --- src/kernel/dir.c | 2 ++ src/kernel/inode.c | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index cb7c88d82c3a1..e49993907dfe8 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -277,6 +277,8 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req, strcmp(dentry->d_name.name, client->mount_args.snapdir_name) == 0) { struct inode *parent = dentry->d_parent->d_inode; struct inode *inode = ceph_get_snapdir(parent); + dout(10, "ENOENT on snapdir %p '%.*s', linking to snapdir %p\n", + dentry, dentry->d_name.len, dentry->d_name.name, inode); d_add(dentry, inode); err = 0; } diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 5e5117826f0b8..28bb12bb6cab5 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -919,6 +919,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, if (d == rinfo->trace_numi-rinfo->trace_snapdirpos-1) { struct inode *snapdir = ceph_get_snapdir(dn->d_inode); + dput(dn); dn = d_find_alias(snapdir); iput(snapdir); dout(10, " snapdir dentry is %p\n", dn); @@ -1013,11 +1014,12 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req) struct dentry *dn; struct inode *in; int i; + struct inode *snapdir = 0; if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) { - in = ceph_get_snapdir(parent->d_inode); - parent = d_find_alias(in); - iput(in); + snapdir = ceph_get_snapdir(parent->d_inode); + parent = d_find_alias(snapdir); + dput(parent); dout(10, "readdir_prepopulate %d items under SNAPDIR dn %p\n", rinfo->dir_nr, parent); } else { @@ -1086,6 +1088,8 @@ retry_lookup: req->r_session, req->r_from_time); dput(dn); } + + iput(snapdir); dout(10, "readdir_prepopulate done\n"); return 0; } @@ -2129,6 +2133,12 @@ static int do_getattr(struct dentry *dentry, int mask) int want_inode = 0; struct dentry *ret; + if (ceph_vino(dentry->d_inode).snap == CEPH_SNAPDIR) { + dout(30, "getattr dentry %p inode %p SNAPDIR\n", dentry, + dentry->d_inode); + return 0; + } + dout(30, "getattr dentry %p inode %p\n", dentry, dentry->d_inode); -- 2.39.5