Linux Audio

Check our new training course

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