anchor.diff:  -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, S) ->
  -    {_Space, VolName} = choose_vol(S#state.vols),
  +do_put_tag_data(Tag, Data, #state{nodename = NodeName,
  +                                  vols = Vols,
  +                                  root = Root}) ->
  +    {_Space, VolName} = choose_vol(Vols),
       {ok, Local, _} = ddfs_util:hashdir(Tag,
  -                                       S#state.nodename,
  +                                       NodeName,
                                          "tag",
  -                                       S#state.root,
  +                                       Root,
                                          VolName),
       case ddfs_util:ensure_dir(Local) of
           ok ->
  
positive.code: 
  -type tag_ts() :: not_found | {ok, {erlang:timestamp(), volume_name()}}.
  -spec do_get_tag_timestamp(tagname(), #state{}) -> tag_ts().
  do_get_tag_timestamp(TagName, S) ->
      case gb_trees:lookup(TagName, S#state.tags) of
          none ->
              notfound;
          {value, {_Time, _VolName} = TagNfo} ->
  
negative.code:     case ddfs_util:safe_rename(Src, Dst) of
          ok ->
              {{ok, Url},
               S#state{tags = gb_trees:enter(TagName, {Time, VolName}, Tags)}};
          {error, _} = E ->
              {E, S}
      end.
  