[linux-cifs-client] Re: cthon test progress

Steve French smfrench at gmail.com
Thu Sep 25 02:06:30 GMT 2008


WindowsXP also seems to do this (ie SMB rename of hard link files
works - but actually deletes the source file, unlike what posix
specifies).

On Wed, Sep 24, 2008 at 7:51 PM, Steve French <smfrench at gmail.com> wrote:
> The bad news is that it looks like Windows 2008 returns ok on the
> original rename (instead of EEXIST) so we have to move this UniqueId
> detection up ... (which will slow things down in the main path)
>
> On Wed, Sep 24, 2008 at 7:12 PM, Jeff Layton <jlayton at redhat.com> wrote:
>> On Wed, 24 Sep 2008 18:44:41 -0500
>> "Steve French" <smfrench at gmail.com> wrote:
>>
>>> With LinuxExtensionsDisabled and this patch applied, now make it farther.
>>>
>>> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
>>> index db091c5..ba0d9fa 100644
>>> --- a/fs/cifs/inode.c
>>> +++ b/fs/cifs/inode.c
>>> @@ -19,7 +19,6 @@
>>>   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
>>>   */
>>>  #include <linux/fs.h>
>>> -#include <linux/stat.h>
>>>  #include <linux/pagemap.h>
>>>  #include <asm/div64.h>
>>>  #include "cifsfs.h"
>>> @@ -1309,8 +1308,33 @@ int cifs_rename(struct inode *source_inode,
>>> struct dentry *source_direntry,
>>>                                       info_buf_target->UniqueId))
>>>                               /* same file, POSIX says that this is a noop */
>>>                               goto cifs_rename_exit;
>>> -             } /* else ... BB we could add the same check for Windows by
>>> -                  checking the UniqueId via FILE_INTERNAL_INFO */
>>> +             } else {
>>> +                     __u64 src_inode_num;
>>> +                     __u64 target_inode_num;
>>> +                     cFYI(1, ("check hardlinks windows style on %s",
>>> +                              fromName));
>>> +                     rc = CIFSGetSrvInodeNumber(xid, pTcon,
>>> +                                     fromName, &src_inode_num,
>>> +                                     cifs_sb_source->local_nls,
>>> +                                     cifs_sb_source->mnt_cifs_flags &
>>> +                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
>>> +                     if (rc)
>>> +                             goto unlink_target;
>>> +
>>> +                     rc = CIFSGetSrvInodeNumber(xid, pTcon,
>>> +                                     toName, &target_inode_num,
>>> +                                     cifs_sb_source->local_nls,
>>> +                                     cifs_sb_source->mnt_cifs_flags &
>>> +                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
>>> +                     if (rc)
>>> +                             goto unlink_target;
>>> +
>>> +                     if ((src_inode_num != 0) &&
>>> +                                     (src_inode_num == target_inode_num)) {
>>> +                             cFYI(1, ("inode numbers match - rename noop"));
>>> +                             goto cifs_rename_exit;
>>> +                     }
>>> +             }
>>>  unlink_target:
>>>               /*
>>>                * we either can not tell the files are hardlinked (as with
>>>
>>> The "special" connectathon tests now fails at:
>>>
>>> second check for lost reply on non-idempotent requests
>>> testing 50 idempotencies in directory "testdir"
>>> stat 1: bad file type/size 0102767/30
>>> special tests failed
>>>
>>>
>>
>> Nice work.
>>
>> It would also be nice to see the hardlink detection code code broken
>> out into a separate function. cifs_rename is getting pretty large and
>> unweildy and that seems like a good clean spot for an interface.
>> --
>> Jeff Layton <jlayton at redhat.com>
>>
>
>
>
> --
> Thanks,
>
> Steve
>



-- 
Thanks,

Steve


More information about the linux-cifs-client mailing list