]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw:bucket link now set the bucket.instance acl 8037/head
authorAran85 <zhangzengran@h3c.com>
Mon, 28 Sep 2015 00:23:22 +0000 (08:23 +0800)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 11 Mar 2016 00:08:46 +0000 (16:08 -0800)
Fixes: #11076
Signed-off-by: Zengran Zhang <zhangzengran@h3c.com>
src/rgw/rgw_bucket.cc

index a070508c3150c9e792b7902ce93bd449474731b8..d5edddfade3b156d676c840793e0651c9a36e82f 100644 (file)
@@ -203,9 +203,6 @@ int rgw_link_bucket(RGWRados *store, const rgw_user& user_id, rgw_bucket& bucket
     ret = store->get_bucket_entrypoint_info(obj_ctx, tenant_name, bucket_name, ep, &ot, NULL, &attrs);
     if (ret < 0 && ret != -ENOENT) {
       ldout(store->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned " << ret << dendl;
-    } else if (ret >= 0 && ep.linked && ep.owner != user_id) {
-      ldout(store->ctx(), 0) << "can't link bucket, already linked to a different user: " << ep.owner << dendl;
-      return -EINVAL;
     }
   }
 
@@ -613,6 +610,8 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg)
     return r;
   }
 
+  rgw_user user_id = op_state.get_user_id();
+
   map<string, bufferlist>::iterator aiter = attrs.find(RGW_ATTR_ACL);
   if (aiter != attrs.end()) {
     bufferlist aclbl = aiter->second;
@@ -627,7 +626,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg)
       return -EIO;
     }
 
-    r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name);
+    r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name, false);
     if (r < 0) {
       set_err_msg(err_msg, "could not unlink policy from user " + owner.get_id().to_str());
       return r;
@@ -654,6 +653,17 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg)
     if (r < 0)
       return r;
 
+    RGWAccessControlPolicy policy_instance;
+    policy_instance.create_default(user_info.user_id, display_name);
+    aclbl.clear();
+    policy_instance.encode(aclbl);
+
+    string oid_bucket_instance = RGW_BUCKET_INSTANCE_MD_PREFIX + key;  
+    rgw_bucket bucket_instance;
+    bucket_instance.name = oid_bucket_instance;
+    rgw_obj obj_bucket_instance(bucket_instance, no_oid);
+    r = store->system_obj_set_attr(NULL, obj_bucket_instance, RGW_ATTR_ACL, aclbl, &objv_tracker);
+
     r = rgw_link_bucket(store, user_info.user_id, bucket, 0);
     if (r < 0)
       return r;