From 3a351ba178d18b9435ed64dc2980333865f9d2a9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 15 Apr 2008 09:22:12 -0700 Subject: [PATCH] kclient: reuse directory cap_pins when we can --- src/TODO | 1 + src/kernel/file.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/TODO b/src/TODO index 79f96f58d301d..872941b64cd39 100644 --- a/src/TODO +++ b/src/TODO @@ -20,6 +20,7 @@ yehuda: - apply_truncate needs to truncate page cache, or something? kernel client +- take file_mode refs on inode safely/atomically on open - file_data_version stuff! - deal with CAP_RDCACHE properly: invalidate cache pages? - trim expired leases so we don't indefinitely hold dcache/icache refs... diff --git a/src/kernel/file.c b/src/kernel/file.c index e2b6b7619339b..3169720601716 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -117,6 +117,23 @@ int ceph_lookup_open(struct inode *dir, struct dentry *dentry, dout(5, "ceph_lookup_open dentry %p '%.*s' flags %d mode 0%o\n", dentry, dentry->d_name.len, dentry->d_name.name, flags, mode); + /* can we re-use an existing CAP_PIN? */ + if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)) { + struct ceph_inode_info *ci = ceph_inode(dentry->d_inode); + spin_lock(&ci->vfs_inode.i_lock); + if (__ceph_caps_issued(ci) & CEPH_CAP_PIN) { + dout(10, "using existing CAP_PIN on %p\n", + dentry->d_inode); + ci->i_nr_by_mode[FILE_MODE_PIN]++; + spin_unlock(&ci->vfs_inode.i_lock); + err = ceph_init_file(&ci->vfs_inode, file, flags); + BUG_ON(err); /* fixme */ + return 0; + } + spin_unlock(&ci->vfs_inode.i_lock); + } + + /* do the open */ req = prepare_open_request(dir->i_sb, dentry, flags, mode); if (IS_ERR(req)) return PTR_ERR(req); -- 2.39.5