Linux Audio

Check our new training course

Loading...
v6.8
   1// SPDX-License-Identifier: LGPL-2.1
   2/*
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2010
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *
   7 */
   8#include <linux/fs.h>
   9#include <linux/stat.h>
  10#include <linux/slab.h>
  11#include <linux/pagemap.h>
  12#include <linux/freezer.h>
  13#include <linux/sched/signal.h>
  14#include <linux/wait_bit.h>
  15#include <linux/fiemap.h>
  16#include <asm/div64.h>
  17#include "cifsfs.h"
  18#include "cifspdu.h"
  19#include "cifsglob.h"
  20#include "cifsproto.h"
  21#include "smb2proto.h"
  22#include "cifs_debug.h"
  23#include "cifs_fs_sb.h"
  24#include "cifs_unicode.h"
  25#include "fscache.h"
  26#include "fs_context.h"
  27#include "cifs_ioctl.h"
  28#include "cached_dir.h"
 
 
 
 
 
 
 
 
 
 
 
  29
  30static void cifs_set_ops(struct inode *inode)
  31{
  32	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 
  33
  34	switch (inode->i_mode & S_IFMT) {
  35	case S_IFREG:
  36		inode->i_op = &cifs_file_inode_ops;
  37		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
 
  38			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  39				inode->i_fop = &cifs_file_direct_nobrl_ops;
  40			else
  41				inode->i_fop = &cifs_file_direct_ops;
  42		} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
  43			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  44				inode->i_fop = &cifs_file_strict_nobrl_ops;
  45			else
  46				inode->i_fop = &cifs_file_strict_ops;
  47		} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  48			inode->i_fop = &cifs_file_nobrl_ops;
  49		else { /* not direct, send byte range locks */
  50			inode->i_fop = &cifs_file_ops;
  51		}
  52
  53		/* check if server can support readahead */
  54		if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
  55				PAGE_SIZE + MAX_CIFS_HDR_SIZE)
  56			inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
  57		else
  58			inode->i_data.a_ops = &cifs_addr_ops;
 
  59		break;
  60	case S_IFDIR:
  61		if (IS_AUTOMOUNT(inode)) {
  62			inode->i_op = &cifs_namespace_inode_operations;
  63		} else {
  64			inode->i_op = &cifs_dir_inode_ops;
  65			inode->i_fop = &cifs_dir_ops;
  66		}
  67		break;
  68	case S_IFLNK:
  69		inode->i_op = &cifs_symlink_inode_ops;
  70		break;
  71	default:
  72		init_special_inode(inode, inode->i_mode, inode->i_rdev);
  73		break;
  74	}
  75}
  76
  77/* check inode attributes against fattr. If they don't match, tag the
  78 * inode for cache invalidation
  79 */
  80static void
  81cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
  82{
  83	struct cifs_fscache_inode_coherency_data cd;
  84	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
  85	struct timespec64 mtime;
  86
  87	cifs_dbg(FYI, "%s: revalidating inode %llu\n",
  88		 __func__, cifs_i->uniqueid);
  89
  90	if (inode->i_state & I_NEW) {
  91		cifs_dbg(FYI, "%s: inode %llu is new\n",
  92			 __func__, cifs_i->uniqueid);
  93		return;
  94	}
  95
  96	/* don't bother with revalidation if we have an oplock */
  97	if (CIFS_CACHE_READ(cifs_i)) {
  98		cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
  99			 __func__, cifs_i->uniqueid);
 100		return;
 101	}
 102
 103	 /* revalidate if mtime or size have changed */
 104	fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
 105	mtime = inode_get_mtime(inode);
 106	if (timespec64_equal(&mtime, &fattr->cf_mtime) &&
 107	    cifs_i->netfs.remote_i_size == fattr->cf_eof) {
 108		cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
 109			 __func__, cifs_i->uniqueid);
 110		return;
 111	}
 112
 113	cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
 114		 __func__, cifs_i->uniqueid);
 115	set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
 116	/* Invalidate fscache cookie */
 117	cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd);
 118	fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0);
 119}
 120
 121/*
 122 * copy nlink to the inode, unless it wasn't provided.  Provide
 123 * sane values if we don't have an existing one and none was provided
 124 */
 125static void
 126cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
 127{
 128	/*
 129	 * if we're in a situation where we can't trust what we
 130	 * got from the server (readdir, some non-unix cases)
 131	 * fake reasonable values
 132	 */
 133	if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
 134		/* only provide fake values on a new inode */
 135		if (inode->i_state & I_NEW) {
 136			if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
 137				set_nlink(inode, 2);
 138			else
 139				set_nlink(inode, 1);
 140		}
 141		return;
 142	}
 143
 144	/* we trust the server, so update it */
 145	set_nlink(inode, fattr->cf_nlink);
 146}
 147
 148/* populate an inode with info from a cifs_fattr struct */
 149int
 150cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
 
 151{
 152	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
 153	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 154
 155	if (!(inode->i_state & I_NEW) &&
 156	    unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
 157		CIFS_I(inode)->time = 0; /* force reval */
 158		return -ESTALE;
 159	}
 
 
 160
 161	cifs_revalidate_cache(inode, fattr);
 162
 163	spin_lock(&inode->i_lock);
 164	fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
 165	fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
 166	fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
 167	/* we do not want atime to be less than mtime, it broke some apps */
 168	if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
 169		inode_set_atime_to_ts(inode, fattr->cf_mtime);
 170	else
 171		inode_set_atime_to_ts(inode, fattr->cf_atime);
 172	inode_set_mtime_to_ts(inode, fattr->cf_mtime);
 173	inode_set_ctime_to_ts(inode, fattr->cf_ctime);
 174	inode->i_rdev = fattr->cf_rdev;
 175	cifs_nlink_fattr_to_inode(inode, fattr);
 176	inode->i_uid = fattr->cf_uid;
 177	inode->i_gid = fattr->cf_gid;
 178
 179	/* if dynperm is set, don't clobber existing mode */
 180	if (inode->i_state & I_NEW ||
 181	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
 182		inode->i_mode = fattr->cf_mode;
 183
 184	cifs_i->cifsAttrs = fattr->cf_cifsattrs;
 185	cifs_i->reparse_tag = fattr->cf_cifstag;
 186
 187	if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
 188		cifs_i->time = 0;
 189	else
 190		cifs_i->time = jiffies;
 191
 192	if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
 193		set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
 194	else
 195		clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
 196
 197	cifs_i->netfs.remote_i_size = fattr->cf_eof;
 198	/*
 199	 * Can't safely change the file size here if the client is writing to
 200	 * it due to potential races.
 201	 */
 202	if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
 203		i_size_write(inode, fattr->cf_eof);
 204
 205		/*
 206		 * i_blocks is not related to (i_size / i_blksize),
 207		 * but instead 512 byte (2**9) size is required for
 208		 * calculating num blocks.
 209		 */
 210		inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
 211	}
 212
 213	if (S_ISLNK(fattr->cf_mode) && fattr->cf_symlink_target) {
 214		kfree(cifs_i->symlink_target);
 215		cifs_i->symlink_target = fattr->cf_symlink_target;
 216		fattr->cf_symlink_target = NULL;
 217	}
 218	spin_unlock(&inode->i_lock);
 219
 220	if (fattr->cf_flags & CIFS_FATTR_JUNCTION)
 221		inode->i_flags |= S_AUTOMOUNT;
 222	if (inode->i_state & I_NEW)
 
 223		cifs_set_ops(inode);
 
 224	return 0;
 225}
 226
 227void
 228cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
 229{
 230	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 231
 232	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
 233		return;
 234
 235	fattr->cf_uniqueid = iunique(sb, ROOT_I);
 236}
 237
 238/* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
 239void
 240cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
 241			 struct cifs_sb_info *cifs_sb)
 242{
 243	memset(fattr, 0, sizeof(*fattr));
 244	fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
 245	fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
 246	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 247
 248	fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 249	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
 250	fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
 251	/* old POSIX extensions don't get create time */
 252
 253	fattr->cf_mode = le64_to_cpu(info->Permissions);
 254
 255	/*
 256	 * Since we set the inode type below we need to mask off
 257	 * to avoid strange results if bits set above.
 258	 */
 259	fattr->cf_mode &= ~S_IFMT;
 260	switch (le32_to_cpu(info->Type)) {
 261	case UNIX_FILE:
 262		fattr->cf_mode |= S_IFREG;
 263		fattr->cf_dtype = DT_REG;
 264		break;
 265	case UNIX_SYMLINK:
 266		fattr->cf_mode |= S_IFLNK;
 267		fattr->cf_dtype = DT_LNK;
 268		break;
 269	case UNIX_DIR:
 270		fattr->cf_mode |= S_IFDIR;
 271		fattr->cf_dtype = DT_DIR;
 272		break;
 273	case UNIX_CHARDEV:
 274		fattr->cf_mode |= S_IFCHR;
 275		fattr->cf_dtype = DT_CHR;
 276		fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
 277				       le64_to_cpu(info->DevMinor) & MINORMASK);
 278		break;
 279	case UNIX_BLOCKDEV:
 280		fattr->cf_mode |= S_IFBLK;
 281		fattr->cf_dtype = DT_BLK;
 282		fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
 283				       le64_to_cpu(info->DevMinor) & MINORMASK);
 284		break;
 285	case UNIX_FIFO:
 286		fattr->cf_mode |= S_IFIFO;
 287		fattr->cf_dtype = DT_FIFO;
 288		break;
 289	case UNIX_SOCKET:
 290		fattr->cf_mode |= S_IFSOCK;
 291		fattr->cf_dtype = DT_SOCK;
 292		break;
 293	default:
 294		/* safest to call it a file if we do not know */
 295		fattr->cf_mode |= S_IFREG;
 296		fattr->cf_dtype = DT_REG;
 297		cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
 298		break;
 299	}
 300
 301	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 302	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
 303		u64 id = le64_to_cpu(info->Uid);
 304		if (id < ((uid_t)-1)) {
 305			kuid_t uid = make_kuid(&init_user_ns, id);
 306			if (uid_valid(uid))
 307				fattr->cf_uid = uid;
 308		}
 309	}
 310	
 311	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 312	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
 313		u64 id = le64_to_cpu(info->Gid);
 314		if (id < ((gid_t)-1)) {
 315			kgid_t gid = make_kgid(&init_user_ns, id);
 316			if (gid_valid(gid))
 317				fattr->cf_gid = gid;
 318		}
 319	}
 320
 321	fattr->cf_nlink = le64_to_cpu(info->Nlinks);
 322}
 323
 324/*
 325 * Fill a cifs_fattr struct with fake inode info.
 326 *
 327 * Needed to setup cifs_fattr data for the directory which is the
 328 * junction to the new submount (ie to setup the fake directory
 329 * which represents a DFS referral or reparse mount point).
 330 */
 331static void cifs_create_junction_fattr(struct cifs_fattr *fattr,
 332				       struct super_block *sb)
 333{
 334	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 335
 336	cifs_dbg(FYI, "%s: creating fake fattr\n", __func__);
 337
 338	memset(fattr, 0, sizeof(*fattr));
 339	fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
 340	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 341	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 342	ktime_get_coarse_real_ts64(&fattr->cf_mtime);
 343	fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
 344	fattr->cf_nlink = 2;
 345	fattr->cf_flags = CIFS_FATTR_JUNCTION;
 346}
 347
 348/* Update inode with final fattr data */
 349static int update_inode_info(struct super_block *sb,
 350			     struct cifs_fattr *fattr,
 351			     struct inode **inode)
 352{
 353	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 354	int rc = 0;
 355
 356	if (!*inode) {
 357		*inode = cifs_iget(sb, fattr);
 358		if (!*inode)
 359			rc = -ENOMEM;
 360		return rc;
 361	}
 362	/* We already have inode, update it.
 363	 *
 364	 * If file type or uniqueid is different, return error.
 365	 */
 366	if (unlikely((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
 367		     CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) {
 368		CIFS_I(*inode)->time = 0; /* force reval */
 369		return -ESTALE;
 370	}
 371	return cifs_fattr_to_inode(*inode, fattr);
 372}
 373
 374#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 375static int
 376cifs_get_file_info_unix(struct file *filp)
 377{
 378	int rc;
 379	unsigned int xid;
 380	FILE_UNIX_BASIC_INFO find_data;
 381	struct cifs_fattr fattr = {};
 382	struct inode *inode = file_inode(filp);
 383	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 384	struct cifsFileInfo *cfile = filp->private_data;
 385	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
 386
 387	xid = get_xid();
 388
 389	if (cfile->symlink_target) {
 390		fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
 391		if (!fattr.cf_symlink_target) {
 392			rc = -ENOMEM;
 393			goto cifs_gfiunix_out;
 394		}
 395	}
 396
 397	rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
 398	if (!rc) {
 399		cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
 400	} else if (rc == -EREMOTE) {
 401		cifs_create_junction_fattr(&fattr, inode->i_sb);
 402		rc = 0;
 403	} else
 404		goto cifs_gfiunix_out;
 405
 406	rc = cifs_fattr_to_inode(inode, &fattr);
 407
 408cifs_gfiunix_out:
 409	free_xid(xid);
 410	return rc;
 411}
 412
 413static int cifs_get_unix_fattr(const unsigned char *full_path,
 414			       struct super_block *sb,
 415			       struct cifs_fattr *fattr,
 416			       struct inode **pinode,
 417			       const unsigned int xid)
 418{
 419	struct TCP_Server_Info *server;
 420	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 421	FILE_UNIX_BASIC_INFO find_data;
 422	struct cifs_tcon *tcon;
 423	struct tcon_link *tlink;
 424	int rc, tmprc;
 425
 426	cifs_dbg(FYI, "Getting info on %s\n", full_path);
 427
 428	tlink = cifs_sb_tlink(cifs_sb);
 429	if (IS_ERR(tlink))
 430		return PTR_ERR(tlink);
 431	tcon = tlink_tcon(tlink);
 432	server = tcon->ses->server;
 433
 434	/* could have done a find first instead but this returns more info */
 435	rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
 436				  cifs_sb->local_nls, cifs_remap(cifs_sb));
 437	cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc);
 438	cifs_put_tlink(tlink);
 439
 440	if (!rc) {
 441		cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb);
 442	} else if (rc == -EREMOTE) {
 443		cifs_create_junction_fattr(fattr, sb);
 444		rc = 0;
 445	} else {
 446		return rc;
 447	}
 448
 449	if (!*pinode)
 450		cifs_fill_uniqueid(sb, fattr);
 451
 452	/* check for Minshall+French symlinks */
 453	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
 454		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
 455		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
 456	}
 457
 458	if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) {
 459		if (!server->ops->query_symlink)
 460			return -EOPNOTSUPP;
 461		rc = server->ops->query_symlink(xid, tcon,
 462						cifs_sb, full_path,
 463						&fattr->cf_symlink_target);
 464		cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc);
 465	}
 466	return rc;
 467}
 468
 469int cifs_get_inode_info_unix(struct inode **pinode,
 470			     const unsigned char *full_path,
 471			     struct super_block *sb, unsigned int xid)
 472{
 473	struct cifs_fattr fattr = {};
 474	int rc;
 475
 476	rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid);
 477	if (rc)
 478		goto out;
 479
 480	rc = update_inode_info(sb, &fattr, pinode);
 481out:
 482	kfree(fattr.cf_symlink_target);
 483	return rc;
 484}
 485#else
 486static inline int cifs_get_unix_fattr(const unsigned char *full_path,
 487				      struct super_block *sb,
 488				      struct cifs_fattr *fattr,
 489				      struct inode **pinode,
 490				      const unsigned int xid)
 491{
 492	return -EOPNOTSUPP;
 493}
 494
 495int cifs_get_inode_info_unix(struct inode **pinode,
 496			     const unsigned char *full_path,
 497			     struct super_block *sb, unsigned int xid)
 498{
 499	return -EOPNOTSUPP;
 500}
 501#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
 502
 503static int
 504cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
 505	      struct cifs_sb_info *cifs_sb, unsigned int xid)
 506{
 507	int rc;
 508	__u32 oplock;
 509	struct tcon_link *tlink;
 510	struct cifs_tcon *tcon;
 511	struct cifs_fid fid;
 512	struct cifs_open_parms oparms;
 513	struct cifs_io_parms io_parms = {0};
 
 
 514	char buf[24];
 515	unsigned int bytes_read;
 516	char *pbuf;
 517	int buf_type = CIFS_NO_BUFFER;
 518
 519	pbuf = buf;
 520
 521	fattr->cf_mode &= ~S_IFMT;
 522
 523	if (fattr->cf_eof == 0) {
 
 524		fattr->cf_mode |= S_IFIFO;
 525		fattr->cf_dtype = DT_FIFO;
 526		return 0;
 527	} else if (fattr->cf_eof < 8) {
 528		fattr->cf_mode |= S_IFREG;
 529		fattr->cf_dtype = DT_REG;
 530		return -EINVAL;	 /* EOPNOTSUPP? */
 531	}
 532
 533	tlink = cifs_sb_tlink(cifs_sb);
 534	if (IS_ERR(tlink))
 535		return PTR_ERR(tlink);
 536	tcon = tlink_tcon(tlink);
 537
 538	oparms = (struct cifs_open_parms) {
 539		.tcon = tcon,
 540		.cifs_sb = cifs_sb,
 541		.desired_access = GENERIC_READ,
 542		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
 543		.disposition = FILE_OPEN,
 544		.path = path,
 545		.fid = &fid,
 546	};
 547
 548	if (tcon->ses->server->oplocks)
 549		oplock = REQ_OPLOCK;
 550	else
 551		oplock = 0;
 552	rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
 553	if (rc) {
 554		cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
 555		cifs_put_tlink(tlink);
 556		return rc;
 557	}
 558
 559	/* Read header */
 560	io_parms.netfid = fid.netfid;
 561	io_parms.pid = current->tgid;
 562	io_parms.tcon = tcon;
 563	io_parms.offset = 0;
 564	io_parms.length = 24;
 565
 566	rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
 567					&bytes_read, &pbuf, &buf_type);
 568	if ((rc == 0) && (bytes_read >= 8)) {
 569		if (memcmp("IntxBLK", pbuf, 8) == 0) {
 570			cifs_dbg(FYI, "Block device\n");
 571			fattr->cf_mode |= S_IFBLK;
 572			fattr->cf_dtype = DT_BLK;
 573			if (bytes_read == 24) {
 574				/* we have enough to decode dev num */
 575				__u64 mjr; /* major */
 576				__u64 mnr; /* minor */
 577				mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
 578				mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
 579				fattr->cf_rdev = MKDEV(mjr, mnr);
 
 
 
 
 
 
 
 
 
 
 
 580			}
 581		} else if (memcmp("IntxCHR", pbuf, 8) == 0) {
 582			cifs_dbg(FYI, "Char device\n");
 583			fattr->cf_mode |= S_IFCHR;
 584			fattr->cf_dtype = DT_CHR;
 585			if (bytes_read == 24) {
 586				/* we have enough to decode dev num */
 587				__u64 mjr; /* major */
 588				__u64 mnr; /* minor */
 589				mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
 590				mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
 591				fattr->cf_rdev = MKDEV(mjr, mnr);
 
 
 
 
 
 
 
 
 
 
 
 592			}
 593		} else if (memcmp("IntxLNK", pbuf, 7) == 0) {
 
 
 
 
 594			cifs_dbg(FYI, "Symlink\n");
 595			fattr->cf_mode |= S_IFLNK;
 596			fattr->cf_dtype = DT_LNK;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 597		} else if (memcmp("LnxFIFO", pbuf, 8) == 0) {
 598			cifs_dbg(FYI, "FIFO\n");
 599			fattr->cf_mode |= S_IFIFO;
 600			fattr->cf_dtype = DT_FIFO;
 601		} else {
 602			fattr->cf_mode |= S_IFREG; /* file? */
 603			fattr->cf_dtype = DT_REG;
 604			rc = -EOPNOTSUPP;
 605		}
 
 
 
 
 606	} else {
 607		fattr->cf_mode |= S_IFREG; /* then it is a file */
 608		fattr->cf_dtype = DT_REG;
 609		rc = -EOPNOTSUPP; /* or some unknown SFU type */
 610	}
 611
 612	tcon->ses->server->ops->close(xid, tcon, &fid);
 613	cifs_put_tlink(tlink);
 614	return rc;
 615}
 616
 617#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID)  /* SETFILEBITS valid bits */
 618
 619/*
 620 * Fetch mode bits as provided by SFU.
 621 *
 622 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
 623 */
 624static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
 625			 struct cifs_sb_info *cifs_sb, unsigned int xid)
 626{
 627#ifdef CONFIG_CIFS_XATTR
 628	ssize_t rc;
 629	char ea_value[4];
 630	__u32 mode;
 631	struct tcon_link *tlink;
 632	struct cifs_tcon *tcon;
 633
 634	tlink = cifs_sb_tlink(cifs_sb);
 635	if (IS_ERR(tlink))
 636		return PTR_ERR(tlink);
 637	tcon = tlink_tcon(tlink);
 638
 639	if (tcon->ses->server->ops->query_all_EAs == NULL) {
 640		cifs_put_tlink(tlink);
 641		return -EOPNOTSUPP;
 642	}
 643
 644	rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
 645			"SETFILEBITS", ea_value, 4 /* size of buf */,
 646			cifs_sb);
 647	cifs_put_tlink(tlink);
 648	if (rc < 0)
 649		return (int)rc;
 650	else if (rc > 3) {
 651		mode = le32_to_cpu(*((__le32 *)ea_value));
 652		fattr->cf_mode &= ~SFBITS_MASK;
 653		cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
 654			 mode, fattr->cf_mode);
 655		fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
 656		cifs_dbg(FYI, "special mode bits 0%o\n", mode);
 657	}
 658
 659	return 0;
 660#else
 661	return -EOPNOTSUPP;
 662#endif
 663}
 664
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 665/* Fill a cifs_fattr struct with info from POSIX info struct */
 666static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
 667				       struct cifs_open_info_data *data,
 668				       struct super_block *sb)
 669{
 670	struct smb311_posix_qinfo *info = &data->posix_fi;
 671	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 672	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 673
 674	memset(fattr, 0, sizeof(*fattr));
 675
 676	/* no fattr->flags to set */
 677	fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
 678	fattr->cf_uniqueid = le64_to_cpu(info->Inode);
 679
 680	if (info->LastAccessTime)
 681		fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 682	else
 683		ktime_get_coarse_real_ts64(&fattr->cf_atime);
 684
 685	fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
 686	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 687
 688	if (data->adjust_tz) {
 689		fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
 690		fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
 691	}
 692
 693	/*
 694	 * The srv fs device id is overridden on network mount so setting
 695	 * @fattr->cf_rdev isn't needed here.
 696	 */
 697	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 698	fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
 699	fattr->cf_createtime = le64_to_cpu(info->CreationTime);
 700	fattr->cf_nlink = le32_to_cpu(info->HardLinks);
 701	fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
 
 702
 703	if (cifs_open_data_reparse(data) &&
 704	    cifs_reparse_point_to_fattr(cifs_sb, fattr, data))
 705		goto out_reparse;
 706
 707	fattr->cf_mode &= ~S_IFMT;
 708	if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
 709		fattr->cf_mode |= S_IFDIR;
 710		fattr->cf_dtype = DT_DIR;
 711	} else { /* file */
 712		fattr->cf_mode |= S_IFREG;
 713		fattr->cf_dtype = DT_REG;
 714	}
 715
 716out_reparse:
 717	if (S_ISLNK(fattr->cf_mode)) {
 718		if (likely(data->symlink_target))
 719			fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
 720		fattr->cf_symlink_target = data->symlink_target;
 721		data->symlink_target = NULL;
 722	}
 723	sid_to_id(cifs_sb, &data->posix_owner, fattr, SIDOWNER);
 724	sid_to_id(cifs_sb, &data->posix_group, fattr, SIDGROUP);
 725
 726	cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
 727		fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
 728}
 729
 730static inline dev_t nfs_mkdev(struct reparse_posix_data *buf)
 731{
 732	u64 v = le64_to_cpu(*(__le64 *)buf->DataBuffer);
 733
 734	return MKDEV(v >> 32, v & 0xffffffff);
 735}
 736
 737bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
 738				 struct cifs_fattr *fattr,
 739				 struct cifs_open_info_data *data)
 740{
 741	struct reparse_posix_data *buf = data->reparse.posix;
 742	u32 tag = data->reparse.tag;
 743
 744	if (tag == IO_REPARSE_TAG_NFS && buf) {
 745		switch (le64_to_cpu(buf->InodeType)) {
 746		case NFS_SPECFILE_CHR:
 747			fattr->cf_mode |= S_IFCHR;
 748			fattr->cf_dtype = DT_CHR;
 749			fattr->cf_rdev = nfs_mkdev(buf);
 750			break;
 751		case NFS_SPECFILE_BLK:
 752			fattr->cf_mode |= S_IFBLK;
 753			fattr->cf_dtype = DT_BLK;
 754			fattr->cf_rdev = nfs_mkdev(buf);
 755			break;
 756		case NFS_SPECFILE_FIFO:
 757			fattr->cf_mode |= S_IFIFO;
 758			fattr->cf_dtype = DT_FIFO;
 759			break;
 760		case NFS_SPECFILE_SOCK:
 761			fattr->cf_mode |= S_IFSOCK;
 762			fattr->cf_dtype = DT_SOCK;
 763			break;
 764		case NFS_SPECFILE_LNK:
 765			fattr->cf_mode |= S_IFLNK;
 766			fattr->cf_dtype = DT_LNK;
 767			break;
 768		default:
 769			WARN_ON_ONCE(1);
 770			return false;
 771		}
 772		return true;
 773	}
 774
 775	switch (tag) {
 776	case IO_REPARSE_TAG_LX_SYMLINK:
 777		fattr->cf_mode |= S_IFLNK;
 778		fattr->cf_dtype = DT_LNK;
 779		break;
 780	case IO_REPARSE_TAG_LX_FIFO:
 781		fattr->cf_mode |= S_IFIFO;
 782		fattr->cf_dtype = DT_FIFO;
 783		break;
 784	case IO_REPARSE_TAG_AF_UNIX:
 785		fattr->cf_mode |= S_IFSOCK;
 786		fattr->cf_dtype = DT_SOCK;
 787		break;
 788	case IO_REPARSE_TAG_LX_CHR:
 789		fattr->cf_mode |= S_IFCHR;
 790		fattr->cf_dtype = DT_CHR;
 791		break;
 792	case IO_REPARSE_TAG_LX_BLK:
 793		fattr->cf_mode |= S_IFBLK;
 794		fattr->cf_dtype = DT_BLK;
 795		break;
 796	case 0: /* SMB1 symlink */
 797	case IO_REPARSE_TAG_SYMLINK:
 798	case IO_REPARSE_TAG_NFS:
 799		fattr->cf_mode |= S_IFLNK;
 800		fattr->cf_dtype = DT_LNK;
 801		break;
 802	default:
 803		return false;
 804	}
 805	return true;
 806}
 807
 808static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
 809				    struct cifs_open_info_data *data,
 810				    struct super_block *sb)
 811{
 812	struct smb2_file_all_info *info = &data->fi;
 813	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 814	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 815
 816	memset(fattr, 0, sizeof(*fattr));
 817	fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
 818	if (info->DeletePending)
 819		fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
 820
 821	if (info->LastAccessTime)
 822		fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 823	else
 824		ktime_get_coarse_real_ts64(&fattr->cf_atime);
 825
 826	fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
 827	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 828
 829	if (data->adjust_tz) {
 830		fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
 831		fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
 832	}
 833
 834	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 835	fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
 836	fattr->cf_createtime = le64_to_cpu(info->CreationTime);
 837	fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
 
 
 838
 839	fattr->cf_mode = cifs_sb->ctx->file_mode;
 840	if (cifs_open_data_reparse(data) &&
 841	    cifs_reparse_point_to_fattr(cifs_sb, fattr, data))
 842		goto out_reparse;
 843
 844	if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
 845		fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
 846		fattr->cf_dtype = DT_DIR;
 847		/*
 848		 * Server can return wrong NumberOfLinks value for directories
 849		 * when Unix extensions are disabled - fake it.
 850		 */
 851		if (!tcon->unix_ext)
 852			fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
 853	} else {
 854		fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
 855		fattr->cf_dtype = DT_REG;
 856
 857		/* clear write bits if ATTR_READONLY is set */
 858		if (fattr->cf_cifsattrs & ATTR_READONLY)
 859			fattr->cf_mode &= ~(S_IWUGO);
 860
 861		/*
 862		 * Don't accept zero nlink from non-unix servers unless
 863		 * delete is pending.  Instead mark it as unknown.
 864		 */
 865		if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
 866		    !info->DeletePending) {
 867			cifs_dbg(VFS, "bogus file nlink value %u\n",
 868				 fattr->cf_nlink);
 869			fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
 870		}
 871	}
 872
 
 
 
 
 873out_reparse:
 874	if (S_ISLNK(fattr->cf_mode)) {
 875		if (likely(data->symlink_target))
 876			fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
 877		fattr->cf_symlink_target = data->symlink_target;
 878		data->symlink_target = NULL;
 879	}
 880
 881	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 882	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 883}
 884
 885static int
 886cifs_get_file_info(struct file *filp)
 887{
 888	int rc;
 889	unsigned int xid;
 890	struct cifs_open_info_data data = {};
 891	struct cifs_fattr fattr;
 892	struct inode *inode = file_inode(filp);
 893	struct cifsFileInfo *cfile = filp->private_data;
 894	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
 895	struct TCP_Server_Info *server = tcon->ses->server;
 
 
 
 896
 897	if (!server->ops->query_file_info)
 
 898		return -ENOSYS;
 
 899
 900	xid = get_xid();
 901	rc = server->ops->query_file_info(xid, tcon, cfile, &data);
 902	switch (rc) {
 903	case 0:
 904		/* TODO: add support to query reparse tag */
 905		data.adjust_tz = false;
 906		if (data.symlink_target) {
 907			data.symlink = true;
 908			data.reparse.tag = IO_REPARSE_TAG_SYMLINK;
 909		}
 
 
 
 
 
 910		cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
 
 
 911		break;
 912	case -EREMOTE:
 913		cifs_create_junction_fattr(&fattr, inode->i_sb);
 914		rc = 0;
 915		break;
 916	case -EOPNOTSUPP:
 917	case -EINVAL:
 918		/*
 919		 * FIXME: legacy server -- fall back to path-based call?
 920		 * for now, just skip revalidating and mark inode for
 921		 * immediate reval.
 922		 */
 923		rc = 0;
 924		CIFS_I(inode)->time = 0;
 925		goto cgfi_exit;
 926	default:
 927		goto cgfi_exit;
 928	}
 929
 930	/*
 931	 * don't bother with SFU junk here -- just mark inode as needing
 932	 * revalidation.
 933	 */
 934	fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
 935	fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
 936	/* if filetype is different, return error */
 937	rc = cifs_fattr_to_inode(inode, &fattr);
 938cgfi_exit:
 939	cifs_free_open_info(&data);
 
 940	free_xid(xid);
 941	return rc;
 942}
 943
 944/* Simple function to return a 64 bit hash of string.  Rarely called */
 945static __u64 simple_hashstr(const char *str)
 946{
 947	const __u64 hash_mult =  1125899906842597ULL; /* a big enough prime */
 948	__u64 hash = 0;
 949
 950	while (*str)
 951		hash = (hash + (__u64) *str++) * hash_mult;
 952
 953	return hash;
 954}
 955
 956#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 957/**
 958 * cifs_backup_query_path_info - SMB1 fallback code to get ino
 959 *
 960 * Fallback code to get file metadata when we don't have access to
 961 * full_path (EACCES) and have backup creds.
 962 *
 963 * @xid:	transaction id used to identify original request in logs
 964 * @tcon:	information about the server share we have mounted
 965 * @sb:	the superblock stores info such as disk space available
 966 * @full_path:	name of the file we are getting the metadata for
 967 * @resp_buf:	will be set to cifs resp buf and needs to be freed with
 968 * 		cifs_buf_release() when done with @data
 969 * @data:	will be set to search info result buffer
 970 */
 971static int
 972cifs_backup_query_path_info(int xid,
 973			    struct cifs_tcon *tcon,
 974			    struct super_block *sb,
 975			    const char *full_path,
 976			    void **resp_buf,
 977			    FILE_ALL_INFO **data)
 978{
 979	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 980	struct cifs_search_info info = {0};
 981	u16 flags;
 982	int rc;
 983
 984	*resp_buf = NULL;
 985	info.endOfSearch = false;
 986	if (tcon->unix_ext)
 987		info.info_level = SMB_FIND_FILE_UNIX;
 988	else if ((tcon->ses->capabilities &
 989		  tcon->ses->server->vals->cap_nt_find) == 0)
 990		info.info_level = SMB_FIND_FILE_INFO_STANDARD;
 991	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
 992		info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
 993	else /* no srvino useful for fallback to some netapp */
 994		info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
 995
 996	flags = CIFS_SEARCH_CLOSE_ALWAYS |
 997		CIFS_SEARCH_CLOSE_AT_END |
 998		CIFS_SEARCH_BACKUP_SEARCH;
 999
1000	rc = CIFSFindFirst(xid, tcon, full_path,
1001			   cifs_sb, NULL, flags, &info, false);
1002	if (rc)
1003		return rc;
1004
1005	*resp_buf = (void *)info.ntwrk_buf_start;
1006	*data = (FILE_ALL_INFO *)info.srch_entries_start;
1007	return 0;
1008}
1009#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1010
1011static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
1012			       struct inode **inode, const char *full_path,
1013			       struct cifs_open_info_data *data, struct cifs_fattr *fattr)
1014{
1015	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1016	struct TCP_Server_Info *server = tcon->ses->server;
1017	int rc;
1018
1019	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
1020		if (*inode)
1021			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1022		else
1023			fattr->cf_uniqueid = iunique(sb, ROOT_I);
1024		return;
1025	}
1026
1027	/*
1028	 * If we have an inode pass a NULL tcon to ensure we don't
1029	 * make a round trip to the server. This only works for SMB2+.
1030	 */
1031	rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
1032				       &fattr->cf_uniqueid, data);
1033	if (rc) {
1034		/*
1035		 * If that fails reuse existing ino or generate one
1036		 * and disable server ones
1037		 */
1038		if (*inode)
1039			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1040		else {
1041			fattr->cf_uniqueid = iunique(sb, ROOT_I);
1042			cifs_autodisable_serverino(cifs_sb);
1043		}
1044		return;
1045	}
1046
1047	/* If no errors, check for zero root inode (invalid) */
1048	if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
1049		cifs_dbg(FYI, "Invalid (0) inodenum\n");
1050		if (*inode) {
1051			/* reuse */
1052			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1053		} else {
1054			/* make an ino by hashing the UNC */
1055			fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1056			fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1057		}
1058	}
1059}
1060
1061static inline bool is_inode_cache_good(struct inode *ino)
1062{
1063	return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
1064}
1065
1066static int reparse_info_to_fattr(struct cifs_open_info_data *data,
1067				 struct super_block *sb,
1068				 const unsigned int xid,
1069				 struct cifs_tcon *tcon,
1070				 const char *full_path,
1071				 struct cifs_fattr *fattr)
1072{
1073	struct TCP_Server_Info *server = tcon->ses->server;
1074	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1075	struct kvec rsp_iov, *iov = NULL;
1076	int rsp_buftype = CIFS_NO_BUFFER;
1077	u32 tag = data->reparse.tag;
1078	int rc = 0;
1079
1080	if (!tag && server->ops->query_reparse_point) {
1081		rc = server->ops->query_reparse_point(xid, tcon, cifs_sb,
1082						      full_path, &tag,
1083						      &rsp_iov, &rsp_buftype);
1084		if (!rc)
1085			iov = &rsp_iov;
1086	} else if (data->reparse.io.buftype != CIFS_NO_BUFFER &&
1087		   data->reparse.io.iov.iov_base) {
1088		iov = &data->reparse.io.iov;
1089	}
1090
1091	rc = -EOPNOTSUPP;
1092	switch ((data->reparse.tag = tag)) {
1093	case 0: /* SMB1 symlink */
1094		if (server->ops->query_symlink) {
1095			rc = server->ops->query_symlink(xid, tcon,
1096							cifs_sb, full_path,
1097							&data->symlink_target);
1098		}
 
 
 
 
 
 
 
 
 
 
 
 
 
1099		break;
1100	case IO_REPARSE_TAG_MOUNT_POINT:
1101		cifs_create_junction_fattr(fattr, sb);
1102		rc = 0;
1103		goto out;
1104	default:
1105		/* Check for cached reparse point data */
1106		if (data->symlink_target || data->reparse.buf) {
1107			rc = 0;
1108		} else if (iov && server->ops->parse_reparse_point) {
1109			rc = server->ops->parse_reparse_point(cifs_sb,
 
1110							      iov, data);
1111		}
1112		break;
1113	}
1114
1115	if (tcon->posix_extensions)
1116		smb311_posix_info_to_fattr(fattr, data, sb);
1117	else
1118		cifs_open_info_to_fattr(fattr, data, sb);
1119out:
1120	fattr->cf_cifstag = data->reparse.tag;
1121	free_rsp_buf(rsp_buftype, rsp_iov.iov_base);
1122	return rc;
1123}
1124
1125static int cifs_get_fattr(struct cifs_open_info_data *data,
1126			  struct super_block *sb, int xid,
1127			  const struct cifs_fid *fid,
1128			  struct cifs_fattr *fattr,
1129			  struct inode **inode,
1130			  const char *full_path)
1131{
1132	struct cifs_open_info_data tmp_data = {};
1133	struct cifs_tcon *tcon;
1134	struct TCP_Server_Info *server;
1135	struct tcon_link *tlink;
1136	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1137	void *smb1_backup_rsp_buf = NULL;
1138	int rc = 0;
1139	int tmprc = 0;
1140
1141	tlink = cifs_sb_tlink(cifs_sb);
1142	if (IS_ERR(tlink))
1143		return PTR_ERR(tlink);
1144	tcon = tlink_tcon(tlink);
1145	server = tcon->ses->server;
1146
1147	/*
1148	 * 1. Fetch file metadata if not provided (data)
1149	 */
1150
1151	if (!data) {
1152		rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1153						  full_path, &tmp_data);
1154		data = &tmp_data;
1155	}
1156
1157	/*
1158	 * 2. Convert it to internal cifs metadata (fattr)
1159	 */
1160
1161	switch (rc) {
1162	case 0:
1163		/*
1164		 * If the file is a reparse point, it is more complicated
1165		 * since we have to check if its reparse tag matches a known
1166		 * special file type e.g. symlink or fifo or char etc.
1167		 */
1168		if (cifs_open_data_reparse(data)) {
1169			rc = reparse_info_to_fattr(data, sb, xid, tcon,
1170						   full_path, fattr);
1171		} else {
1172			cifs_open_info_to_fattr(fattr, data, sb);
1173		}
 
 
 
1174		break;
1175	case -EREMOTE:
1176		/* DFS link, no metadata available on this server */
1177		cifs_create_junction_fattr(fattr, sb);
1178		rc = 0;
1179		break;
1180	case -EACCES:
1181#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1182		/*
1183		 * perm errors, try again with backup flags if possible
1184		 *
1185		 * For SMB2 and later the backup intent flag
1186		 * is already sent if needed on open and there
1187		 * is no path based FindFirst operation to use
1188		 * to retry with
1189		 */
1190		if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1191			/* for easier reading */
1192			FILE_ALL_INFO *fi;
1193			FILE_DIRECTORY_INFO *fdi;
1194			SEARCH_ID_FULL_DIR_INFO *si;
1195
1196			rc = cifs_backup_query_path_info(xid, tcon, sb,
1197							 full_path,
1198							 &smb1_backup_rsp_buf,
1199							 &fi);
1200			if (rc)
1201				goto out;
1202
1203			move_cifs_info_to_smb2(&data->fi, fi);
1204			fdi = (FILE_DIRECTORY_INFO *)fi;
1205			si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1206
1207			cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1208			fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1209			/* uniqueid set, skip get inum step */
1210			goto handle_mnt_opt;
1211		} else {
1212			/* nothing we can do, bail out */
1213			goto out;
1214		}
1215#else
1216		goto out;
1217#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1218		break;
1219	default:
1220		cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1221		goto out;
1222	}
1223
1224	/*
1225	 * 3. Get or update inode number (fattr->cf_uniqueid)
1226	 */
1227
1228	cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1229
1230	/*
1231	 * 4. Tweak fattr based on mount options
1232	 */
1233#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1234handle_mnt_opt:
1235#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1236	/* query for SFU type info if supported and needed */
1237	if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1238	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) {
1239		tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1240		if (tmprc)
1241			cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1242	}
1243
1244	/* fill in 0777 bits from ACL */
1245	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1246		rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1247				       true, full_path, fid);
1248		if (rc == -EREMOTE)
1249			rc = 0;
1250		if (rc) {
1251			cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1252				 __func__, rc);
1253			goto out;
1254		}
1255	} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1256		rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1257				       false, full_path, fid);
1258		if (rc == -EREMOTE)
1259			rc = 0;
1260		if (rc) {
1261			cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1262				 __func__, rc);
1263			goto out;
1264		}
1265	}
1266
1267	/* fill in remaining high mode bits e.g. SUID, VTX */
1268	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1269		cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
 
 
 
 
 
1270
1271	/* check for Minshall+French symlinks */
1272	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1273		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1274		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1275	}
1276
1277out:
1278	cifs_buf_release(smb1_backup_rsp_buf);
1279	cifs_put_tlink(tlink);
1280	cifs_free_open_info(&tmp_data);
1281	return rc;
1282}
1283
1284int cifs_get_inode_info(struct inode **inode,
1285			const char *full_path,
1286			struct cifs_open_info_data *data,
1287			struct super_block *sb, int xid,
1288			const struct cifs_fid *fid)
1289{
1290	struct cifs_fattr fattr = {};
1291	int rc;
1292
1293	if (is_inode_cache_good(*inode)) {
1294		cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1295		return 0;
1296	}
1297
1298	rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1299	if (rc)
1300		goto out;
1301
1302	rc = update_inode_info(sb, &fattr, inode);
1303out:
1304	kfree(fattr.cf_symlink_target);
1305	return rc;
1306}
1307
1308static int smb311_posix_get_fattr(struct cifs_open_info_data *data,
1309				  struct cifs_fattr *fattr,
1310				  const char *full_path,
1311				  struct super_block *sb,
1312				  const unsigned int xid)
1313{
1314	struct cifs_open_info_data tmp_data = {};
1315	struct TCP_Server_Info *server;
1316	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1317	struct cifs_tcon *tcon;
1318	struct tcon_link *tlink;
1319	int tmprc;
1320	int rc = 0;
1321
1322	tlink = cifs_sb_tlink(cifs_sb);
1323	if (IS_ERR(tlink))
1324		return PTR_ERR(tlink);
1325	tcon = tlink_tcon(tlink);
1326	server = tcon->ses->server;
1327
1328	/*
1329	 * 1. Fetch file metadata if not provided (data)
1330	 */
1331	if (!data) {
1332		rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1333						  full_path, &tmp_data);
1334		data = &tmp_data;
1335	}
1336
1337	/*
1338	 * 2. Convert it to internal cifs metadata (fattr)
1339	 */
1340
1341	switch (rc) {
1342	case 0:
1343		if (cifs_open_data_reparse(data)) {
1344			rc = reparse_info_to_fattr(data, sb, xid, tcon,
1345						   full_path, fattr);
1346		} else {
1347			smb311_posix_info_to_fattr(fattr, data, sb);
1348		}
1349		break;
1350	case -EREMOTE:
1351		/* DFS link, no metadata available on this server */
1352		cifs_create_junction_fattr(fattr, sb);
1353		rc = 0;
1354		break;
1355	case -EACCES:
1356		/*
1357		 * For SMB2 and later the backup intent flag
1358		 * is already sent if needed on open and there
1359		 * is no path based FindFirst operation to use
1360		 * to retry with so nothing we can do, bail out
1361		 */
1362		goto out;
1363	default:
1364		cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1365		goto out;
1366	}
1367
1368	/*
1369	 * 3. Tweak fattr based on mount options
1370	 */
1371	/* check for Minshall+French symlinks */
1372	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1373		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1374		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1375	}
1376
1377out:
1378	cifs_put_tlink(tlink);
1379	cifs_free_open_info(data);
1380	return rc;
1381}
1382
1383int smb311_posix_get_inode_info(struct inode **inode,
1384				const char *full_path,
1385				struct cifs_open_info_data *data,
1386				struct super_block *sb,
1387				const unsigned int xid)
1388{
1389	struct cifs_fattr fattr = {};
1390	int rc;
1391
1392	if (is_inode_cache_good(*inode)) {
1393		cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1394		return 0;
1395	}
1396
1397	rc = smb311_posix_get_fattr(data, &fattr, full_path, sb, xid);
1398	if (rc)
1399		goto out;
1400
1401	rc = update_inode_info(sb, &fattr, inode);
 
 
1402out:
1403	kfree(fattr.cf_symlink_target);
1404	return rc;
1405}
1406
1407static const struct inode_operations cifs_ipc_inode_ops = {
1408	.lookup = cifs_lookup,
1409};
1410
1411static int
1412cifs_find_inode(struct inode *inode, void *opaque)
1413{
1414	struct cifs_fattr *fattr = opaque;
1415
 
 
1416	/* don't match inode with different uniqueid */
1417	if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1418		return 0;
1419
1420	/* use createtime like an i_generation field */
1421	if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1422		return 0;
1423
1424	/* don't match inode of different type */
1425	if (inode_wrong_type(inode, fattr->cf_mode))
1426		return 0;
1427
1428	/* if it's not a directory or has no dentries, then flag it */
1429	if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1430		fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1431
1432	return 1;
1433}
1434
1435static int
1436cifs_init_inode(struct inode *inode, void *opaque)
1437{
1438	struct cifs_fattr *fattr = opaque;
1439
1440	CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1441	CIFS_I(inode)->createtime = fattr->cf_createtime;
1442	return 0;
1443}
1444
1445/*
1446 * walk dentry list for an inode and report whether it has aliases that
1447 * are hashed. We use this to determine if a directory inode can actually
1448 * be used.
1449 */
1450static bool
1451inode_has_hashed_dentries(struct inode *inode)
1452{
1453	struct dentry *dentry;
1454
1455	spin_lock(&inode->i_lock);
1456	hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1457		if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1458			spin_unlock(&inode->i_lock);
1459			return true;
1460		}
1461	}
1462	spin_unlock(&inode->i_lock);
1463	return false;
1464}
1465
1466/* Given fattrs, get a corresponding inode */
1467struct inode *
1468cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1469{
1470	unsigned long hash;
1471	struct inode *inode;
1472
1473retry_iget5_locked:
1474	cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1475
1476	/* hash down to 32-bits on 32-bit arch */
1477	hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1478
1479	inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1480	if (inode) {
1481		/* was there a potentially problematic inode collision? */
1482		if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1483			fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1484
1485			if (inode_has_hashed_dentries(inode)) {
1486				cifs_autodisable_serverino(CIFS_SB(sb));
1487				iput(inode);
1488				fattr->cf_uniqueid = iunique(sb, ROOT_I);
1489				goto retry_iget5_locked;
1490			}
1491		}
1492
1493		/* can't fail - see cifs_find_inode() */
1494		cifs_fattr_to_inode(inode, fattr);
1495		if (sb->s_flags & SB_NOATIME)
1496			inode->i_flags |= S_NOATIME | S_NOCMTIME;
1497		if (inode->i_state & I_NEW) {
1498			inode->i_ino = hash;
1499			cifs_fscache_get_inode_cookie(inode);
1500			unlock_new_inode(inode);
1501		}
1502	}
1503
1504	return inode;
1505}
1506
1507/* gets root inode */
1508struct inode *cifs_root_iget(struct super_block *sb)
1509{
1510	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1511	struct cifs_fattr fattr = {};
1512	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1513	struct inode *inode = NULL;
1514	unsigned int xid;
1515	char *path = NULL;
1516	int len;
1517	int rc;
1518
1519	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1520	    && cifs_sb->prepath) {
1521		len = strlen(cifs_sb->prepath);
1522		path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1523		if (path == NULL)
1524			return ERR_PTR(-ENOMEM);
1525		path[0] = '/';
1526		memcpy(path+1, cifs_sb->prepath, len);
1527	} else {
1528		path = kstrdup("", GFP_KERNEL);
1529		if (path == NULL)
1530			return ERR_PTR(-ENOMEM);
1531	}
1532
1533	xid = get_xid();
1534	if (tcon->unix_ext) {
1535		rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1536		/* some servers mistakenly claim POSIX support */
1537		if (rc != -EOPNOTSUPP)
1538			goto iget_root;
1539		cifs_dbg(VFS, "server does not support POSIX extensions\n");
1540		tcon->unix_ext = false;
1541	}
1542
1543	convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1544	if (tcon->posix_extensions)
1545		rc = smb311_posix_get_fattr(NULL, &fattr, path, sb, xid);
1546	else
1547		rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1548
1549iget_root:
1550	if (!rc) {
1551		if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1552			fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1553			cifs_autodisable_serverino(cifs_sb);
1554		}
1555		inode = cifs_iget(sb, &fattr);
1556	}
1557
1558	if (!inode) {
1559		inode = ERR_PTR(rc);
1560		goto out;
1561	}
1562
 
 
 
1563	if (rc && tcon->pipe) {
1564		cifs_dbg(FYI, "ipc connection - fake read inode\n");
1565		spin_lock(&inode->i_lock);
1566		inode->i_mode |= S_IFDIR;
1567		set_nlink(inode, 2);
1568		inode->i_op = &cifs_ipc_inode_ops;
1569		inode->i_fop = &simple_dir_operations;
1570		inode->i_uid = cifs_sb->ctx->linux_uid;
1571		inode->i_gid = cifs_sb->ctx->linux_gid;
1572		spin_unlock(&inode->i_lock);
1573	} else if (rc) {
1574		iget_failed(inode);
1575		inode = ERR_PTR(rc);
1576	}
1577
1578out:
1579	kfree(path);
1580	free_xid(xid);
1581	kfree(fattr.cf_symlink_target);
1582	return inode;
1583}
1584
1585int
1586cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1587		   const char *full_path, __u32 dosattr)
1588{
1589	bool set_time = false;
1590	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1591	struct TCP_Server_Info *server;
1592	FILE_BASIC_INFO	info_buf;
1593
1594	if (attrs == NULL)
1595		return -EINVAL;
1596
1597	server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1598	if (!server->ops->set_file_info)
1599		return -ENOSYS;
1600
1601	info_buf.Pad = 0;
1602
1603	if (attrs->ia_valid & ATTR_ATIME) {
1604		set_time = true;
1605		info_buf.LastAccessTime =
1606			cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1607	} else
1608		info_buf.LastAccessTime = 0;
1609
1610	if (attrs->ia_valid & ATTR_MTIME) {
1611		set_time = true;
1612		info_buf.LastWriteTime =
1613		    cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1614	} else
1615		info_buf.LastWriteTime = 0;
1616
1617	/*
1618	 * Samba throws this field away, but windows may actually use it.
1619	 * Do not set ctime unless other time stamps are changed explicitly
1620	 * (i.e. by utimes()) since we would then have a mix of client and
1621	 * server times.
1622	 */
1623	if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1624		cifs_dbg(FYI, "CIFS - CTIME changed\n");
1625		info_buf.ChangeTime =
1626		    cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1627	} else
1628		info_buf.ChangeTime = 0;
1629
1630	info_buf.CreationTime = 0;	/* don't change */
1631	info_buf.Attributes = cpu_to_le32(dosattr);
1632
1633	return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1634}
1635
1636#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1637/*
1638 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1639 * and rename it to a random name that hopefully won't conflict with
1640 * anything else.
1641 */
1642int
1643cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1644			   const unsigned int xid)
1645{
1646	int oplock = 0;
1647	int rc;
1648	struct cifs_fid fid;
1649	struct cifs_open_parms oparms;
1650	struct inode *inode = d_inode(dentry);
1651	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1652	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1653	struct tcon_link *tlink;
1654	struct cifs_tcon *tcon;
1655	__u32 dosattr, origattr;
1656	FILE_BASIC_INFO *info_buf = NULL;
1657
1658	tlink = cifs_sb_tlink(cifs_sb);
1659	if (IS_ERR(tlink))
1660		return PTR_ERR(tlink);
1661	tcon = tlink_tcon(tlink);
1662
1663	/*
1664	 * We cannot rename the file if the server doesn't support
1665	 * CAP_INFOLEVEL_PASSTHRU
1666	 */
1667	if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1668		rc = -EBUSY;
1669		goto out;
1670	}
1671
1672	oparms = (struct cifs_open_parms) {
1673		.tcon = tcon,
1674		.cifs_sb = cifs_sb,
1675		.desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1676		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1677		.disposition = FILE_OPEN,
1678		.path = full_path,
1679		.fid = &fid,
1680	};
1681
1682	rc = CIFS_open(xid, &oparms, &oplock, NULL);
1683	if (rc != 0)
1684		goto out;
1685
1686	origattr = cifsInode->cifsAttrs;
1687	if (origattr == 0)
1688		origattr |= ATTR_NORMAL;
1689
1690	dosattr = origattr & ~ATTR_READONLY;
1691	if (dosattr == 0)
1692		dosattr |= ATTR_NORMAL;
1693	dosattr |= ATTR_HIDDEN;
1694
1695	/* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1696	if (dosattr != origattr) {
1697		info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1698		if (info_buf == NULL) {
1699			rc = -ENOMEM;
1700			goto out_close;
1701		}
1702		info_buf->Attributes = cpu_to_le32(dosattr);
1703		rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1704					current->tgid);
1705		/* although we would like to mark the file hidden
1706 		   if that fails we will still try to rename it */
1707		if (!rc)
1708			cifsInode->cifsAttrs = dosattr;
1709		else
1710			dosattr = origattr; /* since not able to change them */
1711	}
1712
1713	/* rename the file */
1714	rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1715				   cifs_sb->local_nls,
1716				   cifs_remap(cifs_sb));
1717	if (rc != 0) {
1718		rc = -EBUSY;
1719		goto undo_setattr;
1720	}
1721
1722	/* try to set DELETE_ON_CLOSE */
1723	if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1724		rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1725					       current->tgid);
1726		/*
1727		 * some samba versions return -ENOENT when we try to set the
1728		 * file disposition here. Likely a samba bug, but work around
1729		 * it for now. This means that some cifsXXX files may hang
1730		 * around after they shouldn't.
1731		 *
1732		 * BB: remove this hack after more servers have the fix
1733		 */
1734		if (rc == -ENOENT)
1735			rc = 0;
1736		else if (rc != 0) {
1737			rc = -EBUSY;
1738			goto undo_rename;
1739		}
1740		set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1741	}
1742
1743out_close:
1744	CIFSSMBClose(xid, tcon, fid.netfid);
1745out:
1746	kfree(info_buf);
1747	cifs_put_tlink(tlink);
1748	return rc;
1749
1750	/*
1751	 * reset everything back to the original state. Don't bother
1752	 * dealing with errors here since we can't do anything about
1753	 * them anyway.
1754	 */
1755undo_rename:
1756	CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1757				cifs_sb->local_nls, cifs_remap(cifs_sb));
1758undo_setattr:
1759	if (dosattr != origattr) {
1760		info_buf->Attributes = cpu_to_le32(origattr);
1761		if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1762					current->tgid))
1763			cifsInode->cifsAttrs = origattr;
1764	}
1765
1766	goto out_close;
1767}
1768#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1769
1770/* copied from fs/nfs/dir.c with small changes */
1771static void
1772cifs_drop_nlink(struct inode *inode)
1773{
1774	spin_lock(&inode->i_lock);
1775	if (inode->i_nlink > 0)
1776		drop_nlink(inode);
1777	spin_unlock(&inode->i_lock);
1778}
1779
1780/*
1781 * If d_inode(dentry) is null (usually meaning the cached dentry
1782 * is a negative dentry) then we would attempt a standard SMB delete, but
1783 * if that fails we can not attempt the fall back mechanisms on EACCES
1784 * but will return the EACCES to the caller. Note that the VFS does not call
1785 * unlink on negative dentries currently.
1786 */
1787int cifs_unlink(struct inode *dir, struct dentry *dentry)
1788{
1789	int rc = 0;
1790	unsigned int xid;
1791	const char *full_path;
1792	void *page;
1793	struct inode *inode = d_inode(dentry);
1794	struct cifsInodeInfo *cifs_inode;
1795	struct super_block *sb = dir->i_sb;
1796	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1797	struct tcon_link *tlink;
1798	struct cifs_tcon *tcon;
1799	struct TCP_Server_Info *server;
1800	struct iattr *attrs = NULL;
1801	__u32 dosattr = 0, origattr = 0;
1802
1803	cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1804
1805	if (unlikely(cifs_forced_shutdown(cifs_sb)))
1806		return -EIO;
1807
1808	tlink = cifs_sb_tlink(cifs_sb);
1809	if (IS_ERR(tlink))
1810		return PTR_ERR(tlink);
1811	tcon = tlink_tcon(tlink);
1812	server = tcon->ses->server;
1813
1814	xid = get_xid();
1815	page = alloc_dentry_path();
1816
1817	if (tcon->nodelete) {
1818		rc = -EACCES;
1819		goto unlink_out;
1820	}
1821
1822	/* Unlink can be called from rename so we can not take the
1823	 * sb->s_vfs_rename_mutex here */
1824	full_path = build_path_from_dentry(dentry, page);
1825	if (IS_ERR(full_path)) {
1826		rc = PTR_ERR(full_path);
1827		goto unlink_out;
1828	}
1829
 
1830	cifs_close_deferred_file_under_dentry(tcon, full_path);
1831#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1832	if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1833				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1834		rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1835			SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1836			cifs_remap(cifs_sb));
1837		cifs_dbg(FYI, "posix del rc %d\n", rc);
1838		if ((rc == 0) || (rc == -ENOENT))
1839			goto psx_del_no_retry;
1840	}
1841#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1842
1843retry_std_delete:
1844	if (!server->ops->unlink) {
1845		rc = -ENOSYS;
1846		goto psx_del_no_retry;
1847	}
1848
1849	rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1850
1851psx_del_no_retry:
1852	if (!rc) {
1853		if (inode)
 
1854			cifs_drop_nlink(inode);
 
1855	} else if (rc == -ENOENT) {
1856		d_drop(dentry);
1857	} else if (rc == -EBUSY) {
1858		if (server->ops->rename_pending_delete) {
1859			rc = server->ops->rename_pending_delete(full_path,
1860								dentry, xid);
1861			if (rc == 0)
 
1862				cifs_drop_nlink(inode);
 
1863		}
1864	} else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1865		attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1866		if (attrs == NULL) {
1867			rc = -ENOMEM;
1868			goto out_reval;
1869		}
1870
1871		/* try to reset dos attributes */
1872		cifs_inode = CIFS_I(inode);
1873		origattr = cifs_inode->cifsAttrs;
1874		if (origattr == 0)
1875			origattr |= ATTR_NORMAL;
1876		dosattr = origattr & ~ATTR_READONLY;
1877		if (dosattr == 0)
1878			dosattr |= ATTR_NORMAL;
1879		dosattr |= ATTR_HIDDEN;
1880
1881		rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1882		if (rc != 0)
1883			goto out_reval;
1884
1885		goto retry_std_delete;
1886	}
1887
1888	/* undo the setattr if we errored out and it's needed */
1889	if (rc != 0 && dosattr != 0)
1890		cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1891
1892out_reval:
1893	if (inode) {
1894		cifs_inode = CIFS_I(inode);
1895		cifs_inode->time = 0;	/* will force revalidate to get info
1896					   when needed */
1897		inode_set_ctime_current(inode);
1898	}
1899	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
1900	cifs_inode = CIFS_I(dir);
1901	CIFS_I(dir)->time = 0;	/* force revalidate of dir as well */
1902unlink_out:
1903	free_dentry_path(page);
1904	kfree(attrs);
1905	free_xid(xid);
1906	cifs_put_tlink(tlink);
1907	return rc;
1908}
1909
1910static int
1911cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1912		 const char *full_path, struct cifs_sb_info *cifs_sb,
1913		 struct cifs_tcon *tcon, const unsigned int xid)
1914{
1915	int rc = 0;
1916	struct inode *inode = NULL;
1917
1918	if (tcon->posix_extensions) {
1919		rc = smb311_posix_get_inode_info(&inode, full_path,
1920						 NULL, parent->i_sb, xid);
1921#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1922	} else if (tcon->unix_ext) {
1923		rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1924					      xid);
1925#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1926	} else {
1927		rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1928					 xid, NULL);
1929	}
1930
1931	if (rc)
1932		return rc;
1933
1934	if (!S_ISDIR(inode->i_mode)) {
1935		/*
1936		 * mkdir succeeded, but another client has managed to remove the
1937		 * sucker and replace it with non-directory.  Return success,
1938		 * but don't leave the child in dcache.
1939		 */
1940		 iput(inode);
1941		 d_drop(dentry);
1942		 return 0;
1943	}
1944	/*
1945	 * setting nlink not necessary except in cases where we failed to get it
1946	 * from the server or was set bogus. Also, since this is a brand new
1947	 * inode, no need to grab the i_lock before setting the i_nlink.
1948	 */
1949	if (inode->i_nlink < 2)
1950		set_nlink(inode, 2);
1951	mode &= ~current_umask();
1952	/* must turn on setgid bit if parent dir has it */
1953	if (parent->i_mode & S_ISGID)
1954		mode |= S_ISGID;
1955
1956#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1957	if (tcon->unix_ext) {
1958		struct cifs_unix_set_info_args args = {
1959			.mode	= mode,
1960			.ctime	= NO_CHANGE_64,
1961			.atime	= NO_CHANGE_64,
1962			.mtime	= NO_CHANGE_64,
1963			.device	= 0,
1964		};
1965		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1966			args.uid = current_fsuid();
1967			if (parent->i_mode & S_ISGID)
1968				args.gid = parent->i_gid;
1969			else
1970				args.gid = current_fsgid();
1971		} else {
1972			args.uid = INVALID_UID; /* no change */
1973			args.gid = INVALID_GID; /* no change */
1974		}
1975		CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1976				       cifs_sb->local_nls,
1977				       cifs_remap(cifs_sb));
1978	} else {
1979#else
1980	{
1981#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1982		struct TCP_Server_Info *server = tcon->ses->server;
1983		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1984		    (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1985			server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1986						   tcon, xid);
1987		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1988			inode->i_mode = (mode | S_IFDIR);
1989
1990		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1991			inode->i_uid = current_fsuid();
1992			if (inode->i_mode & S_ISGID)
1993				inode->i_gid = parent->i_gid;
1994			else
1995				inode->i_gid = current_fsgid();
1996		}
1997	}
1998	d_instantiate(dentry, inode);
1999	return 0;
2000}
2001
2002#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2003static int
2004cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
2005		 const char *full_path, struct cifs_sb_info *cifs_sb,
2006		 struct cifs_tcon *tcon, const unsigned int xid)
2007{
2008	int rc = 0;
2009	u32 oplock = 0;
2010	FILE_UNIX_BASIC_INFO *info = NULL;
2011	struct inode *newinode = NULL;
2012	struct cifs_fattr fattr;
2013
2014	info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
2015	if (info == NULL) {
2016		rc = -ENOMEM;
2017		goto posix_mkdir_out;
2018	}
2019
2020	mode &= ~current_umask();
2021	rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
2022			     NULL /* netfid */, info, &oplock, full_path,
2023			     cifs_sb->local_nls, cifs_remap(cifs_sb));
2024	if (rc == -EOPNOTSUPP)
2025		goto posix_mkdir_out;
2026	else if (rc) {
2027		cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
2028		d_drop(dentry);
2029		goto posix_mkdir_out;
2030	}
2031
2032	if (info->Type == cpu_to_le32(-1))
2033		/* no return info, go query for it */
2034		goto posix_mkdir_get_info;
2035	/*
2036	 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
2037	 * need to set uid/gid.
2038	 */
2039
2040	cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
2041	cifs_fill_uniqueid(inode->i_sb, &fattr);
2042	newinode = cifs_iget(inode->i_sb, &fattr);
2043	if (!newinode)
2044		goto posix_mkdir_get_info;
2045
2046	d_instantiate(dentry, newinode);
2047
2048#ifdef CONFIG_CIFS_DEBUG2
2049	cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
2050		 dentry, dentry, newinode);
2051
2052	if (newinode->i_nlink != 2)
2053		cifs_dbg(FYI, "unexpected number of links %d\n",
2054			 newinode->i_nlink);
2055#endif
2056
2057posix_mkdir_out:
2058	kfree(info);
2059	return rc;
2060posix_mkdir_get_info:
2061	rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
2062			      xid);
2063	goto posix_mkdir_out;
2064}
2065#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2066
2067int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
2068	       struct dentry *direntry, umode_t mode)
2069{
2070	int rc = 0;
2071	unsigned int xid;
2072	struct cifs_sb_info *cifs_sb;
2073	struct tcon_link *tlink;
2074	struct cifs_tcon *tcon;
2075	struct TCP_Server_Info *server;
2076	const char *full_path;
2077	void *page;
2078
2079	cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
2080		 mode, inode);
2081
2082	cifs_sb = CIFS_SB(inode->i_sb);
2083	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2084		return -EIO;
2085	tlink = cifs_sb_tlink(cifs_sb);
2086	if (IS_ERR(tlink))
2087		return PTR_ERR(tlink);
2088	tcon = tlink_tcon(tlink);
2089
2090	xid = get_xid();
2091
2092	page = alloc_dentry_path();
2093	full_path = build_path_from_dentry(direntry, page);
2094	if (IS_ERR(full_path)) {
2095		rc = PTR_ERR(full_path);
2096		goto mkdir_out;
2097	}
2098
2099	server = tcon->ses->server;
2100
2101	if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2102		rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2103					      cifs_sb);
2104		d_drop(direntry); /* for time being always refresh inode info */
2105		goto mkdir_out;
2106	}
2107
2108#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2109	if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2110				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2111		rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2112				      tcon, xid);
2113		if (rc != -EOPNOTSUPP)
2114			goto mkdir_out;
2115	}
2116#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2117
2118	if (!server->ops->mkdir) {
2119		rc = -ENOSYS;
2120		goto mkdir_out;
2121	}
2122
2123	/* BB add setting the equivalent of mode via CreateX w/ACLs */
2124	rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2125	if (rc) {
2126		cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2127		d_drop(direntry);
2128		goto mkdir_out;
2129	}
2130
2131	/* TODO: skip this for smb2/smb3 */
2132	rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2133			      xid);
2134mkdir_out:
2135	/*
2136	 * Force revalidate to get parent dir info when needed since cached
2137	 * attributes are invalid now.
2138	 */
2139	CIFS_I(inode)->time = 0;
2140	free_dentry_path(page);
2141	free_xid(xid);
2142	cifs_put_tlink(tlink);
2143	return rc;
2144}
2145
2146int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2147{
2148	int rc = 0;
2149	unsigned int xid;
2150	struct cifs_sb_info *cifs_sb;
2151	struct tcon_link *tlink;
2152	struct cifs_tcon *tcon;
2153	struct TCP_Server_Info *server;
2154	const char *full_path;
2155	void *page = alloc_dentry_path();
2156	struct cifsInodeInfo *cifsInode;
2157
2158	cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2159
2160	xid = get_xid();
2161
2162	full_path = build_path_from_dentry(direntry, page);
2163	if (IS_ERR(full_path)) {
2164		rc = PTR_ERR(full_path);
2165		goto rmdir_exit;
2166	}
2167
2168	cifs_sb = CIFS_SB(inode->i_sb);
2169	if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2170		rc = -EIO;
2171		goto rmdir_exit;
2172	}
2173
2174	tlink = cifs_sb_tlink(cifs_sb);
2175	if (IS_ERR(tlink)) {
2176		rc = PTR_ERR(tlink);
2177		goto rmdir_exit;
2178	}
2179	tcon = tlink_tcon(tlink);
2180	server = tcon->ses->server;
2181
2182	if (!server->ops->rmdir) {
2183		rc = -ENOSYS;
2184		cifs_put_tlink(tlink);
2185		goto rmdir_exit;
2186	}
2187
2188	if (tcon->nodelete) {
2189		rc = -EACCES;
2190		cifs_put_tlink(tlink);
2191		goto rmdir_exit;
2192	}
2193
2194	rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2195	cifs_put_tlink(tlink);
2196
2197	if (!rc) {
2198		spin_lock(&d_inode(direntry)->i_lock);
2199		i_size_write(d_inode(direntry), 0);
2200		clear_nlink(d_inode(direntry));
2201		spin_unlock(&d_inode(direntry)->i_lock);
2202	}
2203
2204	cifsInode = CIFS_I(d_inode(direntry));
2205	/* force revalidate to go get info when needed */
2206	cifsInode->time = 0;
2207
2208	cifsInode = CIFS_I(inode);
2209	/*
2210	 * Force revalidate to get parent dir info when needed since cached
2211	 * attributes are invalid now.
2212	 */
2213	cifsInode->time = 0;
2214
2215	inode_set_ctime_current(d_inode(direntry));
2216	inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
2217
2218rmdir_exit:
2219	free_dentry_path(page);
2220	free_xid(xid);
2221	return rc;
2222}
2223
2224static int
2225cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2226	       const char *from_path, struct dentry *to_dentry,
2227	       const char *to_path)
2228{
2229	struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2230	struct tcon_link *tlink;
2231	struct cifs_tcon *tcon;
2232	struct TCP_Server_Info *server;
2233#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2234	struct cifs_fid fid;
2235	struct cifs_open_parms oparms;
2236	int oplock;
2237#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2238	int rc;
2239
2240	tlink = cifs_sb_tlink(cifs_sb);
2241	if (IS_ERR(tlink))
2242		return PTR_ERR(tlink);
2243	tcon = tlink_tcon(tlink);
2244	server = tcon->ses->server;
2245
2246	if (!server->ops->rename)
2247		return -ENOSYS;
2248
2249	/* try path-based rename first */
2250	rc = server->ops->rename(xid, tcon, from_dentry,
2251				 from_path, to_path, cifs_sb);
2252
2253	/*
2254	 * Don't bother with rename by filehandle unless file is busy and
2255	 * source. Note that cross directory moves do not work with
2256	 * rename by filehandle to various Windows servers.
2257	 */
2258	if (rc == 0 || rc != -EBUSY)
2259		goto do_rename_exit;
2260
2261	/* Don't fall back to using SMB on SMB 2+ mount */
2262	if (server->vals->protocol_id != 0)
2263		goto do_rename_exit;
2264
2265#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2266	/* open-file renames don't work across directories */
2267	if (to_dentry->d_parent != from_dentry->d_parent)
2268		goto do_rename_exit;
2269
2270	oparms = (struct cifs_open_parms) {
2271		.tcon = tcon,
2272		.cifs_sb = cifs_sb,
2273		/* open the file to be renamed -- we need DELETE perms */
2274		.desired_access = DELETE,
2275		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2276		.disposition = FILE_OPEN,
2277		.path = from_path,
2278		.fid = &fid,
2279	};
2280
2281	rc = CIFS_open(xid, &oparms, &oplock, NULL);
2282	if (rc == 0) {
2283		rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2284				(const char *) to_dentry->d_name.name,
2285				cifs_sb->local_nls, cifs_remap(cifs_sb));
2286		CIFSSMBClose(xid, tcon, fid.netfid);
2287	}
2288#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2289do_rename_exit:
2290	if (rc == 0)
2291		d_move(from_dentry, to_dentry);
2292	cifs_put_tlink(tlink);
2293	return rc;
2294}
2295
2296int
2297cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2298	     struct dentry *source_dentry, struct inode *target_dir,
2299	     struct dentry *target_dentry, unsigned int flags)
2300{
2301	const char *from_name, *to_name;
2302	void *page1, *page2;
2303	struct cifs_sb_info *cifs_sb;
2304	struct tcon_link *tlink;
2305	struct cifs_tcon *tcon;
2306	unsigned int xid;
2307	int rc, tmprc;
2308	int retry_count = 0;
2309	FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2310#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2311	FILE_UNIX_BASIC_INFO *info_buf_target;
2312#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2313
2314	if (flags & ~RENAME_NOREPLACE)
2315		return -EINVAL;
2316
2317	cifs_sb = CIFS_SB(source_dir->i_sb);
2318	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2319		return -EIO;
2320
2321	tlink = cifs_sb_tlink(cifs_sb);
2322	if (IS_ERR(tlink))
2323		return PTR_ERR(tlink);
2324	tcon = tlink_tcon(tlink);
2325
2326	page1 = alloc_dentry_path();
2327	page2 = alloc_dentry_path();
2328	xid = get_xid();
2329
2330	from_name = build_path_from_dentry(source_dentry, page1);
2331	if (IS_ERR(from_name)) {
2332		rc = PTR_ERR(from_name);
2333		goto cifs_rename_exit;
2334	}
2335
2336	to_name = build_path_from_dentry(target_dentry, page2);
2337	if (IS_ERR(to_name)) {
2338		rc = PTR_ERR(to_name);
2339		goto cifs_rename_exit;
2340	}
2341
2342	cifs_close_deferred_file_under_dentry(tcon, from_name);
2343	if (d_inode(target_dentry) != NULL)
 
2344		cifs_close_deferred_file_under_dentry(tcon, to_name);
 
2345
2346	rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2347			    to_name);
2348
2349	if (rc == -EACCES) {
2350		while (retry_count < 3) {
2351			cifs_close_all_deferred_files(tcon);
2352			rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2353					    to_name);
2354			if (rc != -EACCES)
2355				break;
2356			retry_count++;
2357		}
2358	}
2359
2360	/*
2361	 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2362	 */
2363	if (flags & RENAME_NOREPLACE)
2364		goto cifs_rename_exit;
2365
2366#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2367	if (rc == -EEXIST && tcon->unix_ext) {
2368		/*
2369		 * Are src and dst hardlinks of same inode? We can only tell
2370		 * with unix extensions enabled.
2371		 */
2372		info_buf_source =
2373			kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2374					GFP_KERNEL);
2375		if (info_buf_source == NULL) {
2376			rc = -ENOMEM;
2377			goto cifs_rename_exit;
2378		}
2379
2380		info_buf_target = info_buf_source + 1;
2381		tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2382					     info_buf_source,
2383					     cifs_sb->local_nls,
2384					     cifs_remap(cifs_sb));
2385		if (tmprc != 0)
2386			goto unlink_target;
2387
2388		tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2389					     info_buf_target,
2390					     cifs_sb->local_nls,
2391					     cifs_remap(cifs_sb));
2392
2393		if (tmprc == 0 && (info_buf_source->UniqueId ==
2394				   info_buf_target->UniqueId)) {
2395			/* same file, POSIX says that this is a noop */
2396			rc = 0;
2397			goto cifs_rename_exit;
2398		}
2399	}
2400	/*
2401	 * else ... BB we could add the same check for Windows by
2402	 * checking the UniqueId via FILE_INTERNAL_INFO
2403	 */
2404
2405unlink_target:
2406#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2407
2408	/* Try unlinking the target dentry if it's not negative */
2409	if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2410		if (d_is_dir(target_dentry))
2411			tmprc = cifs_rmdir(target_dir, target_dentry);
2412		else
2413			tmprc = cifs_unlink(target_dir, target_dentry);
2414		if (tmprc)
2415			goto cifs_rename_exit;
2416		rc = cifs_do_rename(xid, source_dentry, from_name,
2417				    target_dentry, to_name);
2418	}
2419
2420	/* force revalidate to go get info when needed */
2421	CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2422
2423cifs_rename_exit:
2424	kfree(info_buf_source);
2425	free_dentry_path(page2);
2426	free_dentry_path(page1);
2427	free_xid(xid);
2428	cifs_put_tlink(tlink);
2429	return rc;
2430}
2431
2432static bool
2433cifs_dentry_needs_reval(struct dentry *dentry)
2434{
2435	struct inode *inode = d_inode(dentry);
2436	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2437	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2438	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2439	struct cached_fid *cfid = NULL;
2440
2441	if (cifs_i->time == 0)
2442		return true;
2443
2444	if (CIFS_CACHE_READ(cifs_i))
2445		return false;
2446
2447	if (!lookupCacheEnabled)
2448		return true;
2449
2450	if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2451		spin_lock(&cfid->fid_lock);
2452		if (cfid->time && cifs_i->time > cfid->time) {
2453			spin_unlock(&cfid->fid_lock);
2454			close_cached_dir(cfid);
2455			return false;
2456		}
2457		spin_unlock(&cfid->fid_lock);
2458		close_cached_dir(cfid);
2459	}
2460	/*
2461	 * depending on inode type, check if attribute caching disabled for
2462	 * files or directories
2463	 */
2464	if (S_ISDIR(inode->i_mode)) {
2465		if (!cifs_sb->ctx->acdirmax)
2466			return true;
2467		if (!time_in_range(jiffies, cifs_i->time,
2468				   cifs_i->time + cifs_sb->ctx->acdirmax))
2469			return true;
2470	} else { /* file */
2471		if (!cifs_sb->ctx->acregmax)
2472			return true;
2473		if (!time_in_range(jiffies, cifs_i->time,
2474				   cifs_i->time + cifs_sb->ctx->acregmax))
2475			return true;
2476	}
2477
2478	/* hardlinked files w/ noserverino get "special" treatment */
2479	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2480	    S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2481		return true;
2482
2483	return false;
2484}
2485
2486/*
2487 * Zap the cache. Called when invalid_mapping flag is set.
2488 */
2489int
2490cifs_invalidate_mapping(struct inode *inode)
2491{
2492	int rc = 0;
2493
2494	if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2495		rc = invalidate_inode_pages2(inode->i_mapping);
2496		if (rc)
2497			cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2498				 __func__, inode, rc);
2499	}
2500
2501	return rc;
2502}
2503
2504/**
2505 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2506 *
2507 * @key:	currently unused
2508 * @mode:	the task state to sleep in
2509 */
2510static int
2511cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2512{
2513	schedule();
2514	if (signal_pending_state(mode, current))
2515		return -ERESTARTSYS;
2516	return 0;
2517}
2518
2519int
2520cifs_revalidate_mapping(struct inode *inode)
2521{
2522	int rc;
2523	unsigned long *flags = &CIFS_I(inode)->flags;
 
2524	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2525
2526	/* swapfiles are not supposed to be shared */
2527	if (IS_SWAPFILE(inode))
2528		return 0;
2529
2530	rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2531				     TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2532	if (rc)
2533		return rc;
2534
2535	if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2536		/* for cache=singleclient, do not invalidate */
2537		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2538			goto skip_invalidate;
2539
2540		rc = cifs_invalidate_mapping(inode);
2541		if (rc)
 
 
 
2542			set_bit(CIFS_INO_INVALID_MAPPING, flags);
 
2543	}
2544
2545skip_invalidate:
2546	clear_bit_unlock(CIFS_INO_LOCK, flags);
2547	smp_mb__after_atomic();
2548	wake_up_bit(flags, CIFS_INO_LOCK);
2549
2550	return rc;
2551}
2552
2553int
2554cifs_zap_mapping(struct inode *inode)
2555{
2556	set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2557	return cifs_revalidate_mapping(inode);
2558}
2559
2560int cifs_revalidate_file_attr(struct file *filp)
2561{
2562	int rc = 0;
2563	struct dentry *dentry = file_dentry(filp);
2564#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2565	struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2566#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2567
2568	if (!cifs_dentry_needs_reval(dentry))
2569		return rc;
2570
2571#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2572	if (tlink_tcon(cfile->tlink)->unix_ext)
2573		rc = cifs_get_file_info_unix(filp);
2574	else
2575#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2576		rc = cifs_get_file_info(filp);
2577
2578	return rc;
2579}
2580
2581int cifs_revalidate_dentry_attr(struct dentry *dentry)
2582{
2583	unsigned int xid;
2584	int rc = 0;
2585	struct inode *inode = d_inode(dentry);
2586	struct super_block *sb = dentry->d_sb;
2587	const char *full_path;
2588	void *page;
2589	int count = 0;
2590
2591	if (inode == NULL)
2592		return -ENOENT;
2593
2594	if (!cifs_dentry_needs_reval(dentry))
2595		return rc;
2596
2597	xid = get_xid();
2598
2599	page = alloc_dentry_path();
2600	full_path = build_path_from_dentry(dentry, page);
2601	if (IS_ERR(full_path)) {
2602		rc = PTR_ERR(full_path);
2603		goto out;
2604	}
2605
2606	cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2607		 full_path, inode, inode->i_count.counter,
2608		 dentry, cifs_get_time(dentry), jiffies);
2609
2610again:
2611	if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions) {
2612		rc = smb311_posix_get_inode_info(&inode, full_path,
2613						 NULL, sb, xid);
2614	} else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) {
2615		rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2616	} else {
2617		rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2618					 xid, NULL);
2619	}
2620	if (rc == -EAGAIN && count++ < 10)
2621		goto again;
2622out:
2623	free_dentry_path(page);
2624	free_xid(xid);
2625
2626	return rc;
2627}
2628
2629int cifs_revalidate_file(struct file *filp)
2630{
2631	int rc;
2632	struct inode *inode = file_inode(filp);
2633
2634	rc = cifs_revalidate_file_attr(filp);
2635	if (rc)
2636		return rc;
2637
2638	return cifs_revalidate_mapping(inode);
2639}
2640
2641/* revalidate a dentry's inode attributes */
2642int cifs_revalidate_dentry(struct dentry *dentry)
2643{
2644	int rc;
2645	struct inode *inode = d_inode(dentry);
2646
2647	rc = cifs_revalidate_dentry_attr(dentry);
2648	if (rc)
2649		return rc;
2650
2651	return cifs_revalidate_mapping(inode);
2652}
2653
2654int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2655		 struct kstat *stat, u32 request_mask, unsigned int flags)
2656{
2657	struct dentry *dentry = path->dentry;
2658	struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2659	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2660	struct inode *inode = d_inode(dentry);
2661	int rc;
2662
2663	if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2664		return -EIO;
2665
2666	/*
2667	 * We need to be sure that all dirty pages are written and the server
2668	 * has actual ctime, mtime and file length.
2669	 */
2670	if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2671	    !CIFS_CACHE_READ(CIFS_I(inode)) &&
2672	    inode->i_mapping && inode->i_mapping->nrpages != 0) {
2673		rc = filemap_fdatawait(inode->i_mapping);
2674		if (rc) {
2675			mapping_set_error(inode->i_mapping, rc);
2676			return rc;
2677		}
2678	}
2679
2680	if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2681		CIFS_I(inode)->time = 0; /* force revalidate */
2682
2683	/*
2684	 * If the caller doesn't require syncing, only sync if
2685	 * necessary (e.g. due to earlier truncate or setattr
2686	 * invalidating the cached metadata)
2687	 */
2688	if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2689	    (CIFS_I(inode)->time == 0)) {
2690		rc = cifs_revalidate_dentry_attr(dentry);
2691		if (rc)
2692			return rc;
2693	}
2694
2695	generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2696	stat->blksize = cifs_sb->ctx->bsize;
2697	stat->ino = CIFS_I(inode)->uniqueid;
2698
2699	/* old CIFS Unix Extensions doesn't return create time */
2700	if (CIFS_I(inode)->createtime) {
2701		stat->result_mask |= STATX_BTIME;
2702		stat->btime =
2703		      cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2704	}
2705
2706	stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2707	if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2708		stat->attributes |= STATX_ATTR_COMPRESSED;
2709	if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2710		stat->attributes |= STATX_ATTR_ENCRYPTED;
2711
2712	/*
2713	 * If on a multiuser mount without unix extensions or cifsacl being
2714	 * enabled, and the admin hasn't overridden them, set the ownership
2715	 * to the fsuid/fsgid of the current process.
2716	 */
2717	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2718	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2719	    !tcon->unix_ext) {
2720		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2721			stat->uid = current_fsuid();
2722		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2723			stat->gid = current_fsgid();
2724	}
2725	return 0;
2726}
2727
2728int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2729		u64 len)
2730{
2731	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2732	struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2733	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2734	struct TCP_Server_Info *server = tcon->ses->server;
2735	struct cifsFileInfo *cfile;
2736	int rc;
2737
2738	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2739		return -EIO;
2740
2741	/*
2742	 * We need to be sure that all dirty pages are written as they
2743	 * might fill holes on the server.
2744	 */
2745	if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2746	    inode->i_mapping->nrpages != 0) {
2747		rc = filemap_fdatawait(inode->i_mapping);
2748		if (rc) {
2749			mapping_set_error(inode->i_mapping, rc);
2750			return rc;
2751		}
2752	}
2753
2754	cfile = find_readable_file(cifs_i, false);
2755	if (cfile == NULL)
2756		return -EINVAL;
2757
2758	if (server->ops->fiemap) {
2759		rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2760		cifsFileInfo_put(cfile);
2761		return rc;
2762	}
2763
2764	cifsFileInfo_put(cfile);
2765	return -EOPNOTSUPP;
2766}
2767
2768int cifs_truncate_page(struct address_space *mapping, loff_t from)
2769{
2770	pgoff_t index = from >> PAGE_SHIFT;
2771	unsigned offset = from & (PAGE_SIZE - 1);
2772	struct page *page;
2773	int rc = 0;
2774
2775	page = grab_cache_page(mapping, index);
2776	if (!page)
2777		return -ENOMEM;
2778
2779	zero_user_segment(page, offset, PAGE_SIZE);
2780	unlock_page(page);
2781	put_page(page);
2782	return rc;
2783}
2784
2785void cifs_setsize(struct inode *inode, loff_t offset)
2786{
2787	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2788
2789	spin_lock(&inode->i_lock);
2790	i_size_write(inode, offset);
2791	spin_unlock(&inode->i_lock);
2792
2793	/* Cached inode must be refreshed on truncate */
2794	cifs_i->time = 0;
2795	truncate_pagecache(inode, offset);
2796}
2797
2798static int
2799cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2800		   unsigned int xid, const char *full_path)
2801{
2802	int rc;
2803	struct cifsFileInfo *open_file;
2804	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2805	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2806	struct tcon_link *tlink = NULL;
2807	struct cifs_tcon *tcon = NULL;
2808	struct TCP_Server_Info *server;
2809
2810	/*
2811	 * To avoid spurious oplock breaks from server, in the case of
2812	 * inodes that we already have open, avoid doing path based
2813	 * setting of file size if we can do it by handle.
2814	 * This keeps our caching token (oplock) and avoids timeouts
2815	 * when the local oplock break takes longer to flush
2816	 * writebehind data than the SMB timeout for the SetPathInfo
2817	 * request would allow
2818	 */
2819	open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2820	if (open_file) {
2821		tcon = tlink_tcon(open_file->tlink);
2822		server = tcon->ses->server;
2823		if (server->ops->set_file_size)
2824			rc = server->ops->set_file_size(xid, tcon, open_file,
2825							attrs->ia_size, false);
2826		else
2827			rc = -ENOSYS;
2828		cifsFileInfo_put(open_file);
2829		cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2830	} else
2831		rc = -EINVAL;
2832
2833	if (!rc)
2834		goto set_size_out;
2835
2836	if (tcon == NULL) {
2837		tlink = cifs_sb_tlink(cifs_sb);
2838		if (IS_ERR(tlink))
2839			return PTR_ERR(tlink);
2840		tcon = tlink_tcon(tlink);
2841		server = tcon->ses->server;
2842	}
2843
2844	/*
2845	 * Set file size by pathname rather than by handle either because no
2846	 * valid, writeable file handle for it was found or because there was
2847	 * an error setting it by handle.
2848	 */
2849	if (server->ops->set_path_size)
2850		rc = server->ops->set_path_size(xid, tcon, full_path,
2851						attrs->ia_size, cifs_sb, false);
2852	else
2853		rc = -ENOSYS;
2854	cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2855
2856	if (tlink)
2857		cifs_put_tlink(tlink);
2858
2859set_size_out:
2860	if (rc == 0) {
2861		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
2862		cifs_setsize(inode, attrs->ia_size);
2863		/*
2864		 * i_blocks is not related to (i_size / i_blksize), but instead
2865		 * 512 byte (2**9) size is required for calculating num blocks.
2866		 * Until we can query the server for actual allocation size,
2867		 * this is best estimate we have for blocks allocated for a file
2868		 * Number of blocks must be rounded up so size 1 is not 0 blocks
2869		 */
2870		inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2871
2872		/*
2873		 * The man page of truncate says if the size changed,
2874		 * then the st_ctime and st_mtime fields for the file
2875		 * are updated.
2876		 */
2877		attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2878		attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2879
2880		cifs_truncate_page(inode->i_mapping, inode->i_size);
2881	}
2882
2883	return rc;
2884}
2885
2886#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2887static int
2888cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2889{
2890	int rc;
2891	unsigned int xid;
2892	const char *full_path;
2893	void *page = alloc_dentry_path();
2894	struct inode *inode = d_inode(direntry);
2895	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2896	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2897	struct tcon_link *tlink;
2898	struct cifs_tcon *pTcon;
2899	struct cifs_unix_set_info_args *args = NULL;
2900	struct cifsFileInfo *open_file;
2901
2902	cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2903		 direntry, attrs->ia_valid);
2904
2905	xid = get_xid();
2906
2907	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2908		attrs->ia_valid |= ATTR_FORCE;
2909
2910	rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2911	if (rc < 0)
2912		goto out;
2913
2914	full_path = build_path_from_dentry(direntry, page);
2915	if (IS_ERR(full_path)) {
2916		rc = PTR_ERR(full_path);
2917		goto out;
2918	}
2919
2920	/*
2921	 * Attempt to flush data before changing attributes. We need to do
2922	 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2923	 * ownership or mode then we may also need to do this. Here, we take
2924	 * the safe way out and just do the flush on all setattr requests. If
2925	 * the flush returns error, store it to report later and continue.
2926	 *
2927	 * BB: This should be smarter. Why bother flushing pages that
2928	 * will be truncated anyway? Also, should we error out here if
2929	 * the flush returns error?
2930	 */
2931	rc = filemap_write_and_wait(inode->i_mapping);
2932	if (is_interrupt_error(rc)) {
2933		rc = -ERESTARTSYS;
2934		goto out;
2935	}
2936
2937	mapping_set_error(inode->i_mapping, rc);
2938	rc = 0;
2939
2940	if (attrs->ia_valid & ATTR_SIZE) {
2941		rc = cifs_set_file_size(inode, attrs, xid, full_path);
2942		if (rc != 0)
2943			goto out;
2944	}
2945
2946	/* skip mode change if it's just for clearing setuid/setgid */
2947	if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2948		attrs->ia_valid &= ~ATTR_MODE;
2949
2950	args = kmalloc(sizeof(*args), GFP_KERNEL);
2951	if (args == NULL) {
2952		rc = -ENOMEM;
2953		goto out;
2954	}
2955
2956	/* set up the struct */
2957	if (attrs->ia_valid & ATTR_MODE)
2958		args->mode = attrs->ia_mode;
2959	else
2960		args->mode = NO_CHANGE_64;
2961
2962	if (attrs->ia_valid & ATTR_UID)
2963		args->uid = attrs->ia_uid;
2964	else
2965		args->uid = INVALID_UID; /* no change */
2966
2967	if (attrs->ia_valid & ATTR_GID)
2968		args->gid = attrs->ia_gid;
2969	else
2970		args->gid = INVALID_GID; /* no change */
2971
2972	if (attrs->ia_valid & ATTR_ATIME)
2973		args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2974	else
2975		args->atime = NO_CHANGE_64;
2976
2977	if (attrs->ia_valid & ATTR_MTIME)
2978		args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2979	else
2980		args->mtime = NO_CHANGE_64;
2981
2982	if (attrs->ia_valid & ATTR_CTIME)
2983		args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2984	else
2985		args->ctime = NO_CHANGE_64;
2986
2987	args->device = 0;
2988	open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2989	if (open_file) {
2990		u16 nfid = open_file->fid.netfid;
2991		u32 npid = open_file->pid;
2992		pTcon = tlink_tcon(open_file->tlink);
2993		rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2994		cifsFileInfo_put(open_file);
2995	} else {
2996		tlink = cifs_sb_tlink(cifs_sb);
2997		if (IS_ERR(tlink)) {
2998			rc = PTR_ERR(tlink);
2999			goto out;
3000		}
3001		pTcon = tlink_tcon(tlink);
3002		rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
3003				    cifs_sb->local_nls,
3004				    cifs_remap(cifs_sb));
3005		cifs_put_tlink(tlink);
3006	}
3007
3008	if (rc)
3009		goto out;
3010
3011	if ((attrs->ia_valid & ATTR_SIZE) &&
3012	    attrs->ia_size != i_size_read(inode)) {
3013		truncate_setsize(inode, attrs->ia_size);
3014		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
3015		fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3016	}
3017
3018	setattr_copy(&nop_mnt_idmap, inode, attrs);
3019	mark_inode_dirty(inode);
3020
3021	/* force revalidate when any of these times are set since some
3022	   of the fs types (eg ext3, fat) do not have fine enough
3023	   time granularity to match protocol, and we do not have a
3024	   a way (yet) to query the server fs's time granularity (and
3025	   whether it rounds times down).
3026	*/
3027	if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
3028		cifsInode->time = 0;
3029out:
3030	kfree(args);
3031	free_dentry_path(page);
3032	free_xid(xid);
3033	return rc;
3034}
3035#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3036
3037static int
3038cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
3039{
3040	unsigned int xid;
3041	kuid_t uid = INVALID_UID;
3042	kgid_t gid = INVALID_GID;
3043	struct inode *inode = d_inode(direntry);
3044	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3045	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
3046	struct cifsFileInfo *wfile;
3047	struct cifs_tcon *tcon;
3048	const char *full_path;
3049	void *page = alloc_dentry_path();
3050	int rc = -EACCES;
3051	__u32 dosattr = 0;
3052	__u64 mode = NO_CHANGE_64;
 
3053
3054	xid = get_xid();
3055
3056	cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
3057		 direntry, attrs->ia_valid);
3058
3059	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
3060		attrs->ia_valid |= ATTR_FORCE;
3061
3062	rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
3063	if (rc < 0)
3064		goto cifs_setattr_exit;
3065
3066	full_path = build_path_from_dentry(direntry, page);
3067	if (IS_ERR(full_path)) {
3068		rc = PTR_ERR(full_path);
3069		goto cifs_setattr_exit;
3070	}
3071
3072	/*
3073	 * Attempt to flush data before changing attributes. We need to do
3074	 * this for ATTR_SIZE and ATTR_MTIME.  If the flush of the data
3075	 * returns error, store it to report later and continue.
3076	 *
3077	 * BB: This should be smarter. Why bother flushing pages that
3078	 * will be truncated anyway? Also, should we error out here if
3079	 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
3080	 */
3081	if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
3082		rc = filemap_write_and_wait(inode->i_mapping);
3083		if (is_interrupt_error(rc)) {
3084			rc = -ERESTARTSYS;
3085			goto cifs_setattr_exit;
3086		}
3087		mapping_set_error(inode->i_mapping, rc);
3088	}
3089
3090	rc = 0;
3091
3092	if ((attrs->ia_valid & ATTR_MTIME) &&
3093	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3094		rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3095		if (!rc) {
3096			tcon = tlink_tcon(wfile->tlink);
3097			rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3098			cifsFileInfo_put(wfile);
3099			if (rc)
3100				goto cifs_setattr_exit;
3101		} else if (rc != -EBADF)
3102			goto cifs_setattr_exit;
3103		else
3104			rc = 0;
3105	}
3106
3107	if (attrs->ia_valid & ATTR_SIZE) {
3108		rc = cifs_set_file_size(inode, attrs, xid, full_path);
3109		if (rc != 0)
3110			goto cifs_setattr_exit;
3111	}
3112
3113	if (attrs->ia_valid & ATTR_UID)
3114		uid = attrs->ia_uid;
3115
3116	if (attrs->ia_valid & ATTR_GID)
3117		gid = attrs->ia_gid;
3118
3119	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3120	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3121		if (uid_valid(uid) || gid_valid(gid)) {
3122			mode = NO_CHANGE_64;
3123			rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3124							uid, gid);
3125			if (rc) {
3126				cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3127					 __func__, rc);
3128				goto cifs_setattr_exit;
3129			}
3130		}
3131	} else
3132	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3133		attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3134
3135	/* skip mode change if it's just for clearing setuid/setgid */
3136	if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3137		attrs->ia_valid &= ~ATTR_MODE;
3138
3139	if (attrs->ia_valid & ATTR_MODE) {
3140		mode = attrs->ia_mode;
3141		rc = 0;
3142		if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3143		    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
 
3144			rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3145						INVALID_UID, INVALID_GID);
3146			if (rc) {
3147				cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3148					 __func__, rc);
3149				goto cifs_setattr_exit;
3150			}
3151
3152			/*
3153			 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3154			 * Pick up the actual mode bits that were set.
3155			 */
3156			if (mode != attrs->ia_mode)
3157				attrs->ia_mode = mode;
3158		} else
3159		if (((mode & S_IWUGO) == 0) &&
3160		    (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3161
3162			dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3163
3164			/* fix up mode if we're not using dynperm */
3165			if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3166				attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3167		} else if ((mode & S_IWUGO) &&
3168			   (cifsInode->cifsAttrs & ATTR_READONLY)) {
3169
3170			dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3171			/* Attributes of 0 are ignored */
3172			if (dosattr == 0)
3173				dosattr |= ATTR_NORMAL;
3174
3175			/* reset local inode permissions to normal */
3176			if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3177				attrs->ia_mode &= ~(S_IALLUGO);
3178				if (S_ISDIR(inode->i_mode))
3179					attrs->ia_mode |=
3180						cifs_sb->ctx->dir_mode;
3181				else
3182					attrs->ia_mode |=
3183						cifs_sb->ctx->file_mode;
3184			}
3185		} else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3186			/* ignore mode change - ATTR_READONLY hasn't changed */
3187			attrs->ia_valid &= ~ATTR_MODE;
3188		}
3189	}
3190
3191	if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3192	    ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3193		rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3194		/* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3195
3196		/* Even if error on time set, no sense failing the call if
3197		the server would set the time to a reasonable value anyway,
3198		and this check ensures that we are not being called from
3199		sys_utimes in which case we ought to fail the call back to
3200		the user when the server rejects the call */
3201		if ((rc) && (attrs->ia_valid &
3202				(ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3203			rc = 0;
3204	}
3205
3206	/* do not need local check to inode_check_ok since the server does
3207	   that */
3208	if (rc)
3209		goto cifs_setattr_exit;
3210
3211	if ((attrs->ia_valid & ATTR_SIZE) &&
3212	    attrs->ia_size != i_size_read(inode)) {
3213		truncate_setsize(inode, attrs->ia_size);
3214		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
3215		fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3216	}
3217
3218	setattr_copy(&nop_mnt_idmap, inode, attrs);
3219	mark_inode_dirty(inode);
3220
3221cifs_setattr_exit:
3222	free_xid(xid);
3223	free_dentry_path(page);
3224	return rc;
3225}
3226
3227int
3228cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3229	     struct iattr *attrs)
3230{
3231	struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3232	int rc, retries = 0;
3233#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3234	struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3235#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3236
3237	if (unlikely(cifs_forced_shutdown(cifs_sb)))
3238		return -EIO;
3239
3240	do {
3241#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3242		if (pTcon->unix_ext)
3243			rc = cifs_setattr_unix(direntry, attrs);
3244		else
3245#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3246			rc = cifs_setattr_nounix(direntry, attrs);
3247		retries++;
3248	} while (is_retryable_error(rc) && retries < 2);
3249
3250	/* BB: add cifs_setattr_legacy for really old servers */
3251	return rc;
3252}
v6.13.7
   1// SPDX-License-Identifier: LGPL-2.1
   2/*
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2010
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *
   7 */
   8#include <linux/fs.h>
   9#include <linux/stat.h>
  10#include <linux/slab.h>
  11#include <linux/pagemap.h>
  12#include <linux/freezer.h>
  13#include <linux/sched/signal.h>
  14#include <linux/wait_bit.h>
  15#include <linux/fiemap.h>
  16#include <asm/div64.h>
  17#include "cifsfs.h"
  18#include "cifspdu.h"
  19#include "cifsglob.h"
  20#include "cifsproto.h"
  21#include "smb2proto.h"
  22#include "cifs_debug.h"
  23#include "cifs_fs_sb.h"
  24#include "cifs_unicode.h"
  25#include "fscache.h"
  26#include "fs_context.h"
  27#include "cifs_ioctl.h"
  28#include "cached_dir.h"
  29#include "reparse.h"
  30
  31/*
  32 * Set parameters for the netfs library
  33 */
  34static void cifs_set_netfs_context(struct inode *inode)
  35{
  36	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
  37
  38	netfs_inode_init(&cifs_i->netfs, &cifs_req_ops, true);
  39}
  40
  41static void cifs_set_ops(struct inode *inode)
  42{
  43	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
  44	struct netfs_inode *ictx = netfs_inode(inode);
  45
  46	switch (inode->i_mode & S_IFMT) {
  47	case S_IFREG:
  48		inode->i_op = &cifs_file_inode_ops;
  49		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
  50			set_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags);
  51			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  52				inode->i_fop = &cifs_file_direct_nobrl_ops;
  53			else
  54				inode->i_fop = &cifs_file_direct_ops;
  55		} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
  56			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  57				inode->i_fop = &cifs_file_strict_nobrl_ops;
  58			else
  59				inode->i_fop = &cifs_file_strict_ops;
  60		} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
  61			inode->i_fop = &cifs_file_nobrl_ops;
  62		else { /* not direct, send byte range locks */
  63			inode->i_fop = &cifs_file_ops;
  64		}
  65
  66		/* check if server can support readahead */
  67		if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
  68				PAGE_SIZE + MAX_CIFS_HDR_SIZE)
  69			inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
  70		else
  71			inode->i_data.a_ops = &cifs_addr_ops;
  72		mapping_set_large_folios(inode->i_mapping);
  73		break;
  74	case S_IFDIR:
  75		if (IS_AUTOMOUNT(inode)) {
  76			inode->i_op = &cifs_namespace_inode_operations;
  77		} else {
  78			inode->i_op = &cifs_dir_inode_ops;
  79			inode->i_fop = &cifs_dir_ops;
  80		}
  81		break;
  82	case S_IFLNK:
  83		inode->i_op = &cifs_symlink_inode_ops;
  84		break;
  85	default:
  86		init_special_inode(inode, inode->i_mode, inode->i_rdev);
  87		break;
  88	}
  89}
  90
  91/* check inode attributes against fattr. If they don't match, tag the
  92 * inode for cache invalidation
  93 */
  94static void
  95cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
  96{
  97	struct cifs_fscache_inode_coherency_data cd;
  98	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
  99	struct timespec64 mtime;
 100
 101	cifs_dbg(FYI, "%s: revalidating inode %llu\n",
 102		 __func__, cifs_i->uniqueid);
 103
 104	if (inode->i_state & I_NEW) {
 105		cifs_dbg(FYI, "%s: inode %llu is new\n",
 106			 __func__, cifs_i->uniqueid);
 107		return;
 108	}
 109
 110	/* don't bother with revalidation if we have an oplock */
 111	if (CIFS_CACHE_READ(cifs_i)) {
 112		cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
 113			 __func__, cifs_i->uniqueid);
 114		return;
 115	}
 116
 117	 /* revalidate if mtime or size have changed */
 118	fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
 119	mtime = inode_get_mtime(inode);
 120	if (timespec64_equal(&mtime, &fattr->cf_mtime) &&
 121	    cifs_i->netfs.remote_i_size == fattr->cf_eof) {
 122		cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
 123			 __func__, cifs_i->uniqueid);
 124		return;
 125	}
 126
 127	cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
 128		 __func__, cifs_i->uniqueid);
 129	set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
 130	/* Invalidate fscache cookie */
 131	cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd);
 132	fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0);
 133}
 134
 135/*
 136 * copy nlink to the inode, unless it wasn't provided.  Provide
 137 * sane values if we don't have an existing one and none was provided
 138 */
 139static void
 140cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
 141{
 142	/*
 143	 * if we're in a situation where we can't trust what we
 144	 * got from the server (readdir, some non-unix cases)
 145	 * fake reasonable values
 146	 */
 147	if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
 148		/* only provide fake values on a new inode */
 149		if (inode->i_state & I_NEW) {
 150			if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
 151				set_nlink(inode, 2);
 152			else
 153				set_nlink(inode, 1);
 154		}
 155		return;
 156	}
 157
 158	/* we trust the server, so update it */
 159	set_nlink(inode, fattr->cf_nlink);
 160}
 161
 162/* populate an inode with info from a cifs_fattr struct */
 163int
 164cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr,
 165		    bool from_readdir)
 166{
 167	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
 168	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 169
 170	if (!(inode->i_state & I_NEW) &&
 171	    unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
 172		CIFS_I(inode)->time = 0; /* force reval */
 173		return -ESTALE;
 174	}
 175	if (inode->i_state & I_NEW)
 176		CIFS_I(inode)->netfs.zero_point = fattr->cf_eof;
 177
 178	cifs_revalidate_cache(inode, fattr);
 179
 180	spin_lock(&inode->i_lock);
 181	fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
 182	fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
 183	fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
 184	/* we do not want atime to be less than mtime, it broke some apps */
 185	if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
 186		inode_set_atime_to_ts(inode, fattr->cf_mtime);
 187	else
 188		inode_set_atime_to_ts(inode, fattr->cf_atime);
 189	inode_set_mtime_to_ts(inode, fattr->cf_mtime);
 190	inode_set_ctime_to_ts(inode, fattr->cf_ctime);
 191	inode->i_rdev = fattr->cf_rdev;
 192	cifs_nlink_fattr_to_inode(inode, fattr);
 193	inode->i_uid = fattr->cf_uid;
 194	inode->i_gid = fattr->cf_gid;
 195
 196	/* if dynperm is set, don't clobber existing mode */
 197	if (inode->i_state & I_NEW ||
 198	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
 199		inode->i_mode = fattr->cf_mode;
 200
 201	cifs_i->cifsAttrs = fattr->cf_cifsattrs;
 202	cifs_i->reparse_tag = fattr->cf_cifstag;
 203
 204	if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
 205		cifs_i->time = 0;
 206	else
 207		cifs_i->time = jiffies;
 208
 209	if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
 210		set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
 211	else
 212		clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
 213
 214	cifs_i->netfs.remote_i_size = fattr->cf_eof;
 215	/*
 216	 * Can't safely change the file size here if the client is writing to
 217	 * it due to potential races.
 218	 */
 219	if (is_size_safe_to_change(cifs_i, fattr->cf_eof, from_readdir)) {
 220		i_size_write(inode, fattr->cf_eof);
 221
 222		/*
 223		 * i_blocks is not related to (i_size / i_blksize),
 224		 * but instead 512 byte (2**9) size is required for
 225		 * calculating num blocks.
 226		 */
 227		inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
 228	}
 229
 230	if (S_ISLNK(fattr->cf_mode) && fattr->cf_symlink_target) {
 231		kfree(cifs_i->symlink_target);
 232		cifs_i->symlink_target = fattr->cf_symlink_target;
 233		fattr->cf_symlink_target = NULL;
 234	}
 235	spin_unlock(&inode->i_lock);
 236
 237	if (fattr->cf_flags & CIFS_FATTR_JUNCTION)
 238		inode->i_flags |= S_AUTOMOUNT;
 239	if (inode->i_state & I_NEW) {
 240		cifs_set_netfs_context(inode);
 241		cifs_set_ops(inode);
 242	}
 243	return 0;
 244}
 245
 246void
 247cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
 248{
 249	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 250
 251	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
 252		return;
 253
 254	fattr->cf_uniqueid = iunique(sb, ROOT_I);
 255}
 256
 257/* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
 258void
 259cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
 260			 struct cifs_sb_info *cifs_sb)
 261{
 262	memset(fattr, 0, sizeof(*fattr));
 263	fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
 264	fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
 265	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 266
 267	fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 268	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
 269	fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
 270	/* old POSIX extensions don't get create time */
 271
 272	fattr->cf_mode = le64_to_cpu(info->Permissions);
 273
 274	/*
 275	 * Since we set the inode type below we need to mask off
 276	 * to avoid strange results if bits set above.
 277	 */
 278	fattr->cf_mode &= ~S_IFMT;
 279	switch (le32_to_cpu(info->Type)) {
 280	case UNIX_FILE:
 281		fattr->cf_mode |= S_IFREG;
 282		fattr->cf_dtype = DT_REG;
 283		break;
 284	case UNIX_SYMLINK:
 285		fattr->cf_mode |= S_IFLNK;
 286		fattr->cf_dtype = DT_LNK;
 287		break;
 288	case UNIX_DIR:
 289		fattr->cf_mode |= S_IFDIR;
 290		fattr->cf_dtype = DT_DIR;
 291		break;
 292	case UNIX_CHARDEV:
 293		fattr->cf_mode |= S_IFCHR;
 294		fattr->cf_dtype = DT_CHR;
 295		fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
 296				       le64_to_cpu(info->DevMinor) & MINORMASK);
 297		break;
 298	case UNIX_BLOCKDEV:
 299		fattr->cf_mode |= S_IFBLK;
 300		fattr->cf_dtype = DT_BLK;
 301		fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
 302				       le64_to_cpu(info->DevMinor) & MINORMASK);
 303		break;
 304	case UNIX_FIFO:
 305		fattr->cf_mode |= S_IFIFO;
 306		fattr->cf_dtype = DT_FIFO;
 307		break;
 308	case UNIX_SOCKET:
 309		fattr->cf_mode |= S_IFSOCK;
 310		fattr->cf_dtype = DT_SOCK;
 311		break;
 312	default:
 313		/* safest to call it a file if we do not know */
 314		fattr->cf_mode |= S_IFREG;
 315		fattr->cf_dtype = DT_REG;
 316		cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
 317		break;
 318	}
 319
 320	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 321	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
 322		u64 id = le64_to_cpu(info->Uid);
 323		if (id < ((uid_t)-1)) {
 324			kuid_t uid = make_kuid(&init_user_ns, id);
 325			if (uid_valid(uid))
 326				fattr->cf_uid = uid;
 327		}
 328	}
 329	
 330	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 331	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
 332		u64 id = le64_to_cpu(info->Gid);
 333		if (id < ((gid_t)-1)) {
 334			kgid_t gid = make_kgid(&init_user_ns, id);
 335			if (gid_valid(gid))
 336				fattr->cf_gid = gid;
 337		}
 338	}
 339
 340	fattr->cf_nlink = le64_to_cpu(info->Nlinks);
 341}
 342
 343/*
 344 * Fill a cifs_fattr struct with fake inode info.
 345 *
 346 * Needed to setup cifs_fattr data for the directory which is the
 347 * junction to the new submount (ie to setup the fake directory
 348 * which represents a DFS referral or reparse mount point).
 349 */
 350static void cifs_create_junction_fattr(struct cifs_fattr *fattr,
 351				       struct super_block *sb)
 352{
 353	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 354
 355	cifs_dbg(FYI, "%s: creating fake fattr\n", __func__);
 356
 357	memset(fattr, 0, sizeof(*fattr));
 358	fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
 359	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 360	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 361	ktime_get_coarse_real_ts64(&fattr->cf_mtime);
 362	fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
 363	fattr->cf_nlink = 2;
 364	fattr->cf_flags = CIFS_FATTR_JUNCTION;
 365}
 366
 367/* Update inode with final fattr data */
 368static int update_inode_info(struct super_block *sb,
 369			     struct cifs_fattr *fattr,
 370			     struct inode **inode)
 371{
 372	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 373	int rc = 0;
 374
 375	if (!*inode) {
 376		*inode = cifs_iget(sb, fattr);
 377		if (!*inode)
 378			rc = -ENOMEM;
 379		return rc;
 380	}
 381	/* We already have inode, update it.
 382	 *
 383	 * If file type or uniqueid is different, return error.
 384	 */
 385	if (unlikely((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
 386		     CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) {
 387		CIFS_I(*inode)->time = 0; /* force reval */
 388		return -ESTALE;
 389	}
 390	return cifs_fattr_to_inode(*inode, fattr, false);
 391}
 392
 393#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 394static int
 395cifs_get_file_info_unix(struct file *filp)
 396{
 397	int rc;
 398	unsigned int xid;
 399	FILE_UNIX_BASIC_INFO find_data;
 400	struct cifs_fattr fattr = {};
 401	struct inode *inode = file_inode(filp);
 402	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 403	struct cifsFileInfo *cfile = filp->private_data;
 404	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
 405
 406	xid = get_xid();
 407
 408	if (cfile->symlink_target) {
 409		fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
 410		if (!fattr.cf_symlink_target) {
 411			rc = -ENOMEM;
 412			goto cifs_gfiunix_out;
 413		}
 414	}
 415
 416	rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
 417	if (!rc) {
 418		cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
 419	} else if (rc == -EREMOTE) {
 420		cifs_create_junction_fattr(&fattr, inode->i_sb);
 
 421	} else
 422		goto cifs_gfiunix_out;
 423
 424	rc = cifs_fattr_to_inode(inode, &fattr, false);
 425
 426cifs_gfiunix_out:
 427	free_xid(xid);
 428	return rc;
 429}
 430
 431static int cifs_get_unix_fattr(const unsigned char *full_path,
 432			       struct super_block *sb,
 433			       struct cifs_fattr *fattr,
 434			       struct inode **pinode,
 435			       const unsigned int xid)
 436{
 437	struct TCP_Server_Info *server;
 438	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 439	FILE_UNIX_BASIC_INFO find_data;
 440	struct cifs_tcon *tcon;
 441	struct tcon_link *tlink;
 442	int rc, tmprc;
 443
 444	cifs_dbg(FYI, "Getting info on %s\n", full_path);
 445
 446	tlink = cifs_sb_tlink(cifs_sb);
 447	if (IS_ERR(tlink))
 448		return PTR_ERR(tlink);
 449	tcon = tlink_tcon(tlink);
 450	server = tcon->ses->server;
 451
 452	/* could have done a find first instead but this returns more info */
 453	rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
 454				  cifs_sb->local_nls, cifs_remap(cifs_sb));
 455	cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc);
 456	cifs_put_tlink(tlink);
 457
 458	if (!rc) {
 459		cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb);
 460	} else if (rc == -EREMOTE) {
 461		cifs_create_junction_fattr(fattr, sb);
 462		rc = 0;
 463	} else {
 464		return rc;
 465	}
 466
 467	if (!*pinode)
 468		cifs_fill_uniqueid(sb, fattr);
 469
 470	/* check for Minshall+French symlinks */
 471	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
 472		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
 473		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
 474	}
 475
 476	if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) {
 477		if (!server->ops->query_symlink)
 478			return -EOPNOTSUPP;
 479		rc = server->ops->query_symlink(xid, tcon,
 480						cifs_sb, full_path,
 481						&fattr->cf_symlink_target);
 482		cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc);
 483	}
 484	return rc;
 485}
 486
 487int cifs_get_inode_info_unix(struct inode **pinode,
 488			     const unsigned char *full_path,
 489			     struct super_block *sb, unsigned int xid)
 490{
 491	struct cifs_fattr fattr = {};
 492	int rc;
 493
 494	rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid);
 495	if (rc)
 496		goto out;
 497
 498	rc = update_inode_info(sb, &fattr, pinode);
 499out:
 500	kfree(fattr.cf_symlink_target);
 501	return rc;
 502}
 503#else
 504static inline int cifs_get_unix_fattr(const unsigned char *full_path,
 505				      struct super_block *sb,
 506				      struct cifs_fattr *fattr,
 507				      struct inode **pinode,
 508				      const unsigned int xid)
 509{
 510	return -EOPNOTSUPP;
 511}
 512
 513int cifs_get_inode_info_unix(struct inode **pinode,
 514			     const unsigned char *full_path,
 515			     struct super_block *sb, unsigned int xid)
 516{
 517	return -EOPNOTSUPP;
 518}
 519#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
 520
 521static int
 522cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
 523	      struct cifs_sb_info *cifs_sb, unsigned int xid)
 524{
 525	int rc;
 526	__u32 oplock;
 527	struct tcon_link *tlink;
 528	struct cifs_tcon *tcon;
 529	struct cifs_fid fid;
 530	struct cifs_open_parms oparms;
 531	struct cifs_io_parms io_parms = {0};
 532	char *symlink_buf_utf16;
 533	unsigned int symlink_len_utf16;
 534	char buf[24];
 535	unsigned int bytes_read;
 536	char *pbuf;
 537	int buf_type = CIFS_NO_BUFFER;
 538
 539	pbuf = buf;
 540
 541	fattr->cf_mode &= ~S_IFMT;
 542
 543	if (fattr->cf_eof == 0) {
 544		cifs_dbg(FYI, "Fifo\n");
 545		fattr->cf_mode |= S_IFIFO;
 546		fattr->cf_dtype = DT_FIFO;
 547		return 0;
 548	} else if (fattr->cf_eof > 1 && fattr->cf_eof < 8) {
 549		fattr->cf_mode |= S_IFREG;
 550		fattr->cf_dtype = DT_REG;
 551		return -EINVAL;	 /* EOPNOTSUPP? */
 552	}
 553
 554	tlink = cifs_sb_tlink(cifs_sb);
 555	if (IS_ERR(tlink))
 556		return PTR_ERR(tlink);
 557	tcon = tlink_tcon(tlink);
 558
 559	oparms = (struct cifs_open_parms) {
 560		.tcon = tcon,
 561		.cifs_sb = cifs_sb,
 562		.desired_access = GENERIC_READ,
 563		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
 564		.disposition = FILE_OPEN,
 565		.path = path,
 566		.fid = &fid,
 567	};
 568
 569	if (tcon->ses->server->oplocks)
 570		oplock = REQ_OPLOCK;
 571	else
 572		oplock = 0;
 573	rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
 574	if (rc) {
 575		cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
 576		cifs_put_tlink(tlink);
 577		return rc;
 578	}
 579
 580	/* Read header */
 581	io_parms.netfid = fid.netfid;
 582	io_parms.pid = current->tgid;
 583	io_parms.tcon = tcon;
 584	io_parms.offset = 0;
 585	io_parms.length = 24;
 586
 587	rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
 588					&bytes_read, &pbuf, &buf_type);
 589	if ((rc == 0) && (bytes_read >= 8)) {
 590		if (memcmp("IntxBLK\0", pbuf, 8) == 0) {
 591			cifs_dbg(FYI, "Block device\n");
 592			fattr->cf_mode |= S_IFBLK;
 593			fattr->cf_dtype = DT_BLK;
 594			if (bytes_read == 24) {
 595				/* we have enough to decode dev num */
 596				__u64 mjr; /* major */
 597				__u64 mnr; /* minor */
 598				mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
 599				mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
 600				fattr->cf_rdev = MKDEV(mjr, mnr);
 601			} else if (bytes_read == 16) {
 602				/*
 603				 * Windows NFS server before Windows Server 2012
 604				 * stores major and minor number in SFU-modified
 605				 * style, just as 32-bit numbers. Recognize it.
 606				 */
 607				__u32 mjr; /* major */
 608				__u32 mnr; /* minor */
 609				mjr = le32_to_cpu(*(__le32 *)(pbuf+8));
 610				mnr = le32_to_cpu(*(__le32 *)(pbuf+12));
 611				fattr->cf_rdev = MKDEV(mjr, mnr);
 612			}
 613		} else if (memcmp("IntxCHR\0", pbuf, 8) == 0) {
 614			cifs_dbg(FYI, "Char device\n");
 615			fattr->cf_mode |= S_IFCHR;
 616			fattr->cf_dtype = DT_CHR;
 617			if (bytes_read == 24) {
 618				/* we have enough to decode dev num */
 619				__u64 mjr; /* major */
 620				__u64 mnr; /* minor */
 621				mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
 622				mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
 623				fattr->cf_rdev = MKDEV(mjr, mnr);
 624			} else if (bytes_read == 16) {
 625				/*
 626				 * Windows NFS server before Windows Server 2012
 627				 * stores major and minor number in SFU-modified
 628				 * style, just as 32-bit numbers. Recognize it.
 629				 */
 630				__u32 mjr; /* major */
 631				__u32 mnr; /* minor */
 632				mjr = le32_to_cpu(*(__le32 *)(pbuf+8));
 633				mnr = le32_to_cpu(*(__le32 *)(pbuf+12));
 634				fattr->cf_rdev = MKDEV(mjr, mnr);
 635			}
 636		} else if (memcmp("LnxSOCK", pbuf, 8) == 0) {
 637			cifs_dbg(FYI, "Socket\n");
 638			fattr->cf_mode |= S_IFSOCK;
 639			fattr->cf_dtype = DT_SOCK;
 640		} else if (memcmp("IntxLNK\1", pbuf, 8) == 0) {
 641			cifs_dbg(FYI, "Symlink\n");
 642			fattr->cf_mode |= S_IFLNK;
 643			fattr->cf_dtype = DT_LNK;
 644			if ((fattr->cf_eof > 8) && (fattr->cf_eof % 2 == 0)) {
 645				symlink_buf_utf16 = kmalloc(fattr->cf_eof-8 + 1, GFP_KERNEL);
 646				if (symlink_buf_utf16) {
 647					io_parms.offset = 8;
 648					io_parms.length = fattr->cf_eof-8 + 1;
 649					buf_type = CIFS_NO_BUFFER;
 650					rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
 651									       &symlink_len_utf16,
 652									       &symlink_buf_utf16,
 653									       &buf_type);
 654					/*
 655					 * Check that read buffer has valid length and does not
 656					 * contain UTF-16 null codepoint (via UniStrnlen() call)
 657					 * because Linux cannot process symlink with null byte.
 658					 */
 659					if ((rc == 0) &&
 660					    (symlink_len_utf16 > 0) &&
 661					    (symlink_len_utf16 < fattr->cf_eof-8 + 1) &&
 662					    (symlink_len_utf16 % 2 == 0) &&
 663					    (UniStrnlen((wchar_t *)symlink_buf_utf16, symlink_len_utf16/2) == symlink_len_utf16/2)) {
 664						fattr->cf_symlink_target =
 665							cifs_strndup_from_utf16(symlink_buf_utf16,
 666										symlink_len_utf16,
 667										true,
 668										cifs_sb->local_nls);
 669						if (!fattr->cf_symlink_target)
 670							rc = -ENOMEM;
 671					}
 672					kfree(symlink_buf_utf16);
 673				} else {
 674					rc = -ENOMEM;
 675				}
 676			}
 677		} else if (memcmp("LnxFIFO", pbuf, 8) == 0) {
 678			cifs_dbg(FYI, "FIFO\n");
 679			fattr->cf_mode |= S_IFIFO;
 680			fattr->cf_dtype = DT_FIFO;
 681		} else {
 682			fattr->cf_mode |= S_IFREG; /* file? */
 683			fattr->cf_dtype = DT_REG;
 684			rc = -EOPNOTSUPP;
 685		}
 686	} else if ((rc == 0) && (bytes_read == 1) && (pbuf[0] == '\0')) {
 687		cifs_dbg(FYI, "Socket\n");
 688		fattr->cf_mode |= S_IFSOCK;
 689		fattr->cf_dtype = DT_SOCK;
 690	} else {
 691		fattr->cf_mode |= S_IFREG; /* then it is a file */
 692		fattr->cf_dtype = DT_REG;
 693		rc = -EOPNOTSUPP; /* or some unknown SFU type */
 694	}
 695
 696	tcon->ses->server->ops->close(xid, tcon, &fid);
 697	cifs_put_tlink(tlink);
 698	return rc;
 699}
 700
 701#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID)  /* SETFILEBITS valid bits */
 702
 703/*
 704 * Fetch mode bits as provided by SFU.
 705 *
 706 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
 707 */
 708static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
 709			 struct cifs_sb_info *cifs_sb, unsigned int xid)
 710{
 711#ifdef CONFIG_CIFS_XATTR
 712	ssize_t rc;
 713	char ea_value[4];
 714	__u32 mode;
 715	struct tcon_link *tlink;
 716	struct cifs_tcon *tcon;
 717
 718	tlink = cifs_sb_tlink(cifs_sb);
 719	if (IS_ERR(tlink))
 720		return PTR_ERR(tlink);
 721	tcon = tlink_tcon(tlink);
 722
 723	if (tcon->ses->server->ops->query_all_EAs == NULL) {
 724		cifs_put_tlink(tlink);
 725		return -EOPNOTSUPP;
 726	}
 727
 728	rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
 729			"SETFILEBITS", ea_value, 4 /* size of buf */,
 730			cifs_sb);
 731	cifs_put_tlink(tlink);
 732	if (rc < 0)
 733		return (int)rc;
 734	else if (rc > 3) {
 735		mode = le32_to_cpu(*((__le32 *)ea_value));
 736		fattr->cf_mode &= ~SFBITS_MASK;
 737		cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
 738			 mode, fattr->cf_mode);
 739		fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
 740		cifs_dbg(FYI, "special mode bits 0%o\n", mode);
 741	}
 742
 743	return 0;
 744#else
 745	return -EOPNOTSUPP;
 746#endif
 747}
 748
 749#define POSIX_TYPE_FILE    0
 750#define POSIX_TYPE_DIR     1
 751#define POSIX_TYPE_SYMLINK 2
 752#define POSIX_TYPE_CHARDEV 3
 753#define POSIX_TYPE_BLKDEV  4
 754#define POSIX_TYPE_FIFO    5
 755#define POSIX_TYPE_SOCKET  6
 756
 757#define POSIX_X_OTH      0000001
 758#define POSIX_W_OTH      0000002
 759#define POSIX_R_OTH      0000004
 760#define POSIX_X_GRP      0000010
 761#define POSIX_W_GRP      0000020
 762#define POSIX_R_GRP      0000040
 763#define POSIX_X_USR      0000100
 764#define POSIX_W_USR      0000200
 765#define POSIX_R_USR      0000400
 766#define POSIX_STICKY     0001000
 767#define POSIX_SET_GID    0002000
 768#define POSIX_SET_UID    0004000
 769
 770#define POSIX_OTH_MASK      0000007
 771#define POSIX_GRP_MASK      0000070
 772#define POSIX_USR_MASK      0000700
 773#define POSIX_PERM_MASK     0000777
 774#define POSIX_FILETYPE_MASK 0070000
 775
 776#define POSIX_FILETYPE_SHIFT 12
 777
 778static u32 wire_perms_to_posix(u32 wire)
 779{
 780	u32 mode = 0;
 781
 782	mode |= (wire & POSIX_X_OTH) ? S_IXOTH : 0;
 783	mode |= (wire & POSIX_W_OTH) ? S_IWOTH : 0;
 784	mode |= (wire & POSIX_R_OTH) ? S_IROTH : 0;
 785	mode |= (wire & POSIX_X_GRP) ? S_IXGRP : 0;
 786	mode |= (wire & POSIX_W_GRP) ? S_IWGRP : 0;
 787	mode |= (wire & POSIX_R_GRP) ? S_IRGRP : 0;
 788	mode |= (wire & POSIX_X_USR) ? S_IXUSR : 0;
 789	mode |= (wire & POSIX_W_USR) ? S_IWUSR : 0;
 790	mode |= (wire & POSIX_R_USR) ? S_IRUSR : 0;
 791	mode |= (wire & POSIX_STICKY) ? S_ISVTX : 0;
 792	mode |= (wire & POSIX_SET_GID) ? S_ISGID : 0;
 793	mode |= (wire & POSIX_SET_UID) ? S_ISUID : 0;
 794
 795	return mode;
 796}
 797
 798static u32 posix_filetypes[] = {
 799	S_IFREG,
 800	S_IFDIR,
 801	S_IFLNK,
 802	S_IFCHR,
 803	S_IFBLK,
 804	S_IFIFO,
 805	S_IFSOCK
 806};
 807
 808static u32 wire_filetype_to_posix(u32 wire_type)
 809{
 810	if (wire_type >= ARRAY_SIZE(posix_filetypes)) {
 811		pr_warn("Unexpected type %u", wire_type);
 812		return 0;
 813	}
 814	return posix_filetypes[wire_type];
 815}
 816
 817umode_t wire_mode_to_posix(u32 wire, bool is_dir)
 818{
 819	u32 wire_type;
 820	u32 mode;
 821
 822	wire_type = (wire & POSIX_FILETYPE_MASK) >> POSIX_FILETYPE_SHIFT;
 823	/* older servers do not set POSIX file type in the mode field in the response */
 824	if ((wire_type == 0) && is_dir)
 825		mode = wire_perms_to_posix(wire) | S_IFDIR;
 826	else
 827		mode = (wire_perms_to_posix(wire) | wire_filetype_to_posix(wire_type));
 828	return (umode_t)mode;
 829}
 830
 831/* Fill a cifs_fattr struct with info from POSIX info struct */
 832static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
 833				       struct cifs_open_info_data *data,
 834				       struct super_block *sb)
 835{
 836	struct smb311_posix_qinfo *info = &data->posix_fi;
 837	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 838	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 839
 840	memset(fattr, 0, sizeof(*fattr));
 841
 842	/* no fattr->flags to set */
 843	fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
 844	fattr->cf_uniqueid = le64_to_cpu(info->Inode);
 845
 846	if (info->LastAccessTime)
 847		fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 848	else
 849		ktime_get_coarse_real_ts64(&fattr->cf_atime);
 850
 851	fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
 852	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 853
 854	if (data->adjust_tz) {
 855		fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
 856		fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
 857	}
 858
 859	/*
 860	 * The srv fs device id is overridden on network mount so setting
 861	 * @fattr->cf_rdev isn't needed here.
 862	 */
 863	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 864	fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
 865	fattr->cf_createtime = le64_to_cpu(info->CreationTime);
 866	fattr->cf_nlink = le32_to_cpu(info->HardLinks);
 867	fattr->cf_mode = wire_mode_to_posix(le32_to_cpu(info->Mode),
 868					    fattr->cf_cifsattrs & ATTR_DIRECTORY);
 869
 870	if (cifs_open_data_reparse(data) &&
 871	    cifs_reparse_point_to_fattr(cifs_sb, fattr, data))
 872		goto out_reparse;
 873
 874	fattr->cf_dtype = S_DT(fattr->cf_mode);
 
 
 
 
 
 
 
 875
 876out_reparse:
 877	if (S_ISLNK(fattr->cf_mode)) {
 878		if (likely(data->symlink_target))
 879			fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
 880		fattr->cf_symlink_target = data->symlink_target;
 881		data->symlink_target = NULL;
 882	}
 883	sid_to_id(cifs_sb, &data->posix_owner, fattr, SIDOWNER);
 884	sid_to_id(cifs_sb, &data->posix_group, fattr, SIDGROUP);
 885
 886	cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
 887		fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
 888}
 889
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 890static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
 891				    struct cifs_open_info_data *data,
 892				    struct super_block *sb)
 893{
 894	struct smb2_file_all_info *info = &data->fi;
 895	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
 896	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 897
 898	memset(fattr, 0, sizeof(*fattr));
 899	fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
 900	if (info->DeletePending)
 901		fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
 902
 903	if (info->LastAccessTime)
 904		fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
 905	else
 906		ktime_get_coarse_real_ts64(&fattr->cf_atime);
 907
 908	fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
 909	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
 910
 911	if (data->adjust_tz) {
 912		fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
 913		fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
 914	}
 915
 916	fattr->cf_eof = le64_to_cpu(info->EndOfFile);
 917	fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
 918	fattr->cf_createtime = le64_to_cpu(info->CreationTime);
 919	fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
 920	fattr->cf_uid = cifs_sb->ctx->linux_uid;
 921	fattr->cf_gid = cifs_sb->ctx->linux_gid;
 922
 923	fattr->cf_mode = cifs_sb->ctx->file_mode;
 924	if (cifs_open_data_reparse(data) &&
 925	    cifs_reparse_point_to_fattr(cifs_sb, fattr, data))
 926		goto out_reparse;
 927
 928	if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
 929		fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
 930		fattr->cf_dtype = DT_DIR;
 931		/*
 932		 * Server can return wrong NumberOfLinks value for directories
 933		 * when Unix extensions are disabled - fake it.
 934		 */
 935		if (!tcon->unix_ext)
 936			fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
 937	} else {
 938		fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
 939		fattr->cf_dtype = DT_REG;
 940
 
 
 
 
 941		/*
 942		 * Don't accept zero nlink from non-unix servers unless
 943		 * delete is pending.  Instead mark it as unknown.
 944		 */
 945		if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
 946		    !info->DeletePending) {
 947			cifs_dbg(VFS, "bogus file nlink value %u\n",
 948				 fattr->cf_nlink);
 949			fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
 950		}
 951	}
 952
 953	/* clear write bits if ATTR_READONLY is set */
 954	if (fattr->cf_cifsattrs & ATTR_READONLY)
 955		fattr->cf_mode &= ~(S_IWUGO);
 956
 957out_reparse:
 958	if (S_ISLNK(fattr->cf_mode)) {
 959		if (likely(data->symlink_target))
 960			fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
 961		fattr->cf_symlink_target = data->symlink_target;
 962		data->symlink_target = NULL;
 963	}
 
 
 
 964}
 965
 966static int
 967cifs_get_file_info(struct file *filp)
 968{
 969	int rc;
 970	unsigned int xid;
 971	struct cifs_open_info_data data = {};
 972	struct cifs_fattr fattr;
 973	struct inode *inode = file_inode(filp);
 974	struct cifsFileInfo *cfile = filp->private_data;
 975	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
 976	struct TCP_Server_Info *server = tcon->ses->server;
 977	struct dentry *dentry = filp->f_path.dentry;
 978	void *page = alloc_dentry_path();
 979	const unsigned char *path;
 980
 981	if (!server->ops->query_file_info) {
 982		free_dentry_path(page);
 983		return -ENOSYS;
 984	}
 985
 986	xid = get_xid();
 987	rc = server->ops->query_file_info(xid, tcon, cfile, &data);
 988	switch (rc) {
 989	case 0:
 990		/* TODO: add support to query reparse tag */
 991		data.adjust_tz = false;
 992		if (data.symlink_target) {
 993			data.reparse_point = true;
 994			data.reparse.tag = IO_REPARSE_TAG_SYMLINK;
 995		}
 996		path = build_path_from_dentry(dentry, page);
 997		if (IS_ERR(path)) {
 998			rc = PTR_ERR(path);
 999			goto cgfi_exit;
1000		}
1001		cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
1002		if (fattr.cf_flags & CIFS_FATTR_DELETE_PENDING)
1003			cifs_mark_open_handles_for_deleted_file(inode, path);
1004		break;
1005	case -EREMOTE:
1006		cifs_create_junction_fattr(&fattr, inode->i_sb);
 
1007		break;
1008	case -EOPNOTSUPP:
1009	case -EINVAL:
1010		/*
1011		 * FIXME: legacy server -- fall back to path-based call?
1012		 * for now, just skip revalidating and mark inode for
1013		 * immediate reval.
1014		 */
1015		rc = 0;
1016		CIFS_I(inode)->time = 0;
1017		goto cgfi_exit;
1018	default:
1019		goto cgfi_exit;
1020	}
1021
1022	/*
1023	 * don't bother with SFU junk here -- just mark inode as needing
1024	 * revalidation.
1025	 */
1026	fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
1027	fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
1028	/* if filetype is different, return error */
1029	rc = cifs_fattr_to_inode(inode, &fattr, false);
1030cgfi_exit:
1031	cifs_free_open_info(&data);
1032	free_dentry_path(page);
1033	free_xid(xid);
1034	return rc;
1035}
1036
1037/* Simple function to return a 64 bit hash of string.  Rarely called */
1038static __u64 simple_hashstr(const char *str)
1039{
1040	const __u64 hash_mult =  1125899906842597ULL; /* a big enough prime */
1041	__u64 hash = 0;
1042
1043	while (*str)
1044		hash = (hash + (__u64) *str++) * hash_mult;
1045
1046	return hash;
1047}
1048
1049#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1050/**
1051 * cifs_backup_query_path_info - SMB1 fallback code to get ino
1052 *
1053 * Fallback code to get file metadata when we don't have access to
1054 * full_path (EACCES) and have backup creds.
1055 *
1056 * @xid:	transaction id used to identify original request in logs
1057 * @tcon:	information about the server share we have mounted
1058 * @sb:	the superblock stores info such as disk space available
1059 * @full_path:	name of the file we are getting the metadata for
1060 * @resp_buf:	will be set to cifs resp buf and needs to be freed with
1061 * 		cifs_buf_release() when done with @data
1062 * @data:	will be set to search info result buffer
1063 */
1064static int
1065cifs_backup_query_path_info(int xid,
1066			    struct cifs_tcon *tcon,
1067			    struct super_block *sb,
1068			    const char *full_path,
1069			    void **resp_buf,
1070			    FILE_ALL_INFO **data)
1071{
1072	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1073	struct cifs_search_info info = {0};
1074	u16 flags;
1075	int rc;
1076
1077	*resp_buf = NULL;
1078	info.endOfSearch = false;
1079	if (tcon->unix_ext)
1080		info.info_level = SMB_FIND_FILE_UNIX;
1081	else if ((tcon->ses->capabilities &
1082		  tcon->ses->server->vals->cap_nt_find) == 0)
1083		info.info_level = SMB_FIND_FILE_INFO_STANDARD;
1084	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
1085		info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
1086	else /* no srvino useful for fallback to some netapp */
1087		info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
1088
1089	flags = CIFS_SEARCH_CLOSE_ALWAYS |
1090		CIFS_SEARCH_CLOSE_AT_END |
1091		CIFS_SEARCH_BACKUP_SEARCH;
1092
1093	rc = CIFSFindFirst(xid, tcon, full_path,
1094			   cifs_sb, NULL, flags, &info, false);
1095	if (rc)
1096		return rc;
1097
1098	*resp_buf = (void *)info.ntwrk_buf_start;
1099	*data = (FILE_ALL_INFO *)info.srch_entries_start;
1100	return 0;
1101}
1102#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1103
1104static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
1105			       struct inode **inode, const char *full_path,
1106			       struct cifs_open_info_data *data, struct cifs_fattr *fattr)
1107{
1108	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1109	struct TCP_Server_Info *server = tcon->ses->server;
1110	int rc;
1111
1112	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
1113		if (*inode)
1114			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1115		else
1116			fattr->cf_uniqueid = iunique(sb, ROOT_I);
1117		return;
1118	}
1119
1120	/*
1121	 * If we have an inode pass a NULL tcon to ensure we don't
1122	 * make a round trip to the server. This only works for SMB2+.
1123	 */
1124	rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
1125				       &fattr->cf_uniqueid, data);
1126	if (rc) {
1127		/*
1128		 * If that fails reuse existing ino or generate one
1129		 * and disable server ones
1130		 */
1131		if (*inode)
1132			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1133		else {
1134			fattr->cf_uniqueid = iunique(sb, ROOT_I);
1135			cifs_autodisable_serverino(cifs_sb);
1136		}
1137		return;
1138	}
1139
1140	/* If no errors, check for zero root inode (invalid) */
1141	if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
1142		cifs_dbg(FYI, "Invalid (0) inodenum\n");
1143		if (*inode) {
1144			/* reuse */
1145			fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1146		} else {
1147			/* make an ino by hashing the UNC */
1148			fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1149			fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1150		}
1151	}
1152}
1153
1154static inline bool is_inode_cache_good(struct inode *ino)
1155{
1156	return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
1157}
1158
1159static int reparse_info_to_fattr(struct cifs_open_info_data *data,
1160				 struct super_block *sb,
1161				 const unsigned int xid,
1162				 struct cifs_tcon *tcon,
1163				 const char *full_path,
1164				 struct cifs_fattr *fattr)
1165{
1166	struct TCP_Server_Info *server = tcon->ses->server;
1167	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1168	struct kvec rsp_iov, *iov = NULL;
1169	int rsp_buftype = CIFS_NO_BUFFER;
1170	u32 tag = data->reparse.tag;
1171	int rc = 0;
1172
1173	if (!tag && server->ops->query_reparse_point) {
1174		rc = server->ops->query_reparse_point(xid, tcon, cifs_sb,
1175						      full_path, &tag,
1176						      &rsp_iov, &rsp_buftype);
1177		if (!rc)
1178			iov = &rsp_iov;
1179	} else if (data->reparse.io.buftype != CIFS_NO_BUFFER &&
1180		   data->reparse.io.iov.iov_base) {
1181		iov = &data->reparse.io.iov;
1182	}
1183
1184	rc = -EOPNOTSUPP;
1185	data->reparse.tag = tag;
1186	if (!data->reparse.tag) {
1187		if (server->ops->query_symlink) {
1188			rc = server->ops->query_symlink(xid, tcon,
1189							cifs_sb, full_path,
1190							&data->symlink_target);
1191		}
1192		if (rc == -EOPNOTSUPP)
1193			data->reparse.tag = IO_REPARSE_TAG_INTERNAL;
1194	}
1195
1196	switch (data->reparse.tag) {
1197	case 0: /* SMB1 symlink */
1198		break;
1199	case IO_REPARSE_TAG_INTERNAL:
1200		rc = 0;
1201		if (le32_to_cpu(data->fi.Attributes) & ATTR_DIRECTORY) {
1202			cifs_create_junction_fattr(fattr, sb);
1203			goto out;
1204		}
1205		break;
1206	case IO_REPARSE_TAG_MOUNT_POINT:
1207		cifs_create_junction_fattr(fattr, sb);
1208		rc = 0;
1209		goto out;
1210	default:
1211		/* Check for cached reparse point data */
1212		if (data->symlink_target || data->reparse.buf) {
1213			rc = 0;
1214		} else if (iov && server->ops->parse_reparse_point) {
1215			rc = server->ops->parse_reparse_point(cifs_sb,
1216							      full_path,
1217							      iov, data);
1218		}
1219		break;
1220	}
1221
1222	if (tcon->posix_extensions)
1223		smb311_posix_info_to_fattr(fattr, data, sb);
1224	else
1225		cifs_open_info_to_fattr(fattr, data, sb);
1226out:
1227	fattr->cf_cifstag = data->reparse.tag;
1228	free_rsp_buf(rsp_buftype, rsp_iov.iov_base);
1229	return rc;
1230}
1231
1232static int cifs_get_fattr(struct cifs_open_info_data *data,
1233			  struct super_block *sb, int xid,
1234			  const struct cifs_fid *fid,
1235			  struct cifs_fattr *fattr,
1236			  struct inode **inode,
1237			  const char *full_path)
1238{
1239	struct cifs_open_info_data tmp_data = {};
1240	struct cifs_tcon *tcon;
1241	struct TCP_Server_Info *server;
1242	struct tcon_link *tlink;
1243	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1244	void *smb1_backup_rsp_buf = NULL;
1245	int rc = 0;
1246	int tmprc = 0;
1247
1248	tlink = cifs_sb_tlink(cifs_sb);
1249	if (IS_ERR(tlink))
1250		return PTR_ERR(tlink);
1251	tcon = tlink_tcon(tlink);
1252	server = tcon->ses->server;
1253
1254	/*
1255	 * 1. Fetch file metadata if not provided (data)
1256	 */
1257
1258	if (!data) {
1259		rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1260						  full_path, &tmp_data);
1261		data = &tmp_data;
1262	}
1263
1264	/*
1265	 * 2. Convert it to internal cifs metadata (fattr)
1266	 */
1267
1268	switch (rc) {
1269	case 0:
1270		/*
1271		 * If the file is a reparse point, it is more complicated
1272		 * since we have to check if its reparse tag matches a known
1273		 * special file type e.g. symlink or fifo or char etc.
1274		 */
1275		if (cifs_open_data_reparse(data)) {
1276			rc = reparse_info_to_fattr(data, sb, xid, tcon,
1277						   full_path, fattr);
1278		} else {
1279			cifs_open_info_to_fattr(fattr, data, sb);
1280		}
1281		if (!rc && *inode &&
1282		    (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING))
1283			cifs_mark_open_handles_for_deleted_file(*inode, full_path);
1284		break;
1285	case -EREMOTE:
1286		/* DFS link, no metadata available on this server */
1287		cifs_create_junction_fattr(fattr, sb);
1288		rc = 0;
1289		break;
1290	case -EACCES:
1291#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1292		/*
1293		 * perm errors, try again with backup flags if possible
1294		 *
1295		 * For SMB2 and later the backup intent flag
1296		 * is already sent if needed on open and there
1297		 * is no path based FindFirst operation to use
1298		 * to retry with
1299		 */
1300		if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1301			/* for easier reading */
1302			FILE_ALL_INFO *fi;
1303			FILE_DIRECTORY_INFO *fdi;
1304			SEARCH_ID_FULL_DIR_INFO *si;
1305
1306			rc = cifs_backup_query_path_info(xid, tcon, sb,
1307							 full_path,
1308							 &smb1_backup_rsp_buf,
1309							 &fi);
1310			if (rc)
1311				goto out;
1312
1313			move_cifs_info_to_smb2(&data->fi, fi);
1314			fdi = (FILE_DIRECTORY_INFO *)fi;
1315			si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1316
1317			cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1318			fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1319			/* uniqueid set, skip get inum step */
1320			goto handle_mnt_opt;
1321		} else {
1322			/* nothing we can do, bail out */
1323			goto out;
1324		}
1325#else
1326		goto out;
1327#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1328		break;
1329	default:
1330		cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1331		goto out;
1332	}
1333
1334	/*
1335	 * 3. Get or update inode number (fattr->cf_uniqueid)
1336	 */
1337
1338	cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1339
1340	/*
1341	 * 4. Tweak fattr based on mount options
1342	 */
1343#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1344handle_mnt_opt:
1345#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1346	/* query for SFU type info if supported and needed */
1347	if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1348	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) {
1349		tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1350		if (tmprc)
1351			cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1352	}
1353
1354	/* fill in 0777 bits from ACL */
1355	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1356		rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1357				       true, full_path, fid);
1358		if (rc == -EREMOTE)
1359			rc = 0;
1360		if (rc) {
1361			cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1362				 __func__, rc);
1363			goto out;
1364		}
1365	} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1366		rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1367				       false, full_path, fid);
1368		if (rc == -EREMOTE)
1369			rc = 0;
1370		if (rc) {
1371			cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1372				 __func__, rc);
1373			goto out;
1374		}
1375	} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1376		/* fill in remaining high mode bits e.g. SUID, VTX */
 
 
1377		cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1378	else if (!(tcon->posix_extensions))
1379		/* clear write bits if ATTR_READONLY is set */
1380		if (fattr->cf_cifsattrs & ATTR_READONLY)
1381			fattr->cf_mode &= ~(S_IWUGO);
1382
1383
1384	/* check for Minshall+French symlinks */
1385	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1386		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1387		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1388	}
1389
1390out:
1391	cifs_buf_release(smb1_backup_rsp_buf);
1392	cifs_put_tlink(tlink);
1393	cifs_free_open_info(&tmp_data);
1394	return rc;
1395}
1396
1397int cifs_get_inode_info(struct inode **inode,
1398			const char *full_path,
1399			struct cifs_open_info_data *data,
1400			struct super_block *sb, int xid,
1401			const struct cifs_fid *fid)
1402{
1403	struct cifs_fattr fattr = {};
1404	int rc;
1405
1406	if (!data && is_inode_cache_good(*inode)) {
1407		cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1408		return 0;
1409	}
1410
1411	rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1412	if (rc)
1413		goto out;
1414
1415	rc = update_inode_info(sb, &fattr, inode);
1416out:
1417	kfree(fattr.cf_symlink_target);
1418	return rc;
1419}
1420
1421static int smb311_posix_get_fattr(struct cifs_open_info_data *data,
1422				  struct cifs_fattr *fattr,
1423				  const char *full_path,
1424				  struct super_block *sb,
1425				  const unsigned int xid)
1426{
1427	struct cifs_open_info_data tmp_data = {};
1428	struct TCP_Server_Info *server;
1429	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1430	struct cifs_tcon *tcon;
1431	struct tcon_link *tlink;
1432	int tmprc;
1433	int rc = 0;
1434
1435	tlink = cifs_sb_tlink(cifs_sb);
1436	if (IS_ERR(tlink))
1437		return PTR_ERR(tlink);
1438	tcon = tlink_tcon(tlink);
1439	server = tcon->ses->server;
1440
1441	/*
1442	 * 1. Fetch file metadata if not provided (data)
1443	 */
1444	if (!data) {
1445		rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1446						  full_path, &tmp_data);
1447		data = &tmp_data;
1448	}
1449
1450	/*
1451	 * 2. Convert it to internal cifs metadata (fattr)
1452	 */
1453
1454	switch (rc) {
1455	case 0:
1456		if (cifs_open_data_reparse(data)) {
1457			rc = reparse_info_to_fattr(data, sb, xid, tcon,
1458						   full_path, fattr);
1459		} else {
1460			smb311_posix_info_to_fattr(fattr, data, sb);
1461		}
1462		break;
1463	case -EREMOTE:
1464		/* DFS link, no metadata available on this server */
1465		cifs_create_junction_fattr(fattr, sb);
1466		rc = 0;
1467		break;
1468	case -EACCES:
1469		/*
1470		 * For SMB2 and later the backup intent flag
1471		 * is already sent if needed on open and there
1472		 * is no path based FindFirst operation to use
1473		 * to retry with so nothing we can do, bail out
1474		 */
1475		goto out;
1476	default:
1477		cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1478		goto out;
1479	}
1480
1481	/*
1482	 * 3. Tweak fattr based on mount options
1483	 */
1484	/* check for Minshall+French symlinks */
1485	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1486		tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1487		cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1488	}
1489
1490out:
1491	cifs_put_tlink(tlink);
1492	cifs_free_open_info(data);
1493	return rc;
1494}
1495
1496int smb311_posix_get_inode_info(struct inode **inode,
1497				const char *full_path,
1498				struct cifs_open_info_data *data,
1499				struct super_block *sb,
1500				const unsigned int xid)
1501{
1502	struct cifs_fattr fattr = {};
1503	int rc;
1504
1505	if (!data && is_inode_cache_good(*inode)) {
1506		cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1507		return 0;
1508	}
1509
1510	rc = smb311_posix_get_fattr(data, &fattr, full_path, sb, xid);
1511	if (rc)
1512		goto out;
1513
1514	rc = update_inode_info(sb, &fattr, inode);
1515	if (!rc && fattr.cf_flags & CIFS_FATTR_DELETE_PENDING)
1516		cifs_mark_open_handles_for_deleted_file(*inode, full_path);
1517out:
1518	kfree(fattr.cf_symlink_target);
1519	return rc;
1520}
1521
1522static const struct inode_operations cifs_ipc_inode_ops = {
1523	.lookup = cifs_lookup,
1524};
1525
1526static int
1527cifs_find_inode(struct inode *inode, void *opaque)
1528{
1529	struct cifs_fattr *fattr = opaque;
1530
1531	/* [!] The compared values must be the same in struct cifs_fscache_inode_key. */
1532
1533	/* don't match inode with different uniqueid */
1534	if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1535		return 0;
1536
1537	/* use createtime like an i_generation field */
1538	if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1539		return 0;
1540
1541	/* don't match inode of different type */
1542	if (inode_wrong_type(inode, fattr->cf_mode))
1543		return 0;
1544
1545	/* if it's not a directory or has no dentries, then flag it */
1546	if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1547		fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1548
1549	return 1;
1550}
1551
1552static int
1553cifs_init_inode(struct inode *inode, void *opaque)
1554{
1555	struct cifs_fattr *fattr = opaque;
1556
1557	CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1558	CIFS_I(inode)->createtime = fattr->cf_createtime;
1559	return 0;
1560}
1561
1562/*
1563 * walk dentry list for an inode and report whether it has aliases that
1564 * are hashed. We use this to determine if a directory inode can actually
1565 * be used.
1566 */
1567static bool
1568inode_has_hashed_dentries(struct inode *inode)
1569{
1570	struct dentry *dentry;
1571
1572	spin_lock(&inode->i_lock);
1573	hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1574		if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1575			spin_unlock(&inode->i_lock);
1576			return true;
1577		}
1578	}
1579	spin_unlock(&inode->i_lock);
1580	return false;
1581}
1582
1583/* Given fattrs, get a corresponding inode */
1584struct inode *
1585cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1586{
1587	unsigned long hash;
1588	struct inode *inode;
1589
1590retry_iget5_locked:
1591	cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1592
1593	/* hash down to 32-bits on 32-bit arch */
1594	hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1595
1596	inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1597	if (inode) {
1598		/* was there a potentially problematic inode collision? */
1599		if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1600			fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1601
1602			if (inode_has_hashed_dentries(inode)) {
1603				cifs_autodisable_serverino(CIFS_SB(sb));
1604				iput(inode);
1605				fattr->cf_uniqueid = iunique(sb, ROOT_I);
1606				goto retry_iget5_locked;
1607			}
1608		}
1609
1610		/* can't fail - see cifs_find_inode() */
1611		cifs_fattr_to_inode(inode, fattr, false);
1612		if (sb->s_flags & SB_NOATIME)
1613			inode->i_flags |= S_NOATIME | S_NOCMTIME;
1614		if (inode->i_state & I_NEW) {
1615			inode->i_ino = hash;
1616			cifs_fscache_get_inode_cookie(inode);
1617			unlock_new_inode(inode);
1618		}
1619	}
1620
1621	return inode;
1622}
1623
1624/* gets root inode */
1625struct inode *cifs_root_iget(struct super_block *sb)
1626{
1627	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1628	struct cifs_fattr fattr = {};
1629	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1630	struct inode *inode = NULL;
1631	unsigned int xid;
1632	char *path = NULL;
1633	int len;
1634	int rc;
1635
1636	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1637	    && cifs_sb->prepath) {
1638		len = strlen(cifs_sb->prepath);
1639		path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1640		if (path == NULL)
1641			return ERR_PTR(-ENOMEM);
1642		path[0] = '/';
1643		memcpy(path+1, cifs_sb->prepath, len);
1644	} else {
1645		path = kstrdup("", GFP_KERNEL);
1646		if (path == NULL)
1647			return ERR_PTR(-ENOMEM);
1648	}
1649
1650	xid = get_xid();
1651	if (tcon->unix_ext) {
1652		rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1653		/* some servers mistakenly claim POSIX support */
1654		if (rc != -EOPNOTSUPP)
1655			goto iget_root;
1656		cifs_dbg(VFS, "server does not support POSIX extensions\n");
1657		tcon->unix_ext = false;
1658	}
1659
1660	convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1661	if (tcon->posix_extensions)
1662		rc = smb311_posix_get_fattr(NULL, &fattr, path, sb, xid);
1663	else
1664		rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1665
1666iget_root:
1667	if (!rc) {
1668		if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1669			fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1670			cifs_autodisable_serverino(cifs_sb);
1671		}
1672		inode = cifs_iget(sb, &fattr);
1673	}
1674
1675	if (!inode) {
1676		inode = ERR_PTR(rc);
1677		goto out;
1678	}
1679
1680	if (!rc && fattr.cf_flags & CIFS_FATTR_DELETE_PENDING)
1681		cifs_mark_open_handles_for_deleted_file(inode, path);
1682
1683	if (rc && tcon->pipe) {
1684		cifs_dbg(FYI, "ipc connection - fake read inode\n");
1685		spin_lock(&inode->i_lock);
1686		inode->i_mode |= S_IFDIR;
1687		set_nlink(inode, 2);
1688		inode->i_op = &cifs_ipc_inode_ops;
1689		inode->i_fop = &simple_dir_operations;
1690		inode->i_uid = cifs_sb->ctx->linux_uid;
1691		inode->i_gid = cifs_sb->ctx->linux_gid;
1692		spin_unlock(&inode->i_lock);
1693	} else if (rc) {
1694		iget_failed(inode);
1695		inode = ERR_PTR(rc);
1696	}
1697
1698out:
1699	kfree(path);
1700	free_xid(xid);
1701	kfree(fattr.cf_symlink_target);
1702	return inode;
1703}
1704
1705int
1706cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1707		   const char *full_path, __u32 dosattr)
1708{
1709	bool set_time = false;
1710	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1711	struct TCP_Server_Info *server;
1712	FILE_BASIC_INFO	info_buf;
1713
1714	if (attrs == NULL)
1715		return -EINVAL;
1716
1717	server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1718	if (!server->ops->set_file_info)
1719		return -ENOSYS;
1720
1721	info_buf.Pad = 0;
1722
1723	if (attrs->ia_valid & ATTR_ATIME) {
1724		set_time = true;
1725		info_buf.LastAccessTime =
1726			cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1727	} else
1728		info_buf.LastAccessTime = 0;
1729
1730	if (attrs->ia_valid & ATTR_MTIME) {
1731		set_time = true;
1732		info_buf.LastWriteTime =
1733		    cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1734	} else
1735		info_buf.LastWriteTime = 0;
1736
1737	/*
1738	 * Samba throws this field away, but windows may actually use it.
1739	 * Do not set ctime unless other time stamps are changed explicitly
1740	 * (i.e. by utimes()) since we would then have a mix of client and
1741	 * server times.
1742	 */
1743	if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1744		cifs_dbg(FYI, "CIFS - CTIME changed\n");
1745		info_buf.ChangeTime =
1746		    cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1747	} else
1748		info_buf.ChangeTime = 0;
1749
1750	info_buf.CreationTime = 0;	/* don't change */
1751	info_buf.Attributes = cpu_to_le32(dosattr);
1752
1753	return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1754}
1755
1756#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1757/*
1758 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1759 * and rename it to a random name that hopefully won't conflict with
1760 * anything else.
1761 */
1762int
1763cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1764			   const unsigned int xid)
1765{
1766	int oplock = 0;
1767	int rc;
1768	struct cifs_fid fid;
1769	struct cifs_open_parms oparms;
1770	struct inode *inode = d_inode(dentry);
1771	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1772	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1773	struct tcon_link *tlink;
1774	struct cifs_tcon *tcon;
1775	__u32 dosattr, origattr;
1776	FILE_BASIC_INFO *info_buf = NULL;
1777
1778	tlink = cifs_sb_tlink(cifs_sb);
1779	if (IS_ERR(tlink))
1780		return PTR_ERR(tlink);
1781	tcon = tlink_tcon(tlink);
1782
1783	/*
1784	 * We cannot rename the file if the server doesn't support
1785	 * CAP_INFOLEVEL_PASSTHRU
1786	 */
1787	if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1788		rc = -EBUSY;
1789		goto out;
1790	}
1791
1792	oparms = (struct cifs_open_parms) {
1793		.tcon = tcon,
1794		.cifs_sb = cifs_sb,
1795		.desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1796		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1797		.disposition = FILE_OPEN,
1798		.path = full_path,
1799		.fid = &fid,
1800	};
1801
1802	rc = CIFS_open(xid, &oparms, &oplock, NULL);
1803	if (rc != 0)
1804		goto out;
1805
1806	origattr = cifsInode->cifsAttrs;
1807	if (origattr == 0)
1808		origattr |= ATTR_NORMAL;
1809
1810	dosattr = origattr & ~ATTR_READONLY;
1811	if (dosattr == 0)
1812		dosattr |= ATTR_NORMAL;
1813	dosattr |= ATTR_HIDDEN;
1814
1815	/* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1816	if (dosattr != origattr) {
1817		info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1818		if (info_buf == NULL) {
1819			rc = -ENOMEM;
1820			goto out_close;
1821		}
1822		info_buf->Attributes = cpu_to_le32(dosattr);
1823		rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1824					current->tgid);
1825		/* although we would like to mark the file hidden
1826 		   if that fails we will still try to rename it */
1827		if (!rc)
1828			cifsInode->cifsAttrs = dosattr;
1829		else
1830			dosattr = origattr; /* since not able to change them */
1831	}
1832
1833	/* rename the file */
1834	rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1835				   cifs_sb->local_nls,
1836				   cifs_remap(cifs_sb));
1837	if (rc != 0) {
1838		rc = -EBUSY;
1839		goto undo_setattr;
1840	}
1841
1842	/* try to set DELETE_ON_CLOSE */
1843	if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1844		rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1845					       current->tgid);
1846		/*
1847		 * some samba versions return -ENOENT when we try to set the
1848		 * file disposition here. Likely a samba bug, but work around
1849		 * it for now. This means that some cifsXXX files may hang
1850		 * around after they shouldn't.
1851		 *
1852		 * BB: remove this hack after more servers have the fix
1853		 */
1854		if (rc == -ENOENT)
1855			rc = 0;
1856		else if (rc != 0) {
1857			rc = -EBUSY;
1858			goto undo_rename;
1859		}
1860		set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1861	}
1862
1863out_close:
1864	CIFSSMBClose(xid, tcon, fid.netfid);
1865out:
1866	kfree(info_buf);
1867	cifs_put_tlink(tlink);
1868	return rc;
1869
1870	/*
1871	 * reset everything back to the original state. Don't bother
1872	 * dealing with errors here since we can't do anything about
1873	 * them anyway.
1874	 */
1875undo_rename:
1876	CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1877				cifs_sb->local_nls, cifs_remap(cifs_sb));
1878undo_setattr:
1879	if (dosattr != origattr) {
1880		info_buf->Attributes = cpu_to_le32(origattr);
1881		if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1882					current->tgid))
1883			cifsInode->cifsAttrs = origattr;
1884	}
1885
1886	goto out_close;
1887}
1888#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1889
1890/* copied from fs/nfs/dir.c with small changes */
1891static void
1892cifs_drop_nlink(struct inode *inode)
1893{
1894	spin_lock(&inode->i_lock);
1895	if (inode->i_nlink > 0)
1896		drop_nlink(inode);
1897	spin_unlock(&inode->i_lock);
1898}
1899
1900/*
1901 * If d_inode(dentry) is null (usually meaning the cached dentry
1902 * is a negative dentry) then we would attempt a standard SMB delete, but
1903 * if that fails we can not attempt the fall back mechanisms on EACCES
1904 * but will return the EACCES to the caller. Note that the VFS does not call
1905 * unlink on negative dentries currently.
1906 */
1907int cifs_unlink(struct inode *dir, struct dentry *dentry)
1908{
1909	int rc = 0;
1910	unsigned int xid;
1911	const char *full_path;
1912	void *page;
1913	struct inode *inode = d_inode(dentry);
1914	struct cifsInodeInfo *cifs_inode;
1915	struct super_block *sb = dir->i_sb;
1916	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1917	struct tcon_link *tlink;
1918	struct cifs_tcon *tcon;
1919	struct TCP_Server_Info *server;
1920	struct iattr *attrs = NULL;
1921	__u32 dosattr = 0, origattr = 0;
1922
1923	cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1924
1925	if (unlikely(cifs_forced_shutdown(cifs_sb)))
1926		return -EIO;
1927
1928	tlink = cifs_sb_tlink(cifs_sb);
1929	if (IS_ERR(tlink))
1930		return PTR_ERR(tlink);
1931	tcon = tlink_tcon(tlink);
1932	server = tcon->ses->server;
1933
1934	xid = get_xid();
1935	page = alloc_dentry_path();
1936
1937	if (tcon->nodelete) {
1938		rc = -EACCES;
1939		goto unlink_out;
1940	}
1941
1942	/* Unlink can be called from rename so we can not take the
1943	 * sb->s_vfs_rename_mutex here */
1944	full_path = build_path_from_dentry(dentry, page);
1945	if (IS_ERR(full_path)) {
1946		rc = PTR_ERR(full_path);
1947		goto unlink_out;
1948	}
1949
1950	netfs_wait_for_outstanding_io(inode);
1951	cifs_close_deferred_file_under_dentry(tcon, full_path);
1952#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1953	if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1954				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1955		rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1956			SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1957			cifs_remap(cifs_sb));
1958		cifs_dbg(FYI, "posix del rc %d\n", rc);
1959		if ((rc == 0) || (rc == -ENOENT))
1960			goto psx_del_no_retry;
1961	}
1962#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1963
1964retry_std_delete:
1965	if (!server->ops->unlink) {
1966		rc = -ENOSYS;
1967		goto psx_del_no_retry;
1968	}
1969
1970	rc = server->ops->unlink(xid, tcon, full_path, cifs_sb, dentry);
1971
1972psx_del_no_retry:
1973	if (!rc) {
1974		if (inode) {
1975			cifs_mark_open_handles_for_deleted_file(inode, full_path);
1976			cifs_drop_nlink(inode);
1977		}
1978	} else if (rc == -ENOENT) {
1979		d_drop(dentry);
1980	} else if (rc == -EBUSY) {
1981		if (server->ops->rename_pending_delete) {
1982			rc = server->ops->rename_pending_delete(full_path,
1983								dentry, xid);
1984			if (rc == 0) {
1985				cifs_mark_open_handles_for_deleted_file(inode, full_path);
1986				cifs_drop_nlink(inode);
1987			}
1988		}
1989	} else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1990		attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1991		if (attrs == NULL) {
1992			rc = -ENOMEM;
1993			goto out_reval;
1994		}
1995
1996		/* try to reset dos attributes */
1997		cifs_inode = CIFS_I(inode);
1998		origattr = cifs_inode->cifsAttrs;
1999		if (origattr == 0)
2000			origattr |= ATTR_NORMAL;
2001		dosattr = origattr & ~ATTR_READONLY;
2002		if (dosattr == 0)
2003			dosattr |= ATTR_NORMAL;
2004		dosattr |= ATTR_HIDDEN;
2005
2006		rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2007		if (rc != 0)
2008			goto out_reval;
2009
2010		goto retry_std_delete;
2011	}
2012
2013	/* undo the setattr if we errored out and it's needed */
2014	if (rc != 0 && dosattr != 0)
2015		cifs_set_file_info(inode, attrs, xid, full_path, origattr);
2016
2017out_reval:
2018	if (inode) {
2019		cifs_inode = CIFS_I(inode);
2020		cifs_inode->time = 0;	/* will force revalidate to get info
2021					   when needed */
2022		inode_set_ctime_current(inode);
2023	}
2024	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
2025	cifs_inode = CIFS_I(dir);
2026	CIFS_I(dir)->time = 0;	/* force revalidate of dir as well */
2027unlink_out:
2028	free_dentry_path(page);
2029	kfree(attrs);
2030	free_xid(xid);
2031	cifs_put_tlink(tlink);
2032	return rc;
2033}
2034
2035static int
2036cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
2037		 const char *full_path, struct cifs_sb_info *cifs_sb,
2038		 struct cifs_tcon *tcon, const unsigned int xid)
2039{
2040	int rc = 0;
2041	struct inode *inode = NULL;
2042
2043	if (tcon->posix_extensions) {
2044		rc = smb311_posix_get_inode_info(&inode, full_path,
2045						 NULL, parent->i_sb, xid);
2046#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2047	} else if (tcon->unix_ext) {
2048		rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
2049					      xid);
2050#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2051	} else {
2052		rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
2053					 xid, NULL);
2054	}
2055
2056	if (rc)
2057		return rc;
2058
2059	if (!S_ISDIR(inode->i_mode)) {
2060		/*
2061		 * mkdir succeeded, but another client has managed to remove the
2062		 * sucker and replace it with non-directory.  Return success,
2063		 * but don't leave the child in dcache.
2064		 */
2065		 iput(inode);
2066		 d_drop(dentry);
2067		 return 0;
2068	}
2069	/*
2070	 * setting nlink not necessary except in cases where we failed to get it
2071	 * from the server or was set bogus. Also, since this is a brand new
2072	 * inode, no need to grab the i_lock before setting the i_nlink.
2073	 */
2074	if (inode->i_nlink < 2)
2075		set_nlink(inode, 2);
2076	mode &= ~current_umask();
2077	/* must turn on setgid bit if parent dir has it */
2078	if (parent->i_mode & S_ISGID)
2079		mode |= S_ISGID;
2080
2081#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2082	if (tcon->unix_ext) {
2083		struct cifs_unix_set_info_args args = {
2084			.mode	= mode,
2085			.ctime	= NO_CHANGE_64,
2086			.atime	= NO_CHANGE_64,
2087			.mtime	= NO_CHANGE_64,
2088			.device	= 0,
2089		};
2090		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
2091			args.uid = current_fsuid();
2092			if (parent->i_mode & S_ISGID)
2093				args.gid = parent->i_gid;
2094			else
2095				args.gid = current_fsgid();
2096		} else {
2097			args.uid = INVALID_UID; /* no change */
2098			args.gid = INVALID_GID; /* no change */
2099		}
2100		CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
2101				       cifs_sb->local_nls,
2102				       cifs_remap(cifs_sb));
2103	} else {
2104#else
2105	{
2106#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2107		struct TCP_Server_Info *server = tcon->ses->server;
2108		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2109		    (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
2110			server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
2111						   tcon, xid);
2112		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
2113			inode->i_mode = (mode | S_IFDIR);
2114
2115		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
2116			inode->i_uid = current_fsuid();
2117			if (inode->i_mode & S_ISGID)
2118				inode->i_gid = parent->i_gid;
2119			else
2120				inode->i_gid = current_fsgid();
2121		}
2122	}
2123	d_instantiate(dentry, inode);
2124	return 0;
2125}
2126
2127#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2128static int
2129cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
2130		 const char *full_path, struct cifs_sb_info *cifs_sb,
2131		 struct cifs_tcon *tcon, const unsigned int xid)
2132{
2133	int rc = 0;
2134	u32 oplock = 0;
2135	FILE_UNIX_BASIC_INFO *info = NULL;
2136	struct inode *newinode = NULL;
2137	struct cifs_fattr fattr;
2138
2139	info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
2140	if (info == NULL) {
2141		rc = -ENOMEM;
2142		goto posix_mkdir_out;
2143	}
2144
2145	mode &= ~current_umask();
2146	rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
2147			     NULL /* netfid */, info, &oplock, full_path,
2148			     cifs_sb->local_nls, cifs_remap(cifs_sb));
2149	if (rc == -EOPNOTSUPP)
2150		goto posix_mkdir_out;
2151	else if (rc) {
2152		cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
2153		d_drop(dentry);
2154		goto posix_mkdir_out;
2155	}
2156
2157	if (info->Type == cpu_to_le32(-1))
2158		/* no return info, go query for it */
2159		goto posix_mkdir_get_info;
2160	/*
2161	 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
2162	 * need to set uid/gid.
2163	 */
2164
2165	cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
2166	cifs_fill_uniqueid(inode->i_sb, &fattr);
2167	newinode = cifs_iget(inode->i_sb, &fattr);
2168	if (!newinode)
2169		goto posix_mkdir_get_info;
2170
2171	d_instantiate(dentry, newinode);
2172
2173#ifdef CONFIG_CIFS_DEBUG2
2174	cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
2175		 dentry, dentry, newinode);
2176
2177	if (newinode->i_nlink != 2)
2178		cifs_dbg(FYI, "unexpected number of links %d\n",
2179			 newinode->i_nlink);
2180#endif
2181
2182posix_mkdir_out:
2183	kfree(info);
2184	return rc;
2185posix_mkdir_get_info:
2186	rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
2187			      xid);
2188	goto posix_mkdir_out;
2189}
2190#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2191
2192int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
2193	       struct dentry *direntry, umode_t mode)
2194{
2195	int rc = 0;
2196	unsigned int xid;
2197	struct cifs_sb_info *cifs_sb;
2198	struct tcon_link *tlink;
2199	struct cifs_tcon *tcon;
2200	struct TCP_Server_Info *server;
2201	const char *full_path;
2202	void *page;
2203
2204	cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
2205		 mode, inode);
2206
2207	cifs_sb = CIFS_SB(inode->i_sb);
2208	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2209		return -EIO;
2210	tlink = cifs_sb_tlink(cifs_sb);
2211	if (IS_ERR(tlink))
2212		return PTR_ERR(tlink);
2213	tcon = tlink_tcon(tlink);
2214
2215	xid = get_xid();
2216
2217	page = alloc_dentry_path();
2218	full_path = build_path_from_dentry(direntry, page);
2219	if (IS_ERR(full_path)) {
2220		rc = PTR_ERR(full_path);
2221		goto mkdir_out;
2222	}
2223
2224	server = tcon->ses->server;
2225
2226	if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2227		rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2228					      cifs_sb);
2229		d_drop(direntry); /* for time being always refresh inode info */
2230		goto mkdir_out;
2231	}
2232
2233#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2234	if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2235				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2236		rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2237				      tcon, xid);
2238		if (rc != -EOPNOTSUPP)
2239			goto mkdir_out;
2240	}
2241#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2242
2243	if (!server->ops->mkdir) {
2244		rc = -ENOSYS;
2245		goto mkdir_out;
2246	}
2247
2248	/* BB add setting the equivalent of mode via CreateX w/ACLs */
2249	rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2250	if (rc) {
2251		cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2252		d_drop(direntry);
2253		goto mkdir_out;
2254	}
2255
2256	/* TODO: skip this for smb2/smb3 */
2257	rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2258			      xid);
2259mkdir_out:
2260	/*
2261	 * Force revalidate to get parent dir info when needed since cached
2262	 * attributes are invalid now.
2263	 */
2264	CIFS_I(inode)->time = 0;
2265	free_dentry_path(page);
2266	free_xid(xid);
2267	cifs_put_tlink(tlink);
2268	return rc;
2269}
2270
2271int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2272{
2273	int rc = 0;
2274	unsigned int xid;
2275	struct cifs_sb_info *cifs_sb;
2276	struct tcon_link *tlink;
2277	struct cifs_tcon *tcon;
2278	struct TCP_Server_Info *server;
2279	const char *full_path;
2280	void *page = alloc_dentry_path();
2281	struct cifsInodeInfo *cifsInode;
2282
2283	cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2284
2285	xid = get_xid();
2286
2287	full_path = build_path_from_dentry(direntry, page);
2288	if (IS_ERR(full_path)) {
2289		rc = PTR_ERR(full_path);
2290		goto rmdir_exit;
2291	}
2292
2293	cifs_sb = CIFS_SB(inode->i_sb);
2294	if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2295		rc = -EIO;
2296		goto rmdir_exit;
2297	}
2298
2299	tlink = cifs_sb_tlink(cifs_sb);
2300	if (IS_ERR(tlink)) {
2301		rc = PTR_ERR(tlink);
2302		goto rmdir_exit;
2303	}
2304	tcon = tlink_tcon(tlink);
2305	server = tcon->ses->server;
2306
2307	if (!server->ops->rmdir) {
2308		rc = -ENOSYS;
2309		cifs_put_tlink(tlink);
2310		goto rmdir_exit;
2311	}
2312
2313	if (tcon->nodelete) {
2314		rc = -EACCES;
2315		cifs_put_tlink(tlink);
2316		goto rmdir_exit;
2317	}
2318
2319	rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2320	cifs_put_tlink(tlink);
2321
2322	if (!rc) {
2323		spin_lock(&d_inode(direntry)->i_lock);
2324		i_size_write(d_inode(direntry), 0);
2325		clear_nlink(d_inode(direntry));
2326		spin_unlock(&d_inode(direntry)->i_lock);
2327	}
2328
2329	cifsInode = CIFS_I(d_inode(direntry));
2330	/* force revalidate to go get info when needed */
2331	cifsInode->time = 0;
2332
2333	cifsInode = CIFS_I(inode);
2334	/*
2335	 * Force revalidate to get parent dir info when needed since cached
2336	 * attributes are invalid now.
2337	 */
2338	cifsInode->time = 0;
2339
2340	inode_set_ctime_current(d_inode(direntry));
2341	inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
2342
2343rmdir_exit:
2344	free_dentry_path(page);
2345	free_xid(xid);
2346	return rc;
2347}
2348
2349static int
2350cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2351	       const char *from_path, struct dentry *to_dentry,
2352	       const char *to_path)
2353{
2354	struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2355	struct tcon_link *tlink;
2356	struct cifs_tcon *tcon;
2357	struct TCP_Server_Info *server;
2358#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2359	struct cifs_fid fid;
2360	struct cifs_open_parms oparms;
2361	int oplock;
2362#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2363	int rc;
2364
2365	tlink = cifs_sb_tlink(cifs_sb);
2366	if (IS_ERR(tlink))
2367		return PTR_ERR(tlink);
2368	tcon = tlink_tcon(tlink);
2369	server = tcon->ses->server;
2370
2371	if (!server->ops->rename)
2372		return -ENOSYS;
2373
2374	/* try path-based rename first */
2375	rc = server->ops->rename(xid, tcon, from_dentry,
2376				 from_path, to_path, cifs_sb);
2377
2378	/*
2379	 * Don't bother with rename by filehandle unless file is busy and
2380	 * source. Note that cross directory moves do not work with
2381	 * rename by filehandle to various Windows servers.
2382	 */
2383	if (rc == 0 || rc != -EBUSY)
2384		goto do_rename_exit;
2385
2386	/* Don't fall back to using SMB on SMB 2+ mount */
2387	if (server->vals->protocol_id != 0)
2388		goto do_rename_exit;
2389
2390#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2391	/* open-file renames don't work across directories */
2392	if (to_dentry->d_parent != from_dentry->d_parent)
2393		goto do_rename_exit;
2394
2395	oparms = (struct cifs_open_parms) {
2396		.tcon = tcon,
2397		.cifs_sb = cifs_sb,
2398		/* open the file to be renamed -- we need DELETE perms */
2399		.desired_access = DELETE,
2400		.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2401		.disposition = FILE_OPEN,
2402		.path = from_path,
2403		.fid = &fid,
2404	};
2405
2406	rc = CIFS_open(xid, &oparms, &oplock, NULL);
2407	if (rc == 0) {
2408		rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2409				(const char *) to_dentry->d_name.name,
2410				cifs_sb->local_nls, cifs_remap(cifs_sb));
2411		CIFSSMBClose(xid, tcon, fid.netfid);
2412	}
2413#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2414do_rename_exit:
2415	if (rc == 0)
2416		d_move(from_dentry, to_dentry);
2417	cifs_put_tlink(tlink);
2418	return rc;
2419}
2420
2421int
2422cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2423	     struct dentry *source_dentry, struct inode *target_dir,
2424	     struct dentry *target_dentry, unsigned int flags)
2425{
2426	const char *from_name, *to_name;
2427	void *page1, *page2;
2428	struct cifs_sb_info *cifs_sb;
2429	struct tcon_link *tlink;
2430	struct cifs_tcon *tcon;
2431	unsigned int xid;
2432	int rc, tmprc;
2433	int retry_count = 0;
2434	FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2435#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2436	FILE_UNIX_BASIC_INFO *info_buf_target;
2437#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2438
2439	if (flags & ~RENAME_NOREPLACE)
2440		return -EINVAL;
2441
2442	cifs_sb = CIFS_SB(source_dir->i_sb);
2443	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2444		return -EIO;
2445
2446	tlink = cifs_sb_tlink(cifs_sb);
2447	if (IS_ERR(tlink))
2448		return PTR_ERR(tlink);
2449	tcon = tlink_tcon(tlink);
2450
2451	page1 = alloc_dentry_path();
2452	page2 = alloc_dentry_path();
2453	xid = get_xid();
2454
2455	from_name = build_path_from_dentry(source_dentry, page1);
2456	if (IS_ERR(from_name)) {
2457		rc = PTR_ERR(from_name);
2458		goto cifs_rename_exit;
2459	}
2460
2461	to_name = build_path_from_dentry(target_dentry, page2);
2462	if (IS_ERR(to_name)) {
2463		rc = PTR_ERR(to_name);
2464		goto cifs_rename_exit;
2465	}
2466
2467	cifs_close_deferred_file_under_dentry(tcon, from_name);
2468	if (d_inode(target_dentry) != NULL) {
2469		netfs_wait_for_outstanding_io(d_inode(target_dentry));
2470		cifs_close_deferred_file_under_dentry(tcon, to_name);
2471	}
2472
2473	rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2474			    to_name);
2475
2476	if (rc == -EACCES) {
2477		while (retry_count < 3) {
2478			cifs_close_all_deferred_files(tcon);
2479			rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2480					    to_name);
2481			if (rc != -EACCES)
2482				break;
2483			retry_count++;
2484		}
2485	}
2486
2487	/*
2488	 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2489	 */
2490	if (flags & RENAME_NOREPLACE)
2491		goto cifs_rename_exit;
2492
2493#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2494	if (rc == -EEXIST && tcon->unix_ext) {
2495		/*
2496		 * Are src and dst hardlinks of same inode? We can only tell
2497		 * with unix extensions enabled.
2498		 */
2499		info_buf_source =
2500			kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2501					GFP_KERNEL);
2502		if (info_buf_source == NULL) {
2503			rc = -ENOMEM;
2504			goto cifs_rename_exit;
2505		}
2506
2507		info_buf_target = info_buf_source + 1;
2508		tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2509					     info_buf_source,
2510					     cifs_sb->local_nls,
2511					     cifs_remap(cifs_sb));
2512		if (tmprc != 0)
2513			goto unlink_target;
2514
2515		tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2516					     info_buf_target,
2517					     cifs_sb->local_nls,
2518					     cifs_remap(cifs_sb));
2519
2520		if (tmprc == 0 && (info_buf_source->UniqueId ==
2521				   info_buf_target->UniqueId)) {
2522			/* same file, POSIX says that this is a noop */
2523			rc = 0;
2524			goto cifs_rename_exit;
2525		}
2526	}
2527	/*
2528	 * else ... BB we could add the same check for Windows by
2529	 * checking the UniqueId via FILE_INTERNAL_INFO
2530	 */
2531
2532unlink_target:
2533#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2534
2535	/* Try unlinking the target dentry if it's not negative */
2536	if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2537		if (d_is_dir(target_dentry))
2538			tmprc = cifs_rmdir(target_dir, target_dentry);
2539		else
2540			tmprc = cifs_unlink(target_dir, target_dentry);
2541		if (tmprc)
2542			goto cifs_rename_exit;
2543		rc = cifs_do_rename(xid, source_dentry, from_name,
2544				    target_dentry, to_name);
2545	}
2546
2547	/* force revalidate to go get info when needed */
2548	CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2549
2550cifs_rename_exit:
2551	kfree(info_buf_source);
2552	free_dentry_path(page2);
2553	free_dentry_path(page1);
2554	free_xid(xid);
2555	cifs_put_tlink(tlink);
2556	return rc;
2557}
2558
2559static bool
2560cifs_dentry_needs_reval(struct dentry *dentry)
2561{
2562	struct inode *inode = d_inode(dentry);
2563	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2564	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2565	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2566	struct cached_fid *cfid = NULL;
2567
2568	if (cifs_i->time == 0)
2569		return true;
2570
2571	if (CIFS_CACHE_READ(cifs_i))
2572		return false;
2573
2574	if (!lookupCacheEnabled)
2575		return true;
2576
2577	if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
 
2578		if (cfid->time && cifs_i->time > cfid->time) {
 
2579			close_cached_dir(cfid);
2580			return false;
2581		}
 
2582		close_cached_dir(cfid);
2583	}
2584	/*
2585	 * depending on inode type, check if attribute caching disabled for
2586	 * files or directories
2587	 */
2588	if (S_ISDIR(inode->i_mode)) {
2589		if (!cifs_sb->ctx->acdirmax)
2590			return true;
2591		if (!time_in_range(jiffies, cifs_i->time,
2592				   cifs_i->time + cifs_sb->ctx->acdirmax))
2593			return true;
2594	} else { /* file */
2595		if (!cifs_sb->ctx->acregmax)
2596			return true;
2597		if (!time_in_range(jiffies, cifs_i->time,
2598				   cifs_i->time + cifs_sb->ctx->acregmax))
2599			return true;
2600	}
2601
2602	/* hardlinked files w/ noserverino get "special" treatment */
2603	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2604	    S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2605		return true;
2606
2607	return false;
2608}
2609
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2610/**
2611 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2612 *
2613 * @key:	currently unused
2614 * @mode:	the task state to sleep in
2615 */
2616static int
2617cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2618{
2619	schedule();
2620	if (signal_pending_state(mode, current))
2621		return -ERESTARTSYS;
2622	return 0;
2623}
2624
2625int
2626cifs_revalidate_mapping(struct inode *inode)
2627{
2628	int rc;
2629	struct cifsInodeInfo *cifs_inode = CIFS_I(inode);
2630	unsigned long *flags = &cifs_inode->flags;
2631	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2632
2633	/* swapfiles are not supposed to be shared */
2634	if (IS_SWAPFILE(inode))
2635		return 0;
2636
2637	rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2638				     TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2639	if (rc)
2640		return rc;
2641
2642	if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2643		/* for cache=singleclient, do not invalidate */
2644		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2645			goto skip_invalidate;
2646
2647		cifs_inode->netfs.zero_point = cifs_inode->netfs.remote_i_size;
2648		rc = filemap_invalidate_inode(inode, true, 0, LLONG_MAX);
2649		if (rc) {
2650			cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2651				 __func__, inode, rc);
2652			set_bit(CIFS_INO_INVALID_MAPPING, flags);
2653		}
2654	}
2655
2656skip_invalidate:
2657	clear_bit_unlock(CIFS_INO_LOCK, flags);
2658	smp_mb__after_atomic();
2659	wake_up_bit(flags, CIFS_INO_LOCK);
2660
2661	return rc;
2662}
2663
2664int
2665cifs_zap_mapping(struct inode *inode)
2666{
2667	set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2668	return cifs_revalidate_mapping(inode);
2669}
2670
2671int cifs_revalidate_file_attr(struct file *filp)
2672{
2673	int rc = 0;
2674	struct dentry *dentry = file_dentry(filp);
2675#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2676	struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2677#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2678
2679	if (!cifs_dentry_needs_reval(dentry))
2680		return rc;
2681
2682#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2683	if (tlink_tcon(cfile->tlink)->unix_ext)
2684		rc = cifs_get_file_info_unix(filp);
2685	else
2686#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2687		rc = cifs_get_file_info(filp);
2688
2689	return rc;
2690}
2691
2692int cifs_revalidate_dentry_attr(struct dentry *dentry)
2693{
2694	unsigned int xid;
2695	int rc = 0;
2696	struct inode *inode = d_inode(dentry);
2697	struct super_block *sb = dentry->d_sb;
2698	const char *full_path;
2699	void *page;
2700	int count = 0;
2701
2702	if (inode == NULL)
2703		return -ENOENT;
2704
2705	if (!cifs_dentry_needs_reval(dentry))
2706		return rc;
2707
2708	xid = get_xid();
2709
2710	page = alloc_dentry_path();
2711	full_path = build_path_from_dentry(dentry, page);
2712	if (IS_ERR(full_path)) {
2713		rc = PTR_ERR(full_path);
2714		goto out;
2715	}
2716
2717	cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2718		 full_path, inode, inode->i_count.counter,
2719		 dentry, cifs_get_time(dentry), jiffies);
2720
2721again:
2722	if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions) {
2723		rc = smb311_posix_get_inode_info(&inode, full_path,
2724						 NULL, sb, xid);
2725	} else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) {
2726		rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2727	} else {
2728		rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2729					 xid, NULL);
2730	}
2731	if (rc == -EAGAIN && count++ < 10)
2732		goto again;
2733out:
2734	free_dentry_path(page);
2735	free_xid(xid);
2736
2737	return rc;
2738}
2739
2740int cifs_revalidate_file(struct file *filp)
2741{
2742	int rc;
2743	struct inode *inode = file_inode(filp);
2744
2745	rc = cifs_revalidate_file_attr(filp);
2746	if (rc)
2747		return rc;
2748
2749	return cifs_revalidate_mapping(inode);
2750}
2751
2752/* revalidate a dentry's inode attributes */
2753int cifs_revalidate_dentry(struct dentry *dentry)
2754{
2755	int rc;
2756	struct inode *inode = d_inode(dentry);
2757
2758	rc = cifs_revalidate_dentry_attr(dentry);
2759	if (rc)
2760		return rc;
2761
2762	return cifs_revalidate_mapping(inode);
2763}
2764
2765int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2766		 struct kstat *stat, u32 request_mask, unsigned int flags)
2767{
2768	struct dentry *dentry = path->dentry;
2769	struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2770	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2771	struct inode *inode = d_inode(dentry);
2772	int rc;
2773
2774	if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2775		return -EIO;
2776
2777	/*
2778	 * We need to be sure that all dirty pages are written and the server
2779	 * has actual ctime, mtime and file length.
2780	 */
2781	if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2782	    !CIFS_CACHE_READ(CIFS_I(inode)) &&
2783	    inode->i_mapping && inode->i_mapping->nrpages != 0) {
2784		rc = filemap_fdatawait(inode->i_mapping);
2785		if (rc) {
2786			mapping_set_error(inode->i_mapping, rc);
2787			return rc;
2788		}
2789	}
2790
2791	if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2792		CIFS_I(inode)->time = 0; /* force revalidate */
2793
2794	/*
2795	 * If the caller doesn't require syncing, only sync if
2796	 * necessary (e.g. due to earlier truncate or setattr
2797	 * invalidating the cached metadata)
2798	 */
2799	if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2800	    (CIFS_I(inode)->time == 0)) {
2801		rc = cifs_revalidate_dentry_attr(dentry);
2802		if (rc)
2803			return rc;
2804	}
2805
2806	generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2807	stat->blksize = cifs_sb->ctx->bsize;
2808	stat->ino = CIFS_I(inode)->uniqueid;
2809
2810	/* old CIFS Unix Extensions doesn't return create time */
2811	if (CIFS_I(inode)->createtime) {
2812		stat->result_mask |= STATX_BTIME;
2813		stat->btime =
2814		      cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2815	}
2816
2817	stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2818	if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2819		stat->attributes |= STATX_ATTR_COMPRESSED;
2820	if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2821		stat->attributes |= STATX_ATTR_ENCRYPTED;
2822
2823	/*
2824	 * If on a multiuser mount without unix extensions or cifsacl being
2825	 * enabled, and the admin hasn't overridden them, set the ownership
2826	 * to the fsuid/fsgid of the current process.
2827	 */
2828	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2829	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2830	    !tcon->unix_ext) {
2831		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2832			stat->uid = current_fsuid();
2833		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2834			stat->gid = current_fsgid();
2835	}
2836	return 0;
2837}
2838
2839int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2840		u64 len)
2841{
2842	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2843	struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2844	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2845	struct TCP_Server_Info *server = tcon->ses->server;
2846	struct cifsFileInfo *cfile;
2847	int rc;
2848
2849	if (unlikely(cifs_forced_shutdown(cifs_sb)))
2850		return -EIO;
2851
2852	/*
2853	 * We need to be sure that all dirty pages are written as they
2854	 * might fill holes on the server.
2855	 */
2856	if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2857	    inode->i_mapping->nrpages != 0) {
2858		rc = filemap_fdatawait(inode->i_mapping);
2859		if (rc) {
2860			mapping_set_error(inode->i_mapping, rc);
2861			return rc;
2862		}
2863	}
2864
2865	cfile = find_readable_file(cifs_i, false);
2866	if (cfile == NULL)
2867		return -EINVAL;
2868
2869	if (server->ops->fiemap) {
2870		rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2871		cifsFileInfo_put(cfile);
2872		return rc;
2873	}
2874
2875	cifsFileInfo_put(cfile);
2876	return -EOPNOTSUPP;
2877}
2878
2879int cifs_truncate_page(struct address_space *mapping, loff_t from)
2880{
2881	pgoff_t index = from >> PAGE_SHIFT;
2882	unsigned offset = from & (PAGE_SIZE - 1);
2883	struct page *page;
2884	int rc = 0;
2885
2886	page = grab_cache_page(mapping, index);
2887	if (!page)
2888		return -ENOMEM;
2889
2890	zero_user_segment(page, offset, PAGE_SIZE);
2891	unlock_page(page);
2892	put_page(page);
2893	return rc;
2894}
2895
2896void cifs_setsize(struct inode *inode, loff_t offset)
2897{
2898	struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2899
2900	spin_lock(&inode->i_lock);
2901	i_size_write(inode, offset);
2902	spin_unlock(&inode->i_lock);
2903
2904	/* Cached inode must be refreshed on truncate */
2905	cifs_i->time = 0;
2906	truncate_pagecache(inode, offset);
2907}
2908
2909static int
2910cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2911		   unsigned int xid, const char *full_path, struct dentry *dentry)
2912{
2913	int rc;
2914	struct cifsFileInfo *open_file;
2915	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2916	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2917	struct tcon_link *tlink = NULL;
2918	struct cifs_tcon *tcon = NULL;
2919	struct TCP_Server_Info *server;
2920
2921	/*
2922	 * To avoid spurious oplock breaks from server, in the case of
2923	 * inodes that we already have open, avoid doing path based
2924	 * setting of file size if we can do it by handle.
2925	 * This keeps our caching token (oplock) and avoids timeouts
2926	 * when the local oplock break takes longer to flush
2927	 * writebehind data than the SMB timeout for the SetPathInfo
2928	 * request would allow
2929	 */
2930	open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2931	if (open_file) {
2932		tcon = tlink_tcon(open_file->tlink);
2933		server = tcon->ses->server;
2934		if (server->ops->set_file_size)
2935			rc = server->ops->set_file_size(xid, tcon, open_file,
2936							attrs->ia_size, false);
2937		else
2938			rc = -ENOSYS;
2939		cifsFileInfo_put(open_file);
2940		cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2941	} else
2942		rc = -EINVAL;
2943
2944	if (!rc)
2945		goto set_size_out;
2946
2947	if (tcon == NULL) {
2948		tlink = cifs_sb_tlink(cifs_sb);
2949		if (IS_ERR(tlink))
2950			return PTR_ERR(tlink);
2951		tcon = tlink_tcon(tlink);
2952		server = tcon->ses->server;
2953	}
2954
2955	/*
2956	 * Set file size by pathname rather than by handle either because no
2957	 * valid, writeable file handle for it was found or because there was
2958	 * an error setting it by handle.
2959	 */
2960	if (server->ops->set_path_size)
2961		rc = server->ops->set_path_size(xid, tcon, full_path,
2962						attrs->ia_size, cifs_sb, false, dentry);
2963	else
2964		rc = -ENOSYS;
2965	cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2966
2967	if (tlink)
2968		cifs_put_tlink(tlink);
2969
2970set_size_out:
2971	if (rc == 0) {
2972		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
2973		cifs_setsize(inode, attrs->ia_size);
2974		/*
2975		 * i_blocks is not related to (i_size / i_blksize), but instead
2976		 * 512 byte (2**9) size is required for calculating num blocks.
2977		 * Until we can query the server for actual allocation size,
2978		 * this is best estimate we have for blocks allocated for a file
2979		 * Number of blocks must be rounded up so size 1 is not 0 blocks
2980		 */
2981		inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2982
2983		/*
2984		 * The man page of truncate says if the size changed,
2985		 * then the st_ctime and st_mtime fields for the file
2986		 * are updated.
2987		 */
2988		attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2989		attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2990
2991		cifs_truncate_page(inode->i_mapping, inode->i_size);
2992	}
2993
2994	return rc;
2995}
2996
2997#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2998static int
2999cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
3000{
3001	int rc;
3002	unsigned int xid;
3003	const char *full_path;
3004	void *page = alloc_dentry_path();
3005	struct inode *inode = d_inode(direntry);
3006	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
3007	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3008	struct tcon_link *tlink;
3009	struct cifs_tcon *pTcon;
3010	struct cifs_unix_set_info_args *args = NULL;
3011	struct cifsFileInfo *open_file;
3012
3013	cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
3014		 direntry, attrs->ia_valid);
3015
3016	xid = get_xid();
3017
3018	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
3019		attrs->ia_valid |= ATTR_FORCE;
3020
3021	rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
3022	if (rc < 0)
3023		goto out;
3024
3025	full_path = build_path_from_dentry(direntry, page);
3026	if (IS_ERR(full_path)) {
3027		rc = PTR_ERR(full_path);
3028		goto out;
3029	}
3030
3031	/*
3032	 * Attempt to flush data before changing attributes. We need to do
3033	 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
3034	 * ownership or mode then we may also need to do this. Here, we take
3035	 * the safe way out and just do the flush on all setattr requests. If
3036	 * the flush returns error, store it to report later and continue.
3037	 *
3038	 * BB: This should be smarter. Why bother flushing pages that
3039	 * will be truncated anyway? Also, should we error out here if
3040	 * the flush returns error?
3041	 */
3042	rc = filemap_write_and_wait(inode->i_mapping);
3043	if (is_interrupt_error(rc)) {
3044		rc = -ERESTARTSYS;
3045		goto out;
3046	}
3047
3048	mapping_set_error(inode->i_mapping, rc);
3049	rc = 0;
3050
3051	if (attrs->ia_valid & ATTR_SIZE) {
3052		rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry);
3053		if (rc != 0)
3054			goto out;
3055	}
3056
3057	/* skip mode change if it's just for clearing setuid/setgid */
3058	if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3059		attrs->ia_valid &= ~ATTR_MODE;
3060
3061	args = kmalloc(sizeof(*args), GFP_KERNEL);
3062	if (args == NULL) {
3063		rc = -ENOMEM;
3064		goto out;
3065	}
3066
3067	/* set up the struct */
3068	if (attrs->ia_valid & ATTR_MODE)
3069		args->mode = attrs->ia_mode;
3070	else
3071		args->mode = NO_CHANGE_64;
3072
3073	if (attrs->ia_valid & ATTR_UID)
3074		args->uid = attrs->ia_uid;
3075	else
3076		args->uid = INVALID_UID; /* no change */
3077
3078	if (attrs->ia_valid & ATTR_GID)
3079		args->gid = attrs->ia_gid;
3080	else
3081		args->gid = INVALID_GID; /* no change */
3082
3083	if (attrs->ia_valid & ATTR_ATIME)
3084		args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
3085	else
3086		args->atime = NO_CHANGE_64;
3087
3088	if (attrs->ia_valid & ATTR_MTIME)
3089		args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
3090	else
3091		args->mtime = NO_CHANGE_64;
3092
3093	if (attrs->ia_valid & ATTR_CTIME)
3094		args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
3095	else
3096		args->ctime = NO_CHANGE_64;
3097
3098	args->device = 0;
3099	open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
3100	if (open_file) {
3101		u16 nfid = open_file->fid.netfid;
3102		u32 npid = open_file->pid;
3103		pTcon = tlink_tcon(open_file->tlink);
3104		rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
3105		cifsFileInfo_put(open_file);
3106	} else {
3107		tlink = cifs_sb_tlink(cifs_sb);
3108		if (IS_ERR(tlink)) {
3109			rc = PTR_ERR(tlink);
3110			goto out;
3111		}
3112		pTcon = tlink_tcon(tlink);
3113		rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
3114				    cifs_sb->local_nls,
3115				    cifs_remap(cifs_sb));
3116		cifs_put_tlink(tlink);
3117	}
3118
3119	if (rc)
3120		goto out;
3121
3122	if ((attrs->ia_valid & ATTR_SIZE) &&
3123	    attrs->ia_size != i_size_read(inode)) {
3124		truncate_setsize(inode, attrs->ia_size);
3125		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
3126		fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3127	}
3128
3129	setattr_copy(&nop_mnt_idmap, inode, attrs);
3130	mark_inode_dirty(inode);
3131
3132	/* force revalidate when any of these times are set since some
3133	   of the fs types (eg ext3, fat) do not have fine enough
3134	   time granularity to match protocol, and we do not have a
3135	   a way (yet) to query the server fs's time granularity (and
3136	   whether it rounds times down).
3137	*/
3138	if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
3139		cifsInode->time = 0;
3140out:
3141	kfree(args);
3142	free_dentry_path(page);
3143	free_xid(xid);
3144	return rc;
3145}
3146#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3147
3148static int
3149cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
3150{
3151	unsigned int xid;
3152	kuid_t uid = INVALID_UID;
3153	kgid_t gid = INVALID_GID;
3154	struct inode *inode = d_inode(direntry);
3155	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3156	struct cifsInodeInfo *cifsInode = CIFS_I(inode);
3157	struct cifsFileInfo *wfile;
3158	struct cifs_tcon *tcon;
3159	const char *full_path;
3160	void *page = alloc_dentry_path();
3161	int rc = -EACCES;
3162	__u32 dosattr = 0;
3163	__u64 mode = NO_CHANGE_64;
3164	bool posix = cifs_sb_master_tcon(cifs_sb)->posix_extensions;
3165
3166	xid = get_xid();
3167
3168	cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
3169		 direntry, attrs->ia_valid);
3170
3171	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
3172		attrs->ia_valid |= ATTR_FORCE;
3173
3174	rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
3175	if (rc < 0)
3176		goto cifs_setattr_exit;
3177
3178	full_path = build_path_from_dentry(direntry, page);
3179	if (IS_ERR(full_path)) {
3180		rc = PTR_ERR(full_path);
3181		goto cifs_setattr_exit;
3182	}
3183
3184	/*
3185	 * Attempt to flush data before changing attributes. We need to do
3186	 * this for ATTR_SIZE and ATTR_MTIME.  If the flush of the data
3187	 * returns error, store it to report later and continue.
3188	 *
3189	 * BB: This should be smarter. Why bother flushing pages that
3190	 * will be truncated anyway? Also, should we error out here if
3191	 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
3192	 */
3193	if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
3194		rc = filemap_write_and_wait(inode->i_mapping);
3195		if (is_interrupt_error(rc)) {
3196			rc = -ERESTARTSYS;
3197			goto cifs_setattr_exit;
3198		}
3199		mapping_set_error(inode->i_mapping, rc);
3200	}
3201
3202	rc = 0;
3203
3204	if ((attrs->ia_valid & ATTR_MTIME) &&
3205	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3206		rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3207		if (!rc) {
3208			tcon = tlink_tcon(wfile->tlink);
3209			rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3210			cifsFileInfo_put(wfile);
3211			if (rc)
3212				goto cifs_setattr_exit;
3213		} else if (rc != -EBADF)
3214			goto cifs_setattr_exit;
3215		else
3216			rc = 0;
3217	}
3218
3219	if (attrs->ia_valid & ATTR_SIZE) {
3220		rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry);
3221		if (rc != 0)
3222			goto cifs_setattr_exit;
3223	}
3224
3225	if (attrs->ia_valid & ATTR_UID)
3226		uid = attrs->ia_uid;
3227
3228	if (attrs->ia_valid & ATTR_GID)
3229		gid = attrs->ia_gid;
3230
3231	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3232	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3233		if (uid_valid(uid) || gid_valid(gid)) {
3234			mode = NO_CHANGE_64;
3235			rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3236							uid, gid);
3237			if (rc) {
3238				cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3239					 __func__, rc);
3240				goto cifs_setattr_exit;
3241			}
3242		}
3243	} else
3244	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3245		attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3246
3247	/* skip mode change if it's just for clearing setuid/setgid */
3248	if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3249		attrs->ia_valid &= ~ATTR_MODE;
3250
3251	if (attrs->ia_valid & ATTR_MODE) {
3252		mode = attrs->ia_mode;
3253		rc = 0;
3254		if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3255		    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) ||
3256		    posix) {
3257			rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3258						INVALID_UID, INVALID_GID);
3259			if (rc) {
3260				cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3261					 __func__, rc);
3262				goto cifs_setattr_exit;
3263			}
3264
3265			/*
3266			 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3267			 * Pick up the actual mode bits that were set.
3268			 */
3269			if (mode != attrs->ia_mode)
3270				attrs->ia_mode = mode;
3271		} else
3272		if (((mode & S_IWUGO) == 0) &&
3273		    (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3274
3275			dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3276
3277			/* fix up mode if we're not using dynperm */
3278			if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3279				attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3280		} else if ((mode & S_IWUGO) &&
3281			   (cifsInode->cifsAttrs & ATTR_READONLY)) {
3282
3283			dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3284			/* Attributes of 0 are ignored */
3285			if (dosattr == 0)
3286				dosattr |= ATTR_NORMAL;
3287
3288			/* reset local inode permissions to normal */
3289			if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3290				attrs->ia_mode &= ~(S_IALLUGO);
3291				if (S_ISDIR(inode->i_mode))
3292					attrs->ia_mode |=
3293						cifs_sb->ctx->dir_mode;
3294				else
3295					attrs->ia_mode |=
3296						cifs_sb->ctx->file_mode;
3297			}
3298		} else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3299			/* ignore mode change - ATTR_READONLY hasn't changed */
3300			attrs->ia_valid &= ~ATTR_MODE;
3301		}
3302	}
3303
3304	if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3305	    ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3306		rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3307		/* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3308
3309		/* Even if error on time set, no sense failing the call if
3310		the server would set the time to a reasonable value anyway,
3311		and this check ensures that we are not being called from
3312		sys_utimes in which case we ought to fail the call back to
3313		the user when the server rejects the call */
3314		if ((rc) && (attrs->ia_valid &
3315				(ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3316			rc = 0;
3317	}
3318
3319	/* do not need local check to inode_check_ok since the server does
3320	   that */
3321	if (rc)
3322		goto cifs_setattr_exit;
3323
3324	if ((attrs->ia_valid & ATTR_SIZE) &&
3325	    attrs->ia_size != i_size_read(inode)) {
3326		truncate_setsize(inode, attrs->ia_size);
3327		netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
3328		fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3329	}
3330
3331	setattr_copy(&nop_mnt_idmap, inode, attrs);
3332	mark_inode_dirty(inode);
3333
3334cifs_setattr_exit:
3335	free_xid(xid);
3336	free_dentry_path(page);
3337	return rc;
3338}
3339
3340int
3341cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3342	     struct iattr *attrs)
3343{
3344	struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3345	int rc, retries = 0;
3346#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3347	struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3348#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3349
3350	if (unlikely(cifs_forced_shutdown(cifs_sb)))
3351		return -EIO;
3352
3353	do {
3354#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3355		if (pTcon->unix_ext)
3356			rc = cifs_setattr_unix(direntry, attrs);
3357		else
3358#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3359			rc = cifs_setattr_nounix(direntry, attrs);
3360		retries++;
3361	} while (is_retryable_error(rc) && retries < 2);
3362
3363	/* BB: add cifs_setattr_legacy for really old servers */
3364	return rc;
3365}