Linux Audio

Check our new training course

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