]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Client: bump ll_ref from int32 to uint64_t 29187/head
authorXiaoxi CHEN <xiaoxchen@ebay.com>
Fri, 19 Jul 2019 15:31:24 +0000 (08:31 -0700)
committerXiaoxi CHEN <xiaoxchen@ebay.com>
Tue, 23 Jul 2019 02:37:19 +0000 (19:37 -0700)
ll_ref can surge up if application repeatly lookup same dentry
and finally cause overflow.

https://tracker.ceph.com/issues/40775 is an example.

in kernel fuse driver and libfuse, uint64_t is used, update
ceph-fuse side to match.

Fixes: https://tracker.ceph.com/issues/40775
Signed-off-by: Xiaoxi CHEN <xiaoxchen@ebay.com>
(cherry picked from commit bb46de885336a8cd2adc9c0507e543c6832346e7)

 Conflicts:
src/client/Client.h
        use new code, skip all non-toched changes.
src/client/Inode.h
        use new code.

src/client/Client.cc
src/client/Client.h
src/client/Inode.h

index 5115555ae21636fcf76aacaf4977dc5e046de4f6..4c1d92e4a66a83af63191e81704c7850bb75f31b 100644 (file)
@@ -10526,7 +10526,7 @@ void Client::_ll_get(Inode *in)
   ldout(cct, 20) << __func__ << " " << in << " " << in->ino << " -> " << in->ll_ref << dendl;
 }
 
-int Client::_ll_put(Inode *in, int num)
+int Client::_ll_put(Inode *in, uint64_t num)
 {
   in->ll_put(num);
   ldout(cct, 20) << __func__ << " " << in << " " << in->ino << " " << num << " -> " << in->ll_ref << dendl;
@@ -10567,7 +10567,7 @@ void Client::_ll_drop_pins()
   }
 }
 
-bool Client::_ll_forget(Inode *in, int count)
+bool Client::_ll_forget(Inode *in, uint64_t count)
 {
   inodeno_t ino = in->ino;
 
@@ -10596,7 +10596,7 @@ bool Client::_ll_forget(Inode *in, int count)
   return last;
 }
 
-bool Client::ll_forget(Inode *in, int count)
+bool Client::ll_forget(Inode *in, uint64_t count)
 {
   Mutex::Locker lock(client_lock);
   return _ll_forget(in, count);
index 9c75a1c4590cec383f13883f09971dc1893e746e..9bd77dd90196d178636c94d1e89982ad0267bd86 100644 (file)
@@ -755,7 +755,7 @@ private:
   void _fragmap_remove_stopped_mds(Inode *in, mds_rank_t mds);
 
   void _ll_get(Inode *in);
-  int _ll_put(Inode *in, int num);
+  int _ll_put(Inode *in, uint64_t num);
   void _ll_drop_pins();
 
   Fh *_create_fh(Inode *in, int flags, int cmode, const UserPerm& perms);
@@ -947,7 +947,7 @@ private:
   int _lookup_parent(Inode *in, const UserPerm& perms, Inode **parent=NULL);
   int _lookup_name(Inode *in, Inode *parent, const UserPerm& perms);
   int _lookup_ino(inodeno_t ino, const UserPerm& perms, Inode **inode=NULL);
-  bool _ll_forget(Inode *in, int count);
+  bool _ll_forget(Inode *in, uint64_t count);
 
 public:
   int mount(const std::string &mount_root, const UserPerm& perms,
@@ -1149,7 +1149,7 @@ public:
   int ll_lookupx(Inode *parent, const char *name, Inode **out,
                        struct ceph_statx *stx, unsigned want, unsigned flags,
                        const UserPerm& perms);
-  bool ll_forget(Inode *in, int count);
+  bool ll_forget(Inode *in, uint64_t count);
   bool ll_put(Inode *in);
   int ll_get_snap_ref(snapid_t snap);
 
index ce7b1a6eb611867e108f610bad8a41adf445c6d9..f8505c8f9693940f96743422eee002312ea75c66 100644 (file)
@@ -218,7 +218,7 @@ struct Inode {
   uint64_t     reported_size, wanted_max_size, requested_max_size;
 
   int       _ref;      // ref count. 1 for each dentry, fh that links to me.
-  int       ll_ref;   // separate ref count for ll client
+  uint64_t  ll_ref;   // separate ref count for ll client
   xlist<Dentry *> dentries; // if i'm linked to a dentry.
   string    symlink;  // symlink content, if it's a symlink
   map<string,bufferptr> xattrs;
@@ -246,8 +246,8 @@ struct Inode {
   void ll_get() {
     ll_ref++;
   }
-  void ll_put(int n=1) {
-    assert(ll_ref >= n);
+  void ll_put(uint64_t n=1) {
+    ceph_assert(ll_ref >= n);
     ll_ref -= n;
   }