anchor.diff:      end.
   
   -spec do_get_tag_data(tagid(), volume_name(), {pid(), _}, #state{}) -> 'ok'.
  -do_get_tag_data(TagId, VolName, From, S) ->
  +do_get_tag_data(TagId, VolName, From, #state{root = Root}) ->
       {ok, TagDir, _Url} = ddfs_util:hashdir(TagId,
                                              disco:host(node()),
                                              "tag",
  -                                           S#state.root,
  +                                           Root,
                                              VolName),
       TagPath = filename:join(TagDir, binary_to_list(TagId)),
       case prim_file:read_file(TagPath) of
  
positive.code: 
  -spec do_put_tag_commit(tagname(), [{node(), volume_name()}], #state{}) ->
                         {{'ok', url()} | {'error', _}, #state{}}.
  do_put_tag_commit(Tag, TagVol, S) ->
      {_, VolName} = lists:keyfind(node(), 1, TagVol),
      {ok, Local, Url} = ddfs_util:hashdir(Tag,
                                           S#state.nodename,
                                           "tag",
                                           S#state.root,
                                           VolName),
      {TagName, Time} = ddfs_util:unpack_objname(Tag),
  
  
negative.code: -spec do_put_tag_data(tagname(), binary(), #state{}) -> put_tag_data_result().
  do_put_tag_data(_Tag, _Data, #state{vols = []}) ->
      {error, no_volumes};
  do_put_tag_data(Tag, Data, #state{nodename = NodeName,
                                    vols = Vols,
                                    root = Root}) ->
      {_Space, VolName} = choose_vol(Vols),
      {ok, Local, _} = ddfs_util:hashdir(Tag,
                                         NodeName,
                                         "tag",
                                         Root,
                                         VolName),
      case ddfs_util:ensure_dir(Local) of
          ok ->
  