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