From 6b766075ed8b82b5d52db9f5d338000cfd64ff50 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 27 Mar 2009 14:35:06 -0700 Subject: [PATCH] kclient: i_pin_ref Ability to carry refs on CAP_PIN. --- src/kernel/caps.c | 5 +++++ src/kernel/inode.c | 1 + src/kernel/super.h | 13 ++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/kernel/caps.c b/src/kernel/caps.c index a7257e147a1d2..a9746be08d1cf 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -1092,6 +1092,8 @@ out: */ static void __take_cap_refs(struct ceph_inode_info *ci, int got) { + if (got & CEPH_CAP_PIN) + ci->i_pin_ref++; if (got & CEPH_CAP_FILE_RD) ci->i_rd_ref++; if (got & CEPH_CAP_FILE_RDCACHE) @@ -1211,6 +1213,9 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had) struct ceph_cap_snap *capsnap; spin_lock(&inode->i_lock); + if (had & CEPH_CAP_PIN) + if (--ci->i_pin_ref == 0) + last++; if (had & CEPH_CAP_FILE_RD) if (--ci->i_rd_ref == 0) last++; diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 41adb67f03a1c..6ab193327655a 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -281,6 +281,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb) ci->i_wanted_max_size = 0; ci->i_requested_max_size = 0; + ci->i_pin_ref = 0; ci->i_rd_ref = 0; ci->i_rdcache_ref = 0; ci->i_wr_ref = 0; diff --git a/src/kernel/super.h b/src/kernel/super.h index c82948a33852f..951a7d9644c5e 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -282,6 +282,7 @@ struct ceph_inode_info { struct timespec i_old_atime; /* held references to caps */ + int i_pin_ref; int i_rd_ref, i_rdcache_ref, i_wr_ref; int i_wrbuffer_ref, i_wrbuffer_ref_head; u32 i_rdcache_gen; /* we increment this each time we get RDCACHE. @@ -463,15 +464,17 @@ extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); static inline int __ceph_caps_used(struct ceph_inode_info *ci) { int used = 0; + if (ci->i_pin_ref) + used |= CEPH_CAP_PIN; if (ci->i_rd_ref) - used |= CEPH_CAP_GRD; + used |= CEPH_CAP_FILE_RD; if (ci->i_rdcache_ref || ci->i_rdcache_gen) - used |= CEPH_CAP_GRDCACHE; + used |= CEPH_CAP_FILE_RDCACHE; if (ci->i_wr_ref) - used |= CEPH_CAP_GWR; + used |= CEPH_CAP_FILE_WR; if (ci->i_wrbuffer_ref) - used |= CEPH_CAP_GWRBUFFER; - return CEPH_CAP_FILE(used); + used |= CEPH_CAP_FILE_WRBUFFER; + return used; } /* -- 2.39.5