Linux Audio

Check our new training course

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