[linux-cifs-client] [PATCH 2/2] cifs: fix busy-file renames and refactor cifs_rename logic

Jeff Layton jlayton at redhat.com
Fri Sep 5 10:31:09 GMT 2008


On Thu, 4 Sep 2008 23:02:04 -0400
Christoph Hellwig <hch at infradead.org> wrote:

> On Thu, Sep 04, 2008 at 10:45:26PM -0400, Jeff Layton wrote:
> > Break out the code that does the actual renaming into a separate
> > function and have cifs_rename call that. That function will attempt a
> > path based rename first and then do a filehandle based one if it looks
> > like the source is busy.
> > 
> > The existing logic tried a path based rename first, but if we needed to
> > remove the destination then it only attempted a filehandle based rename
> > afterward. Not all servers support renaming by filehandle, so we need to
> > always attempt path rename first and fall back to filehandle rename if
> > it doesn't work.
> > 
> > The renaming logic also wasn't quite right in some cases. If the source
> > and target are hardlinked then it's not really a no-op (we still need to
> > unlink the source).
> 
> Actually per posix rename _is_ a no-op if old and new are hardlinks to
> same inode.  But this case is completely handled in the VFS, and
> filesystems don't need to consider it at all.
> 

I guess you mean this quote from the posix spec:

"If the old argument and the new argument resolve to the same existing
file, rename() shall return successfully and perform no other action."

I didn't bother to check the POSIX spec when I was doing this. I just
checked what happened on ext3 when you rename one hardlink to an inode
on top of another. Oops! If that's the case, I can just make this a
no-op after all. I'll plan to respin this patch and repost.

Does the rest of the logic here look correct?

Thanks,
-- 
Jeff Layton <jlayton at redhat.com>


More information about the linux-cifs-client mailing list