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