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