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