mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: cifs: don't use CIFSGetSrvInodeNumber in is_path_accessible cifs: clean up handling when server doesn't consistently support inode numbers
This commit is contained in:
commit
413623e707
|
@ -388,4 +388,5 @@ extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|||
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||
extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
|
||||
const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
|
||||
extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb);
|
||||
#endif /* _CIFSPROTO_H */
|
||||
|
|
|
@ -2220,16 +2220,8 @@ is_path_accessible(int xid, struct cifsTconInfo *tcon,
|
|||
struct cifs_sb_info *cifs_sb, const char *full_path)
|
||||
{
|
||||
int rc;
|
||||
__u64 inode_num;
|
||||
FILE_ALL_INFO *pfile_info;
|
||||
|
||||
rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num,
|
||||
cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
if (rc != -EOPNOTSUPP)
|
||||
return rc;
|
||||
|
||||
pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
|
||||
if (pfile_info == NULL)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -512,13 +512,10 @@ int cifs_get_inode_info(struct inode **pinode,
|
|||
cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
if (rc1) {
|
||||
if (rc1 || !fattr.cf_uniqueid) {
|
||||
cFYI(1, ("GetSrvInodeNum rc %d", rc1));
|
||||
fattr.cf_uniqueid = iunique(sb, ROOT_I);
|
||||
/* disable serverino if call not supported */
|
||||
if (rc1 == -EINVAL)
|
||||
cifs_sb->mnt_cifs_flags &=
|
||||
~CIFS_MOUNT_SERVER_INUM;
|
||||
cifs_autodisable_serverino(cifs_sb);
|
||||
}
|
||||
} else {
|
||||
fattr.cf_uniqueid = iunique(sb, ROOT_I);
|
||||
|
|
|
@ -715,3 +715,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
|
|||
ctoUCS_out:
|
||||
return i;
|
||||
}
|
||||
|
||||
void
|
||||
cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
|
||||
{
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
||||
cifs_sb->mnt_cifs_flags &= CIFS_MOUNT_SERVER_INUM;
|
||||
cERROR(1, ("Autodisabling the use of server inode numbers on "
|
||||
"%s. This server doesn't seem to support them "
|
||||
"properly. Hardlinks will not be recognized on this "
|
||||
"mount. Consider mounting with the \"noserverino\" "
|
||||
"option to silence this message.",
|
||||
cifs_sb->tcon->treeName));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -727,11 +727,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir,
|
|||
cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *)
|
||||
pfindEntry, cifs_sb);
|
||||
|
||||
/* FIXME: make _to_fattr functions fill this out */
|
||||
if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO)
|
||||
if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
|
||||
fattr.cf_uniqueid = inum;
|
||||
else
|
||||
} else {
|
||||
fattr.cf_uniqueid = iunique(sb, ROOT_I);
|
||||
cifs_autodisable_serverino(cifs_sb);
|
||||
}
|
||||
|
||||
ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid);
|
||||
tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr);
|
||||
|
|
Loading…
Reference in New Issue