Linux Audio

Check our new training course

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