Linux Audio

Check our new training course

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