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