[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mv does not behave like Solaris mv with respect to directory content
From: |
Haynes, Tom |
Subject: |
Re: mv does not behave like Solaris mv with respect to directory contents |
Date: |
Mon, 30 Sep 2002 08:45:20 -0700 (PDT) |
It will be version 6.4 of OnTap.
Thanks for making the change.
> Thanks for the patch and for your persistence.
> I've applied the following patch to coreutils-4.5.1
> (the successor to the fileutils package).
> This change will be in coreutils-4.5.2.
>
> In move mode, always first try to rename. Before, upon failure to
> rename a directory, this code would never attempt to rename any
> other file in that directory, but would thenceforth always copy.
> On some systems (NetApp version ??), renaming a directory may fail
> with EXDEV, yet renaming files within that directory to a newly-
> created destination directory succeeds.
> * src/copy.c (copy_internal): Remove local, move_mode;
> use x->move_mode instead. Based on a patch from Tom Haynes.
>
> Can you tell me the version of NetApp for which this makes a difference?
> Then I could fill in the `??' blank in the ChangeLog entry above.
>
> Jim
> ---------------------
> Index: copy.c
> ===================================================================
> RCS file: /fetish/cu/src/copy.c,v
> retrieving revision 1.137
> diff -u -p -u -p -r1.137 copy.c
> --- copy.c 20 Jul 2002 20:06:41 -0000 1.137
> +++ copy.c 29 Sep 2002 08:38:08 -0000
> @@ -87,7 +87,7 @@ static int copy_internal PARAMS ((const
> int new_dst, dev_t device,
> struct dir_list *ancestors,
> const struct cp_options *x,
> - int move_mode,
> + int command_line_arg,
> int *copy_into_self,
> int *rename_succeeded));
>
> @@ -801,14 +801,7 @@ copy_internal (const char *src_path, con
> int ran_chown = 0;
> int preserve_metadata;
>
> - /* move_mode is set to the value from the `options' parameter for the
> - first copy_internal call. For any subsequent recursive call, it must
> - be zero. This is because if we're moving (via mv) a hierarchy and
> - end up having to recurse, it means the initial rename failed and so we
> - are in the process of *copy*ing all of the parts, not renaming them. */
> - int move_mode = (command_line_arg ? x->move_mode : 0);
> -
> - if (move_mode && rename_succeeded)
> + if (x->move_mode && rename_succeeded)
> *rename_succeeded = 0;
>
> *copy_into_self = 0;
> @@ -964,7 +957,7 @@ copy_internal (const char *src_path, con
> }
> }
>
> - if (move_mode)
> + if (x->move_mode)
> {
> /* In move_mode, DEST may not be an existing directory. */
> if (S_ISDIR (dst_sb.st_mode))
> @@ -1127,9 +1120,7 @@ copy_internal (const char *src_path, con
> return 0;
> }
>
> - /* Note that this is testing the local variable move_mode, not
> - the x->move_mode member. */
> - if (move_mode)
> + if (x->move_mode)
> {
> if (rename (src_path, dst_path) == 0)
> {
>
>
> "Haynes, Tom" <address@hidden> wrote:
> > As a followup, I've not seen a reply. ;>
> >
> > Here is a diff of my hack to get this working:
> >
> > cetialpha5.eng.netapp.com:> diff copy.c ../../fileutils-4.1.stock/src/copy.c
> > 124c124
> > < const struct cp_options *x, int *copy_into_self, int move_mode)
> > ---
> >> const struct cp_options *x, int *copy_into_self)
> > 156c156
> > < ancestors, &non_command_line_options, move_mode,
> > ---
> >> ancestors, &non_command_line_options, 0,
> > 920c920
> > < copy_into_self, move_mode))
> > ---
> >> copy_into_self))
> >
> >> I've looked at traces of both Solaris mv and the cut and paste GUI
> >> operation
> >> on windows for behavior when a directory is moved. In both cases, if
> >> the rename of the directory failed, then it is copied and then the entries
> >> are moved across one by one. Both approaches try a move and not a copy.
> >>
> >> In the GNU mv, if the directory rename fails, then the entries are all
> >> copied and no attempt is made to move them across. As an optimization,
> >> I see why that would be there. However, it does yield different behavior
> >> than other platforms.
> >>
> >> In NetApp's NFS file servers, we have the concept of a quota tree, qtree,
> >> which
> >> is a combination of a logical partition and quotas on a rooted subtree
> >> of a volume. In the past, we disallowed moving files across qtrees. In
> >> our next release, we are going to allow moving files, but not directories,
> >> across qtrees. With the typical client implementation of mv, the
> >> rename of the directory fails, so it gets copied to the new qtree,
> >> and then recursion tries to rename the files. They get renamed and
> >> finally the original directory gets deleted.
> >>
> >> This will not work with the 4.1 version of fileutils.
>
--
Tom Haynes, cfb
address@hidden