]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: do not leak MetaRequests on get_or_create() failure
authorSage Weil <sage@newdream.net>
Wed, 29 Jun 2011 21:57:16 +0000 (14:57 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Thu, 30 Jun 2011 03:17:05 +0000 (20:17 -0700)
Avoid leaking in the error paths.

Signed-off-by: Sage Weil <sage@newdream.net>
src/client/Client.cc

index 475449d1bfd4ba6c671ea39789fb6f1c85ec528c..81d6dca9b2778bde5b6c73a81bae33a3a77dd5f4 100644 (file)
@@ -5936,8 +5936,8 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int ui
   req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
   int res = get_or_create(dir, name, &req->dentry);
-  if (res<0)
-    return res;
+  if (res < 0)
+    goto fail;
 
   res = make_request(req, uid, gid);
 
@@ -5945,6 +5945,10 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int ui
 
   ldout(cct, 3) << "mknod(" << path << ", 0" << oct << mode << dec << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_mknod(vinodeno_t parent, const char *name, mode_t mode, dev_t rdev, struct stat *attr, int uid, int gid)
@@ -6001,8 +6005,8 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, Inode
   req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
   int res = get_or_create(dir, name, &req->dentry);
-  if (res<0)
-    return res;
+  if (res < 0)
+    goto fail;
 
   res = make_request(req, uid, gid);
   
@@ -6025,6 +6029,10 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, Inode
          << ' ' << preferred_pg
          <<") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 
@@ -6052,7 +6060,7 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid)
 
   int res = get_or_create(dir, name, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
   
   ldout(cct, 10) << "_mkdir: making request" << dendl;
   res = make_request(req, uid, gid);
@@ -6062,6 +6070,10 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid)
 
   ldout(cct, 3) << "_mkdir(" << path << ", 0" << oct << mode << dec << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_mkdir(vinodeno_t parent, const char *name, mode_t mode, struct stat *attr, int uid, int gid)
@@ -6113,13 +6125,18 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid,
 
   int res = get_or_create(dir, name, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
 
   res = make_request(req, uid, gid);
 
   trim_cache();
   ldout(cct, 3) << "_symlink(\"" << path << "\", \"" << target << "\") = " << res << dendl;
   return res;
+
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_symlink(vinodeno_t parent, const char *name, const char *value, struct stat *attr, int uid, int gid)
@@ -6162,7 +6179,7 @@ int Client::_unlink(Inode *dir, const char *name, int uid, int gid)
 
   int res = get_or_create(dir, name, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
   req->dentry_drop = CEPH_CAP_FILE_SHARED;
   req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
@@ -6183,6 +6200,10 @@ int Client::_unlink(Inode *dir, const char *name, int uid, int gid)
   trim_cache();
   ldout(cct, 3) << "unlink(" << path << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_unlink(vinodeno_t vino, const char *name, int uid, int gid)
@@ -6218,7 +6239,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid)
 
   int res = get_or_create(dir, name, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
   res = _lookup(dir, name, &req->inode);
 
   res = make_request(req, uid, gid);
@@ -6235,6 +6256,10 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid)
   trim_cache();
   ldout(cct, 3) << "rmdir(" << path << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_rmdir(vinodeno_t vino, const char *name, int uid, int gid)
@@ -6272,19 +6297,19 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch
 
   int res = get_or_create(fromdir, fromname, &req->old_dentry);
   if (res < 0)
-    return res;
+    goto fail;
   req->old_dentry_drop = CEPH_CAP_FILE_SHARED;
   req->old_dentry_unless = CEPH_CAP_FILE_EXCL;
 
   res = get_or_create(todir, toname, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
   req->dentry_drop = CEPH_CAP_FILE_SHARED;
   req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
   res = _lookup(fromdir, fromname, &req->old_inode);
   if (res < 0)
-    return res;
+    goto fail;
   req->old_inode_drop = CEPH_CAP_LINK_SHARED;
 
   res = _lookup(todir, toname, &req->other_inode);
@@ -6301,6 +6326,10 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch
   trim_cache();
   ldout(cct, 3) << "rename(" << from << ", " << to << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_rename(vinodeno_t parent, const char *name, vinodeno_t newparent, const char *newname, int uid, int gid)
@@ -6344,7 +6373,7 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid)
 
   int res = get_or_create(dir, newname, &req->dentry);
   if (res < 0)
-    return res;
+    goto fail;
   
   res = make_request(req, uid, gid);
   ldout(cct, 10) << "link result is " << res << dendl;
@@ -6352,6 +6381,10 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid)
   trim_cache();
   ldout(cct, 3) << "link(" << existing << ", " << path << ") = " << res << dendl;
   return res;
+
+ fail:
+  delete req;
+  return res;
 }
 
 int Client::ll_link(vinodeno_t vino, vinodeno_t newparent, const char *newname, struct stat *attr, int uid, int gid)