]> Git Repo - linux.git/blame - fs/cifs/inode.c
Allow conversion of characters in Mac remap range (part 2)
[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 ([email protected])
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"
9451a9a5 33#include "fscache.h"
1da177e4 34
70eff55d 35
01c64fea 36static void cifs_set_ops(struct inode *inode)
70eff55d
CH
37{
38 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
39
40 switch (inode->i_mode & S_IFMT) {
41 case S_IFREG:
42 inode->i_op = &cifs_file_inode_ops;
43 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
44 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
45 inode->i_fop = &cifs_file_direct_nobrl_ops;
46 else
47 inode->i_fop = &cifs_file_direct_ops;
8be7e6ba
PS
48 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
49 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
50 inode->i_fop = &cifs_file_strict_nobrl_ops;
51 else
52 inode->i_fop = &cifs_file_strict_ops;
70eff55d
CH
53 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
54 inode->i_fop = &cifs_file_nobrl_ops;
55 else { /* not direct, send byte range locks */
56 inode->i_fop = &cifs_file_ops;
57 }
58
70eff55d 59 /* check if server can support readpages */
0d424ad0 60 if (cifs_sb_master_tcon(cifs_sb)->ses->server->maxBuf <
70eff55d
CH
61 PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
62 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
63 else
64 inode->i_data.a_ops = &cifs_addr_ops;
65 break;
66 case S_IFDIR:
bc5b6e24 67#ifdef CONFIG_CIFS_DFS_UPCALL
01c64fea 68 if (IS_AUTOMOUNT(inode)) {
7962670e
IM
69 inode->i_op = &cifs_dfs_referral_inode_operations;
70 } else {
bc5b6e24
SF
71#else /* NO DFS support, treat as a directory */
72 {
73#endif
7962670e
IM
74 inode->i_op = &cifs_dir_inode_ops;
75 inode->i_fop = &cifs_dir_ops;
76 }
70eff55d
CH
77 break;
78 case S_IFLNK:
79 inode->i_op = &cifs_symlink_inode_ops;
80 break;
81 default:
82 init_special_inode(inode, inode->i_mode, inode->i_rdev);
83 break;
84 }
85}
86
df2cf170
JL
87/* check inode attributes against fattr. If they don't match, tag the
88 * inode for cache invalidation
89 */
90static void
91cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
92{
93 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
94
f96637be
JP
95 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
96 __func__, cifs_i->uniqueid);
df2cf170
JL
97
98 if (inode->i_state & I_NEW) {
f96637be
JP
99 cifs_dbg(FYI, "%s: inode %llu is new\n",
100 __func__, cifs_i->uniqueid);
df2cf170
JL
101 return;
102 }
103
104 /* don't bother with revalidation if we have an oplock */
18cceb6a 105 if (CIFS_CACHE_READ(cifs_i)) {
f96637be
JP
106 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
107 __func__, cifs_i->uniqueid);
df2cf170
JL
108 return;
109 }
110
111 /* revalidate if mtime or size have changed */
112 if (timespec_equal(&inode->i_mtime, &fattr->cf_mtime) &&
113 cifs_i->server_eof == fattr->cf_eof) {
f96637be
JP
114 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
115 __func__, cifs_i->uniqueid);
df2cf170
JL
116 return;
117 }
118
f96637be
JP
119 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
120 __func__, cifs_i->uniqueid);
aff8d5ca 121 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
df2cf170
JL
122}
123
74d290da
JM
124/*
125 * copy nlink to the inode, unless it wasn't provided. Provide
126 * sane values if we don't have an existing one and none was provided
127 */
128static void
129cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
130{
131 /*
132 * if we're in a situation where we can't trust what we
133 * got from the server (readdir, some non-unix cases)
134 * fake reasonable values
135 */
136 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
137 /* only provide fake values on a new inode */
138 if (inode->i_state & I_NEW) {
139 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
140 set_nlink(inode, 2);
141 else
142 set_nlink(inode, 1);
143 }
144 return;
145 }
146
147 /* we trust the server, so update it */
148 set_nlink(inode, fattr->cf_nlink);
149}
150
cc0bad75
JL
151/* populate an inode with info from a cifs_fattr struct */
152void
153cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
75f12983 154{
cc0bad75 155 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
0b8f18e3 156 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
cc0bad75 157
df2cf170
JL
158 cifs_revalidate_cache(inode, fattr);
159
b7ca6928 160 spin_lock(&inode->i_lock);
cc0bad75
JL
161 inode->i_atime = fattr->cf_atime;
162 inode->i_mtime = fattr->cf_mtime;
163 inode->i_ctime = fattr->cf_ctime;
cc0bad75 164 inode->i_rdev = fattr->cf_rdev;
74d290da 165 cifs_nlink_fattr_to_inode(inode, fattr);
cc0bad75
JL
166 inode->i_uid = fattr->cf_uid;
167 inode->i_gid = fattr->cf_gid;
168
0b8f18e3
JL
169 /* if dynperm is set, don't clobber existing mode */
170 if (inode->i_state & I_NEW ||
171 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
172 inode->i_mode = fattr->cf_mode;
173
cc0bad75 174 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
75f12983 175
0b8f18e3
JL
176 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
177 cifs_i->time = 0;
178 else
179 cifs_i->time = jiffies;
180
aff8d5ca
JL
181 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
182 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
183 else
184 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
cc0bad75 185
835a36ca 186 cifs_i->server_eof = fattr->cf_eof;
cc0bad75
JL
187 /*
188 * Can't safely change the file size here if the client is writing to
189 * it due to potential races.
190 */
cc0bad75
JL
191 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
192 i_size_write(inode, fattr->cf_eof);
193
194 /*
195 * i_blocks is not related to (i_size / i_blksize),
196 * but instead 512 byte (2**9) size is required for
197 * calculating num blocks.
198 */
199 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
200 }
201 spin_unlock(&inode->i_lock);
202
01c64fea
DH
203 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
204 inode->i_flags |= S_AUTOMOUNT;
c2b93e06
JL
205 if (inode->i_state & I_NEW)
206 cifs_set_ops(inode);
cc0bad75
JL
207}
208
4065c802
JL
209void
210cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
211{
212 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
213
214 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
215 return;
216
217 fattr->cf_uniqueid = iunique(sb, ROOT_I);
218}
219
cc0bad75
JL
220/* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
221void
222cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
223 struct cifs_sb_info *cifs_sb)
224{
225 memset(fattr, 0, sizeof(*fattr));
226 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
227 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
228 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
229
230 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
231 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
232 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
233 fattr->cf_mode = le64_to_cpu(info->Permissions);
75f12983
CH
234
235 /*
236 * Since we set the inode type below we need to mask off
237 * to avoid strange results if bits set above.
238 */
cc0bad75 239 fattr->cf_mode &= ~S_IFMT;
75f12983
CH
240 switch (le32_to_cpu(info->Type)) {
241 case UNIX_FILE:
cc0bad75
JL
242 fattr->cf_mode |= S_IFREG;
243 fattr->cf_dtype = DT_REG;
75f12983
CH
244 break;
245 case UNIX_SYMLINK:
cc0bad75
JL
246 fattr->cf_mode |= S_IFLNK;
247 fattr->cf_dtype = DT_LNK;
75f12983
CH
248 break;
249 case UNIX_DIR:
cc0bad75
JL
250 fattr->cf_mode |= S_IFDIR;
251 fattr->cf_dtype = DT_DIR;
75f12983
CH
252 break;
253 case UNIX_CHARDEV:
cc0bad75
JL
254 fattr->cf_mode |= S_IFCHR;
255 fattr->cf_dtype = DT_CHR;
256 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
257 le64_to_cpu(info->DevMinor) & MINORMASK);
75f12983
CH
258 break;
259 case UNIX_BLOCKDEV:
cc0bad75
JL
260 fattr->cf_mode |= S_IFBLK;
261 fattr->cf_dtype = DT_BLK;
262 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
263 le64_to_cpu(info->DevMinor) & MINORMASK);
75f12983
CH
264 break;
265 case UNIX_FIFO:
cc0bad75
JL
266 fattr->cf_mode |= S_IFIFO;
267 fattr->cf_dtype = DT_FIFO;
75f12983
CH
268 break;
269 case UNIX_SOCKET:
cc0bad75
JL
270 fattr->cf_mode |= S_IFSOCK;
271 fattr->cf_dtype = DT_SOCK;
75f12983
CH
272 break;
273 default:
274 /* safest to call it a file if we do not know */
cc0bad75
JL
275 fattr->cf_mode |= S_IFREG;
276 fattr->cf_dtype = DT_REG;
f96637be 277 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
75f12983
CH
278 break;
279 }
280
46bbc25f
EB
281 fattr->cf_uid = cifs_sb->mnt_uid;
282 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
283 u64 id = le64_to_cpu(info->Uid);
4a2c8cf5
EB
284 if (id < ((uid_t)-1)) {
285 kuid_t uid = make_kuid(&init_user_ns, id);
286 if (uid_valid(uid))
287 fattr->cf_uid = uid;
288 }
46bbc25f
EB
289 }
290
291 fattr->cf_gid = cifs_sb->mnt_gid;
292 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
293 u64 id = le64_to_cpu(info->Gid);
4a2c8cf5
EB
294 if (id < ((gid_t)-1)) {
295 kgid_t gid = make_kgid(&init_user_ns, id);
296 if (gid_valid(gid))
297 fattr->cf_gid = gid;
298 }
46bbc25f 299 }
75f12983 300
cc0bad75 301 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
75f12983
CH
302}
303
b9a3260f 304/*
cc0bad75
JL
305 * Fill a cifs_fattr struct with fake inode info.
306 *
307 * Needed to setup cifs_fattr data for the directory which is the
308 * junction to the new submount (ie to setup the fake directory
309 * which represents a DFS referral).
b9a3260f 310 */
f1230c97 311static void
cc0bad75 312cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
0e4bbde9 313{
cc0bad75 314 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
0e4bbde9 315
f96637be 316 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
cc0bad75
JL
317
318 memset(fattr, 0, sizeof(*fattr));
319 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
320 fattr->cf_uid = cifs_sb->mnt_uid;
321 fattr->cf_gid = cifs_sb->mnt_gid;
322 fattr->cf_atime = CURRENT_TIME;
323 fattr->cf_ctime = CURRENT_TIME;
324 fattr->cf_mtime = CURRENT_TIME;
325 fattr->cf_nlink = 2;
326 fattr->cf_flags |= CIFS_FATTR_DFS_REFERRAL;
0e4bbde9
SF
327}
328
4ad65044
PS
329static int
330cifs_get_file_info_unix(struct file *filp)
abab095d
JL
331{
332 int rc;
6d5786a3 333 unsigned int xid;
abab095d
JL
334 FILE_UNIX_BASIC_INFO find_data;
335 struct cifs_fattr fattr;
496ad9aa 336 struct inode *inode = file_inode(filp);
abab095d 337 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
c21dfb69 338 struct cifsFileInfo *cfile = filp->private_data;
96daf2b0 339 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
abab095d 340
6d5786a3 341 xid = get_xid();
4b4de76e 342 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
abab095d
JL
343 if (!rc) {
344 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
345 } else if (rc == -EREMOTE) {
346 cifs_create_dfs_fattr(&fattr, inode->i_sb);
347 rc = 0;
348 }
349
350 cifs_fattr_to_inode(inode, &fattr);
6d5786a3 351 free_xid(xid);
abab095d
JL
352 return rc;
353}
354
1da177e4 355int cifs_get_inode_info_unix(struct inode **pinode,
cc0bad75 356 const unsigned char *full_path,
6d5786a3 357 struct super_block *sb, unsigned int xid)
1da177e4 358{
cc0bad75 359 int rc;
0e4bbde9 360 FILE_UNIX_BASIC_INFO find_data;
cc0bad75 361 struct cifs_fattr fattr;
96daf2b0 362 struct cifs_tcon *tcon;
7ffec372 363 struct tcon_link *tlink;
1da177e4 364 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1da177e4 365
f96637be 366 cifs_dbg(FYI, "Getting info on %s\n", full_path);
7962670e 367
7ffec372
JL
368 tlink = cifs_sb_tlink(cifs_sb);
369 if (IS_ERR(tlink))
370 return PTR_ERR(tlink);
371 tcon = tlink_tcon(tlink);
372
1da177e4 373 /* could have done a find first instead but this returns more info */
cc0bad75 374 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
737b758c
SF
375 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
376 CIFS_MOUNT_MAP_SPECIAL_CHR);
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,
549 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
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);
773 } else
7962670e 774 goto cgii_exit;
1da177e4 775
0b8f18e3
JL
776 /*
777 * If an inode wasn't passed in, then get the inode number
778 *
779 * Is an i_ino of zero legal? Can we use that to check if the server
780 * supports returning inode numbers? Are there other sanity checks we
781 * can use to ensure that the server is really filling in that field?
0b8f18e3 782 */
1208ef1f 783 if (*inode == NULL) {
b9a3260f 784 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
c052e2b4
SP
785 if (validinum == false) {
786 if (server->ops->get_srv_inum)
787 tmprc = server->ops->get_srv_inum(xid,
788 tcon, cifs_sb, full_path,
789 &fattr.cf_uniqueid, data);
790 if (tmprc) {
f96637be
JP
791 cifs_dbg(FYI, "GetSrvInodeNum rc %d\n",
792 tmprc);
c052e2b4
SP
793 fattr.cf_uniqueid = iunique(sb, ROOT_I);
794 cifs_autodisable_serverino(cifs_sb);
795 }
132ac7b7 796 }
c052e2b4 797 } else
0b8f18e3 798 fattr.cf_uniqueid = iunique(sb, ROOT_I);
c052e2b4 799 } else
1208ef1f 800 fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
b9a3260f 801
0b8f18e3
JL
802 /* query for SFU type info if supported and needed */
803 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
804 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
805 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
806 if (tmprc)
f96637be 807 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
b9a3260f 808 }
1da177e4 809
79df1bae 810#ifdef CONFIG_CIFS_ACL
b9a3260f
SF
811 /* fill in 0777 bits from ACL */
812 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1208ef1f 813 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, full_path, fid);
78415d2d 814 if (rc) {
f96637be
JP
815 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
816 __func__, rc);
78415d2d
SP
817 goto cgii_exit;
818 }
b9a3260f 819 }
79df1bae 820#endif /* CONFIG_CIFS_ACL */
b9a3260f 821
0b8f18e3
JL
822 /* fill in remaining high mode bits e.g. SUID, VTX */
823 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
824 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
b9a3260f 825
1b12b9c1
SM
826 /* check for Minshall+French symlinks */
827 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
cb084b1a
SP
828 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
829 full_path);
1b12b9c1 830 if (tmprc)
cb084b1a 831 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1b12b9c1
SM
832 }
833
1208ef1f
PS
834 if (!*inode) {
835 *inode = cifs_iget(sb, &fattr);
836 if (!*inode)
0b8f18e3
JL
837 rc = -ENOMEM;
838 } else {
1208ef1f 839 cifs_fattr_to_inode(*inode, &fattr);
0b8f18e3 840 }
b9a3260f 841
7962670e 842cgii_exit:
1da177e4 843 kfree(buf);
7ffec372 844 cifs_put_tlink(tlink);
1da177e4
LT
845 return rc;
846}
847
7f8ed420
SF
848static const struct inode_operations cifs_ipc_inode_ops = {
849 .lookup = cifs_lookup,
850};
851
cc0bad75
JL
852static int
853cifs_find_inode(struct inode *inode, void *opaque)
854{
855 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
856
f30b9c11 857 /* don't match inode with different uniqueid */
cc0bad75
JL
858 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
859 return 0;
860
20054bd6
JL
861 /* use createtime like an i_generation field */
862 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
863 return 0;
864
f30b9c11
JL
865 /* don't match inode of different type */
866 if ((inode->i_mode & S_IFMT) != (fattr->cf_mode & S_IFMT))
867 return 0;
868
5acfec25 869 /* if it's not a directory or has no dentries, then flag it */
b3d9b7a3 870 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
3d694380 871 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
3d694380 872
cc0bad75
JL
873 return 1;
874}
875
876static int
877cifs_init_inode(struct inode *inode, void *opaque)
878{
879 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
880
881 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
20054bd6 882 CIFS_I(inode)->createtime = fattr->cf_createtime;
cc0bad75
JL
883 return 0;
884}
885
5acfec25
JL
886/*
887 * walk dentry list for an inode and report whether it has aliases that
888 * are hashed. We use this to determine if a directory inode can actually
889 * be used.
890 */
891static bool
892inode_has_hashed_dentries(struct inode *inode)
893{
894 struct dentry *dentry;
895
873feea0 896 spin_lock(&inode->i_lock);
b67bfe0d 897 hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
5acfec25 898 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
873feea0 899 spin_unlock(&inode->i_lock);
5acfec25
JL
900 return true;
901 }
902 }
873feea0 903 spin_unlock(&inode->i_lock);
5acfec25
JL
904 return false;
905}
906
cc0bad75
JL
907/* Given fattrs, get a corresponding inode */
908struct inode *
909cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
910{
911 unsigned long hash;
912 struct inode *inode;
913
3d694380 914retry_iget5_locked:
f96637be 915 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
cc0bad75
JL
916
917 /* hash down to 32-bits on 32-bit arch */
918 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
919
920 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
cc0bad75 921 if (inode) {
5acfec25 922 /* was there a potentially problematic inode collision? */
3d694380 923 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
3d694380 924 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
5acfec25
JL
925
926 if (inode_has_hashed_dentries(inode)) {
927 cifs_autodisable_serverino(CIFS_SB(sb));
928 iput(inode);
929 fattr->cf_uniqueid = iunique(sb, ROOT_I);
930 goto retry_iget5_locked;
931 }
3d694380
JL
932 }
933
cc0bad75
JL
934 cifs_fattr_to_inode(inode, fattr);
935 if (sb->s_flags & MS_NOATIME)
936 inode->i_flags |= S_NOATIME | S_NOCMTIME;
937 if (inode->i_state & I_NEW) {
938 inode->i_ino = hash;
522440ed
JL
939 if (S_ISREG(inode->i_mode))
940 inode->i_data.backing_dev_info = sb->s_bdi;
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();
0d424ad0 962 if (tcon->unix_ext)
f87d39d9 963 rc = cifs_get_inode_info_unix(&inode, "", sb, xid);
0b8f18e3 964 else
f87d39d9 965 rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
0b8f18e3 966
a7851ce7
OS
967 if (!inode) {
968 inode = ERR_PTR(rc);
969 goto out;
970 }
cc0bad75 971
0ccd4802 972#ifdef CONFIG_CIFS_FSCACHE
d03382ce 973 /* populate tcon->resource_id */
0d424ad0 974 tcon->resource_id = CIFS_I(inode)->uniqueid;
0ccd4802 975#endif
d03382ce 976
0d424ad0 977 if (rc && tcon->ipc) {
f96637be 978 cifs_dbg(FYI, "ipc connection - fake read inode\n");
b7ca6928 979 spin_lock(&inode->i_lock);
7f8ed420 980 inode->i_mode |= S_IFDIR;
bfe86848 981 set_nlink(inode, 2);
7f8ed420
SF
982 inode->i_op = &cifs_ipc_inode_ops;
983 inode->i_fop = &simple_dir_operations;
984 inode->i_uid = cifs_sb->mnt_uid;
985 inode->i_gid = cifs_sb->mnt_gid;
b7ca6928 986 spin_unlock(&inode->i_lock);
ad661334 987 } else if (rc) {
ce634ab2 988 iget_failed(inode);
a7851ce7 989 inode = ERR_PTR(rc);
7f8ed420
SF
990 }
991
a7851ce7 992out:
6d5786a3 993 /* can not call macro free_xid here since in a void func
ce634ab2
DH
994 * TODO: This is no longer true
995 */
6d5786a3 996 _free_xid(xid);
ce634ab2 997 return inode;
1da177e4
LT
998}
999
ed6875e0 1000int
6d5786a3 1001cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
ed6875e0 1002 char *full_path, __u32 dosattr)
388e57b2 1003{
388e57b2 1004 bool set_time = false;
388e57b2 1005 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
6bdf6dbd 1006 struct TCP_Server_Info *server;
388e57b2
SF
1007 FILE_BASIC_INFO info_buf;
1008
1adcb710
SF
1009 if (attrs == NULL)
1010 return -EINVAL;
1011
6bdf6dbd
PS
1012 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1013 if (!server->ops->set_file_info)
1014 return -ENOSYS;
1015
388e57b2
SF
1016 if (attrs->ia_valid & ATTR_ATIME) {
1017 set_time = true;
1018 info_buf.LastAccessTime =
1019 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1020 } else
1021 info_buf.LastAccessTime = 0;
1022
1023 if (attrs->ia_valid & ATTR_MTIME) {
1024 set_time = true;
1025 info_buf.LastWriteTime =
1026 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1027 } else
1028 info_buf.LastWriteTime = 0;
1029
1030 /*
1031 * Samba throws this field away, but windows may actually use it.
1032 * Do not set ctime unless other time stamps are changed explicitly
1033 * (i.e. by utimes()) since we would then have a mix of client and
1034 * server times.
1035 */
1036 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
f96637be 1037 cifs_dbg(FYI, "CIFS - CTIME changed\n");
388e57b2
SF
1038 info_buf.ChangeTime =
1039 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1040 } else
1041 info_buf.ChangeTime = 0;
1042
1043 info_buf.CreationTime = 0; /* don't change */
1044 info_buf.Attributes = cpu_to_le32(dosattr);
1045
6bdf6dbd 1046 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
388e57b2
SF
1047}
1048
a12a1ac7 1049/*
ed6875e0 1050 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
a12a1ac7
JL
1051 * and rename it to a random name that hopefully won't conflict with
1052 * anything else.
1053 */
ed6875e0
PS
1054int
1055cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1056 const unsigned int xid)
a12a1ac7
JL
1057{
1058 int oplock = 0;
1059 int rc;
d81b8a40
PS
1060 struct cifs_fid fid;
1061 struct cifs_open_parms oparms;
3270958b 1062 struct inode *inode = dentry->d_inode;
a12a1ac7
JL
1063 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1064 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
7ffec372 1065 struct tcon_link *tlink;
96daf2b0 1066 struct cifs_tcon *tcon;
3270958b
SF
1067 __u32 dosattr, origattr;
1068 FILE_BASIC_INFO *info_buf = NULL;
a12a1ac7 1069
7ffec372
JL
1070 tlink = cifs_sb_tlink(cifs_sb);
1071 if (IS_ERR(tlink))
1072 return PTR_ERR(tlink);
1073 tcon = tlink_tcon(tlink);
1074
c483a984
SP
1075 /*
1076 * We cannot rename the file if the server doesn't support
1077 * CAP_INFOLEVEL_PASSTHRU
1078 */
1079 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1080 rc = -EBUSY;
1081 goto out;
1082 }
1083
d81b8a40
PS
1084 oparms.tcon = tcon;
1085 oparms.cifs_sb = cifs_sb;
1086 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1087 oparms.create_options = CREATE_NOT_DIR;
1088 oparms.disposition = FILE_OPEN;
1089 oparms.path = full_path;
1090 oparms.fid = &fid;
1091 oparms.reconnect = false;
1092
1093 rc = CIFS_open(xid, &oparms, &oplock, NULL);
a12a1ac7
JL
1094 if (rc != 0)
1095 goto out;
1096
3270958b
SF
1097 origattr = cifsInode->cifsAttrs;
1098 if (origattr == 0)
1099 origattr |= ATTR_NORMAL;
1100
1101 dosattr = origattr & ~ATTR_READONLY;
a12a1ac7
JL
1102 if (dosattr == 0)
1103 dosattr |= ATTR_NORMAL;
1104 dosattr |= ATTR_HIDDEN;
1105
3270958b
SF
1106 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1107 if (dosattr != origattr) {
1108 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1109 if (info_buf == NULL) {
1110 rc = -ENOMEM;
1111 goto out_close;
1112 }
1113 info_buf->Attributes = cpu_to_le32(dosattr);
d81b8a40 1114 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
3270958b
SF
1115 current->tgid);
1116 /* although we would like to mark the file hidden
1117 if that fails we will still try to rename it */
72d282dc 1118 if (!rc)
3270958b
SF
1119 cifsInode->cifsAttrs = dosattr;
1120 else
1121 dosattr = origattr; /* since not able to change them */
a12a1ac7 1122 }
a12a1ac7 1123
dd1db2de 1124 /* rename the file */
d81b8a40
PS
1125 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1126 cifs_sb->local_nls,
a12a1ac7
JL
1127 cifs_sb->mnt_cifs_flags &
1128 CIFS_MOUNT_MAP_SPECIAL_CHR);
3270958b 1129 if (rc != 0) {
47c78f4a 1130 rc = -EBUSY;
3270958b
SF
1131 goto undo_setattr;
1132 }
6d22f098 1133
3270958b 1134 /* try to set DELETE_ON_CLOSE */
aff8d5ca 1135 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
d81b8a40 1136 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
3270958b
SF
1137 current->tgid);
1138 /*
1139 * some samba versions return -ENOENT when we try to set the
1140 * file disposition here. Likely a samba bug, but work around
1141 * it for now. This means that some cifsXXX files may hang
1142 * around after they shouldn't.
1143 *
1144 * BB: remove this hack after more servers have the fix
1145 */
1146 if (rc == -ENOENT)
1147 rc = 0;
1148 else if (rc != 0) {
47c78f4a 1149 rc = -EBUSY;
3270958b
SF
1150 goto undo_rename;
1151 }
aff8d5ca 1152 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
3270958b 1153 }
7ce86d5a 1154
a12a1ac7 1155out_close:
d81b8a40 1156 CIFSSMBClose(xid, tcon, fid.netfid);
a12a1ac7 1157out:
3270958b 1158 kfree(info_buf);
7ffec372 1159 cifs_put_tlink(tlink);
a12a1ac7 1160 return rc;
3270958b
SF
1161
1162 /*
1163 * reset everything back to the original state. Don't bother
1164 * dealing with errors here since we can't do anything about
1165 * them anyway.
1166 */
1167undo_rename:
d81b8a40 1168 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
3270958b
SF
1169 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1170 CIFS_MOUNT_MAP_SPECIAL_CHR);
1171undo_setattr:
1172 if (dosattr != origattr) {
1173 info_buf->Attributes = cpu_to_le32(origattr);
d81b8a40 1174 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
3270958b
SF
1175 current->tgid))
1176 cifsInode->cifsAttrs = origattr;
1177 }
1178
1179 goto out_close;
a12a1ac7
JL
1180}
1181
b7ca6928
SF
1182/* copied from fs/nfs/dir.c with small changes */
1183static void
1184cifs_drop_nlink(struct inode *inode)
1185{
1186 spin_lock(&inode->i_lock);
1187 if (inode->i_nlink > 0)
1188 drop_nlink(inode);
1189 spin_unlock(&inode->i_lock);
1190}
ff694527
SF
1191
1192/*
1193 * If dentry->d_inode is null (usually meaning the cached dentry
1194 * is a negative dentry) then we would attempt a standard SMB delete, but
af901ca1
AGR
1195 * if that fails we can not attempt the fall back mechanisms on EACCESS
1196 * but will return the EACCESS to the caller. Note that the VFS does not call
ff694527
SF
1197 * unlink on negative dentries currently.
1198 */
5f0319a7 1199int cifs_unlink(struct inode *dir, struct dentry *dentry)
1da177e4
LT
1200{
1201 int rc = 0;
6d5786a3 1202 unsigned int xid;
1da177e4 1203 char *full_path = NULL;
5f0319a7 1204 struct inode *inode = dentry->d_inode;
ff694527 1205 struct cifsInodeInfo *cifs_inode;
5f0319a7
JL
1206 struct super_block *sb = dir->i_sb;
1207 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
7ffec372 1208 struct tcon_link *tlink;
96daf2b0 1209 struct cifs_tcon *tcon;
ed6875e0 1210 struct TCP_Server_Info *server;
6050247d
SF
1211 struct iattr *attrs = NULL;
1212 __u32 dosattr = 0, origattr = 0;
1da177e4 1213
f96637be 1214 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1da177e4 1215
7ffec372
JL
1216 tlink = cifs_sb_tlink(cifs_sb);
1217 if (IS_ERR(tlink))
1218 return PTR_ERR(tlink);
1219 tcon = tlink_tcon(tlink);
ed6875e0 1220 server = tcon->ses->server;
7ffec372 1221
6d5786a3 1222 xid = get_xid();
1da177e4 1223
5f0319a7
JL
1224 /* Unlink can be called from rename so we can not take the
1225 * sb->s_vfs_rename_mutex here */
1226 full_path = build_path_from_dentry(dentry);
1da177e4 1227 if (full_path == NULL) {
0f3bc09e 1228 rc = -ENOMEM;
7ffec372 1229 goto unlink_out;
1da177e4 1230 }
2d785a50 1231
29e20f9c
PS
1232 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1233 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
5f0319a7 1234 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
2d785a50 1235 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
737b758c 1236 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
f96637be 1237 cifs_dbg(FYI, "posix del rc %d\n", rc);
2d785a50
SF
1238 if ((rc == 0) || (rc == -ENOENT))
1239 goto psx_del_no_retry;
1240 }
1da177e4 1241
6050247d 1242retry_std_delete:
ed6875e0
PS
1243 if (!server->ops->unlink) {
1244 rc = -ENOSYS;
1245 goto psx_del_no_retry;
1246 }
1247
1248 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
6050247d 1249
2d785a50 1250psx_del_no_retry:
1da177e4 1251 if (!rc) {
5f0319a7 1252 if (inode)
b7ca6928 1253 cifs_drop_nlink(inode);
1da177e4 1254 } else if (rc == -ENOENT) {
5f0319a7 1255 d_drop(dentry);
47c78f4a 1256 } else if (rc == -EBUSY) {
ed6875e0
PS
1257 if (server->ops->rename_pending_delete) {
1258 rc = server->ops->rename_pending_delete(full_path,
1259 dentry, xid);
1260 if (rc == 0)
1261 cifs_drop_nlink(inode);
1262 }
ff694527 1263 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
388e57b2
SF
1264 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1265 if (attrs == NULL) {
1266 rc = -ENOMEM;
1267 goto out_reval;
1da177e4 1268 }
388e57b2
SF
1269
1270 /* try to reset dos attributes */
ff694527
SF
1271 cifs_inode = CIFS_I(inode);
1272 origattr = cifs_inode->cifsAttrs;
6050247d
SF
1273 if (origattr == 0)
1274 origattr |= ATTR_NORMAL;
1275 dosattr = origattr & ~ATTR_READONLY;
388e57b2
SF
1276 if (dosattr == 0)
1277 dosattr |= ATTR_NORMAL;
1278 dosattr |= ATTR_HIDDEN;
1279
1280 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
388e57b2
SF
1281 if (rc != 0)
1282 goto out_reval;
6050247d
SF
1283
1284 goto retry_std_delete;
1da177e4 1285 }
6050247d
SF
1286
1287 /* undo the setattr if we errored out and it's needed */
1288 if (rc != 0 && dosattr != 0)
1289 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1290
388e57b2 1291out_reval:
4523cc30 1292 if (inode) {
ff694527
SF
1293 cifs_inode = CIFS_I(inode);
1294 cifs_inode->time = 0; /* will force revalidate to get info
5f0319a7
JL
1295 when needed */
1296 inode->i_ctime = current_fs_time(sb);
06bcfedd 1297 }
5f0319a7 1298 dir->i_ctime = dir->i_mtime = current_fs_time(sb);
ff694527 1299 cifs_inode = CIFS_I(dir);
6050247d 1300 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
7ffec372 1301unlink_out:
1da177e4 1302 kfree(full_path);
6050247d 1303 kfree(attrs);
6d5786a3 1304 free_xid(xid);
7ffec372 1305 cifs_put_tlink(tlink);
1da177e4
LT
1306 return rc;
1307}
1308
ff691e96 1309static int
101b92d9 1310cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
ff691e96
PS
1311 const char *full_path, struct cifs_sb_info *cifs_sb,
1312 struct cifs_tcon *tcon, const unsigned int xid)
1313{
1314 int rc = 0;
101b92d9 1315 struct inode *inode = NULL;
ff691e96
PS
1316
1317 if (tcon->unix_ext)
101b92d9 1318 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
ff691e96
PS
1319 xid);
1320 else
101b92d9
JL
1321 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1322 xid, NULL);
1323
ff691e96
PS
1324 if (rc)
1325 return rc;
1326
ff691e96
PS
1327 /*
1328 * setting nlink not necessary except in cases where we failed to get it
101b92d9
JL
1329 * from the server or was set bogus. Also, since this is a brand new
1330 * inode, no need to grab the i_lock before setting the i_nlink.
ff691e96 1331 */
101b92d9
JL
1332 if (inode->i_nlink < 2)
1333 set_nlink(inode, 2);
ff691e96
PS
1334 mode &= ~current_umask();
1335 /* must turn on setgid bit if parent dir has it */
101b92d9 1336 if (parent->i_mode & S_ISGID)
ff691e96
PS
1337 mode |= S_ISGID;
1338
1339 if (tcon->unix_ext) {
1340 struct cifs_unix_set_info_args args = {
1341 .mode = mode,
1342 .ctime = NO_CHANGE_64,
1343 .atime = NO_CHANGE_64,
1344 .mtime = NO_CHANGE_64,
1345 .device = 0,
1346 };
1347 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
49418b2c 1348 args.uid = current_fsuid();
101b92d9 1349 if (parent->i_mode & S_ISGID)
49418b2c 1350 args.gid = parent->i_gid;
ff691e96 1351 else
49418b2c 1352 args.gid = current_fsgid();
ff691e96 1353 } else {
49418b2c
EB
1354 args.uid = INVALID_UID; /* no change */
1355 args.gid = INVALID_GID; /* no change */
ff691e96
PS
1356 }
1357 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1358 cifs_sb->local_nls,
1359 cifs_sb->mnt_cifs_flags &
1360 CIFS_MOUNT_MAP_SPECIAL_CHR);
1361 } else {
f436720e 1362 struct TCP_Server_Info *server = tcon->ses->server;
ff691e96 1363 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
f436720e 1364 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
101b92d9 1365 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
f436720e 1366 tcon, xid);
101b92d9
JL
1367 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1368 inode->i_mode = (mode | S_IFDIR);
1369
1370 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1371 inode->i_uid = current_fsuid();
1372 if (inode->i_mode & S_ISGID)
1373 inode->i_gid = parent->i_gid;
1374 else
1375 inode->i_gid = current_fsgid();
ff691e96
PS
1376 }
1377 }
101b92d9 1378 d_instantiate(dentry, inode);
ff691e96
PS
1379 return rc;
1380}
1381
1382static int
1383cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1384 const char *full_path, struct cifs_sb_info *cifs_sb,
1385 struct cifs_tcon *tcon, const unsigned int xid)
1386{
1387 int rc = 0;
1388 u32 oplock = 0;
1389 FILE_UNIX_BASIC_INFO *info = NULL;
1390 struct inode *newinode = NULL;
1391 struct cifs_fattr fattr;
1392
1393 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1394 if (info == NULL) {
1395 rc = -ENOMEM;
1396 goto posix_mkdir_out;
1397 }
1398
1399 mode &= ~current_umask();
1400 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1401 NULL /* netfid */, info, &oplock, full_path,
1402 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1403 CIFS_MOUNT_MAP_SPECIAL_CHR);
1404 if (rc == -EOPNOTSUPP)
1405 goto posix_mkdir_out;
1406 else if (rc) {
f96637be 1407 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
ff691e96
PS
1408 d_drop(dentry);
1409 goto posix_mkdir_out;
1410 }
1411
1412 if (info->Type == cpu_to_le32(-1))
1413 /* no return info, go query for it */
1414 goto posix_mkdir_get_info;
1415 /*
1416 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1417 * need to set uid/gid.
1418 */
1419
1420 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1421 cifs_fill_uniqueid(inode->i_sb, &fattr);
1422 newinode = cifs_iget(inode->i_sb, &fattr);
1423 if (!newinode)
1424 goto posix_mkdir_get_info;
1425
1426 d_instantiate(dentry, newinode);
1427
1428#ifdef CONFIG_CIFS_DEBUG2
35c265e0
AV
1429 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1430 dentry, dentry, newinode);
ff691e96
PS
1431
1432 if (newinode->i_nlink != 2)
f96637be
JP
1433 cifs_dbg(FYI, "unexpected number of links %d\n",
1434 newinode->i_nlink);
ff691e96
PS
1435#endif
1436
1437posix_mkdir_out:
1438 kfree(info);
1439 return rc;
1440posix_mkdir_get_info:
1441 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1442 xid);
1443 goto posix_mkdir_out;
1444}
1445
18bb1db3 1446int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
1da177e4 1447{
ff691e96 1448 int rc = 0;
6d5786a3 1449 unsigned int xid;
1da177e4 1450 struct cifs_sb_info *cifs_sb;
7ffec372 1451 struct tcon_link *tlink;
29e20f9c 1452 struct cifs_tcon *tcon;
f436720e 1453 struct TCP_Server_Info *server;
ff691e96 1454 char *full_path;
1da177e4 1455
f96637be
JP
1456 cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n",
1457 mode, inode);
1da177e4 1458
1da177e4 1459 cifs_sb = CIFS_SB(inode->i_sb);
7ffec372
JL
1460 tlink = cifs_sb_tlink(cifs_sb);
1461 if (IS_ERR(tlink))
1462 return PTR_ERR(tlink);
29e20f9c 1463 tcon = tlink_tcon(tlink);
7ffec372 1464
6d5786a3 1465 xid = get_xid();
1da177e4 1466
7f57356b 1467 full_path = build_path_from_dentry(direntry);
1da177e4 1468 if (full_path == NULL) {
0f3bc09e 1469 rc = -ENOMEM;
7ffec372 1470 goto mkdir_out;
1da177e4 1471 }
50c2f753 1472
29e20f9c
PS
1473 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1474 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
ff691e96
PS
1475 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1476 tcon, xid);
1477 if (rc != -EOPNOTSUPP)
2dd29d31 1478 goto mkdir_out;
fb8c4b14 1479 }
ff691e96 1480
f436720e
PS
1481 server = tcon->ses->server;
1482
1483 if (!server->ops->mkdir) {
1484 rc = -ENOSYS;
1485 goto mkdir_out;
1486 }
1487
1da177e4 1488 /* BB add setting the equivalent of mode via CreateX w/ACLs */
f436720e 1489 rc = server->ops->mkdir(xid, tcon, full_path, cifs_sb);
1da177e4 1490 if (rc) {
f96637be 1491 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1da177e4 1492 d_drop(direntry);
ff691e96 1493 goto mkdir_out;
1da177e4 1494 }
ff691e96
PS
1495
1496 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1497 xid);
fb8c4b14 1498mkdir_out:
6de2ce42
PS
1499 /*
1500 * Force revalidate to get parent dir info when needed since cached
1501 * attributes are invalid now.
1502 */
1503 CIFS_I(inode)->time = 0;
1da177e4 1504 kfree(full_path);
6d5786a3 1505 free_xid(xid);
7ffec372 1506 cifs_put_tlink(tlink);
1da177e4
LT
1507 return rc;
1508}
1509
1510int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1511{
1512 int rc = 0;
6d5786a3 1513 unsigned int xid;
1da177e4 1514 struct cifs_sb_info *cifs_sb;
7ffec372 1515 struct tcon_link *tlink;
f958ca5d
PS
1516 struct cifs_tcon *tcon;
1517 struct TCP_Server_Info *server;
1da177e4
LT
1518 char *full_path = NULL;
1519 struct cifsInodeInfo *cifsInode;
1520
f96637be 1521 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1da177e4 1522
6d5786a3 1523 xid = get_xid();
1da177e4 1524
7f57356b 1525 full_path = build_path_from_dentry(direntry);
1da177e4 1526 if (full_path == NULL) {
0f3bc09e 1527 rc = -ENOMEM;
7ffec372 1528 goto rmdir_exit;
1da177e4
LT
1529 }
1530
7ffec372
JL
1531 cifs_sb = CIFS_SB(inode->i_sb);
1532 tlink = cifs_sb_tlink(cifs_sb);
1533 if (IS_ERR(tlink)) {
1534 rc = PTR_ERR(tlink);
1535 goto rmdir_exit;
1536 }
f958ca5d
PS
1537 tcon = tlink_tcon(tlink);
1538 server = tcon->ses->server;
1539
1540 if (!server->ops->rmdir) {
1541 rc = -ENOSYS;
1542 cifs_put_tlink(tlink);
1543 goto rmdir_exit;
1544 }
7ffec372 1545
f958ca5d 1546 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
7ffec372 1547 cifs_put_tlink(tlink);
1da177e4
LT
1548
1549 if (!rc) {
3677db10 1550 spin_lock(&direntry->d_inode->i_lock);
fb8c4b14 1551 i_size_write(direntry->d_inode, 0);
ce71ec36 1552 clear_nlink(direntry->d_inode);
3677db10 1553 spin_unlock(&direntry->d_inode->i_lock);
1da177e4
LT
1554 }
1555
1556 cifsInode = CIFS_I(direntry->d_inode);
6de2ce42
PS
1557 /* force revalidate to go get info when needed */
1558 cifsInode->time = 0;
42c24544
SF
1559
1560 cifsInode = CIFS_I(inode);
6de2ce42
PS
1561 /*
1562 * Force revalidate to get parent dir info when needed since cached
1563 * attributes are invalid now.
1564 */
1565 cifsInode->time = 0;
42c24544 1566
1da177e4
LT
1567 direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
1568 current_fs_time(inode->i_sb);
1569
7ffec372 1570rmdir_exit:
1da177e4 1571 kfree(full_path);
6d5786a3 1572 free_xid(xid);
1da177e4
LT
1573 return rc;
1574}
1575
ee2fd967 1576static int
8ceb9843
PS
1577cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1578 const char *from_path, struct dentry *to_dentry,
1579 const char *to_path)
ee2fd967
SF
1580{
1581 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
7ffec372 1582 struct tcon_link *tlink;
8ceb9843
PS
1583 struct cifs_tcon *tcon;
1584 struct TCP_Server_Info *server;
d81b8a40
PS
1585 struct cifs_fid fid;
1586 struct cifs_open_parms oparms;
ee2fd967
SF
1587 int oplock, rc;
1588
7ffec372
JL
1589 tlink = cifs_sb_tlink(cifs_sb);
1590 if (IS_ERR(tlink))
1591 return PTR_ERR(tlink);
8ceb9843
PS
1592 tcon = tlink_tcon(tlink);
1593 server = tcon->ses->server;
1594
1595 if (!server->ops->rename)
1596 return -ENOSYS;
7ffec372 1597
ee2fd967 1598 /* try path-based rename first */
8ceb9843 1599 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
ee2fd967
SF
1600
1601 /*
8ceb9843
PS
1602 * Don't bother with rename by filehandle unless file is busy and
1603 * source. Note that cross directory moves do not work with
ee2fd967
SF
1604 * rename by filehandle to various Windows servers.
1605 */
47c78f4a 1606 if (rc == 0 || rc != -EBUSY)
7ffec372 1607 goto do_rename_exit;
ee2fd967 1608
ed0e3ace
JL
1609 /* open-file renames don't work across directories */
1610 if (to_dentry->d_parent != from_dentry->d_parent)
7ffec372 1611 goto do_rename_exit;
ed0e3ace 1612
d81b8a40
PS
1613 oparms.tcon = tcon;
1614 oparms.cifs_sb = cifs_sb;
ee2fd967 1615 /* open the file to be renamed -- we need DELETE perms */
d81b8a40
PS
1616 oparms.desired_access = DELETE;
1617 oparms.create_options = CREATE_NOT_DIR;
1618 oparms.disposition = FILE_OPEN;
1619 oparms.path = from_path;
1620 oparms.fid = &fid;
1621 oparms.reconnect = false;
1622
1623 rc = CIFS_open(xid, &oparms, &oplock, NULL);
ee2fd967 1624 if (rc == 0) {
d81b8a40 1625 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
ee2fd967
SF
1626 (const char *) to_dentry->d_name.name,
1627 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1628 CIFS_MOUNT_MAP_SPECIAL_CHR);
d81b8a40 1629 CIFSSMBClose(xid, tcon, fid.netfid);
ee2fd967 1630 }
7ffec372
JL
1631do_rename_exit:
1632 cifs_put_tlink(tlink);
ee2fd967
SF
1633 return rc;
1634}
1635
8ceb9843 1636int
7c33d597
MS
1637cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
1638 struct inode *target_dir, struct dentry *target_dentry,
1639 unsigned int flags)
1da177e4 1640{
8ceb9843
PS
1641 char *from_name = NULL;
1642 char *to_name = NULL;
639e7a91 1643 struct cifs_sb_info *cifs_sb;
7ffec372 1644 struct tcon_link *tlink;
96daf2b0 1645 struct cifs_tcon *tcon;
ee2fd967
SF
1646 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
1647 FILE_UNIX_BASIC_INFO *info_buf_target;
6d5786a3
PS
1648 unsigned int xid;
1649 int rc, tmprc;
1da177e4 1650
7c33d597
MS
1651 if (flags & ~RENAME_NOREPLACE)
1652 return -EINVAL;
1653
639e7a91 1654 cifs_sb = CIFS_SB(source_dir->i_sb);
7ffec372
JL
1655 tlink = cifs_sb_tlink(cifs_sb);
1656 if (IS_ERR(tlink))
1657 return PTR_ERR(tlink);
1658 tcon = tlink_tcon(tlink);
1da177e4 1659
6d5786a3 1660 xid = get_xid();
ee2fd967 1661
ee2fd967
SF
1662 /*
1663 * we already have the rename sem so we do not need to
1664 * grab it again here to protect the path integrity
1665 */
8ceb9843
PS
1666 from_name = build_path_from_dentry(source_dentry);
1667 if (from_name == NULL) {
ee2fd967
SF
1668 rc = -ENOMEM;
1669 goto cifs_rename_exit;
1670 }
1671
8ceb9843
PS
1672 to_name = build_path_from_dentry(target_dentry);
1673 if (to_name == NULL) {
1da177e4
LT
1674 rc = -ENOMEM;
1675 goto cifs_rename_exit;
1676 }
1677
8ceb9843
PS
1678 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
1679 to_name);
ee2fd967 1680
7c33d597
MS
1681 /*
1682 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
1683 */
1684 if (flags & RENAME_NOREPLACE)
1685 goto cifs_rename_exit;
1686
14121bdc
JL
1687 if (rc == -EEXIST && tcon->unix_ext) {
1688 /*
8ceb9843
PS
1689 * Are src and dst hardlinks of same inode? We can only tell
1690 * with unix extensions enabled.
14121bdc
JL
1691 */
1692 info_buf_source =
1693 kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO),
1694 GFP_KERNEL);
1695 if (info_buf_source == NULL) {
1696 rc = -ENOMEM;
1697 goto cifs_rename_exit;
1698 }
1699
1700 info_buf_target = info_buf_source + 1;
8ceb9843
PS
1701 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
1702 info_buf_source,
1703 cifs_sb->local_nls,
1704 cifs_sb->mnt_cifs_flags &
1705 CIFS_MOUNT_MAP_SPECIAL_CHR);
8d281efb 1706 if (tmprc != 0)
14121bdc 1707 goto unlink_target;
ee2fd967 1708
8ceb9843
PS
1709 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
1710 info_buf_target,
1711 cifs_sb->local_nls,
1712 cifs_sb->mnt_cifs_flags &
1713 CIFS_MOUNT_MAP_SPECIAL_CHR);
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
JL
1728 /* Try unlinking the target dentry if it's not negative */
1729 if (target_dentry->d_inode && (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;
df2cf170
JL
1869 struct inode *inode = dentry->d_inode;
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;
1921 struct inode *inode = dentry->d_inode;
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);
6feb9891
PS
1935 struct inode *inode = dentry->d_inode;
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,
8efdbde6 2078 cifs_sb->mnt_cifs_flags &
d1433418
PS
2079 CIFS_MOUNT_MAP_SPECIAL_CHR);
2080 if (rc == 0) {
2081 unsigned int bytes_written;
2082
2083 io_parms.netfid = netfid;
2084 io_parms.pid = current->tgid;
2085 io_parms.tcon = tcon;
2086 io_parms.offset = 0;
2087 io_parms.length = attrs->ia_size;
2088 rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, NULL,
2089 NULL, 1);
f96637be 2090 cifs_dbg(FYI, "wrt seteof rc %d\n", rc);
d1433418 2091 CIFSSMBClose(xid, tcon, netfid);
8efdbde6
JL
2092 }
2093 }
d1433418
PS
2094 if (tlink)
2095 cifs_put_tlink(tlink);
8efdbde6 2096
d1433418 2097set_size_out:
8efdbde6 2098 if (rc == 0) {
fbec9ab9 2099 cifsInode->server_eof = attrs->ia_size;
1b947463 2100 cifs_setsize(inode, attrs->ia_size);
8efdbde6
JL
2101 cifs_truncate_page(inode->i_mapping, inode->i_size);
2102 }
2103
2104 return rc;
2105}
2106
3fe5c1dd
JL
2107static int
2108cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2109{
2110 int rc;
6d5786a3 2111 unsigned int xid;
3fe5c1dd
JL
2112 char *full_path = NULL;
2113 struct inode *inode = direntry->d_inode;
2114 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2115 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
7ffec372 2116 struct tcon_link *tlink;
96daf2b0 2117 struct cifs_tcon *pTcon;
3fe5c1dd 2118 struct cifs_unix_set_info_args *args = NULL;
3bbeeb3c 2119 struct cifsFileInfo *open_file;
3fe5c1dd 2120
35c265e0
AV
2121 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2122 direntry, attrs->ia_valid);
3fe5c1dd 2123
6d5786a3 2124 xid = get_xid();
3fe5c1dd 2125
db78b877
CH
2126 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2127 attrs->ia_valid |= ATTR_FORCE;
2128
2129 rc = inode_change_ok(inode, attrs);
2130 if (rc < 0)
2131 goto out;
3fe5c1dd
JL
2132
2133 full_path = build_path_from_dentry(direntry);
2134 if (full_path == NULL) {
2135 rc = -ENOMEM;
2136 goto out;
2137 }
2138
0f4d634c
JL
2139 /*
2140 * Attempt to flush data before changing attributes. We need to do
2141 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2142 * ownership or mode then we may also need to do this. Here, we take
2143 * the safe way out and just do the flush on all setattr requests. If
2144 * the flush returns error, store it to report later and continue.
2145 *
2146 * BB: This should be smarter. Why bother flushing pages that
2147 * will be truncated anyway? Also, should we error out here if
2148 * the flush returns error?
2149 */
2150 rc = filemap_write_and_wait(inode->i_mapping);
eb4b756b
JL
2151 mapping_set_error(inode->i_mapping, rc);
2152 rc = 0;
3fe5c1dd
JL
2153
2154 if (attrs->ia_valid & ATTR_SIZE) {
2155 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2156 if (rc != 0)
2157 goto out;
2158 }
2159
2160 /* skip mode change if it's just for clearing setuid/setgid */
2161 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2162 attrs->ia_valid &= ~ATTR_MODE;
2163
2164 args = kmalloc(sizeof(*args), GFP_KERNEL);
2165 if (args == NULL) {
2166 rc = -ENOMEM;
2167 goto out;
2168 }
2169
2170 /* set up the struct */
2171 if (attrs->ia_valid & ATTR_MODE)
2172 args->mode = attrs->ia_mode;
2173 else
2174 args->mode = NO_CHANGE_64;
2175
2176 if (attrs->ia_valid & ATTR_UID)
2177 args->uid = attrs->ia_uid;
2178 else
49418b2c 2179 args->uid = INVALID_UID; /* no change */
3fe5c1dd
JL
2180
2181 if (attrs->ia_valid & ATTR_GID)
2182 args->gid = attrs->ia_gid;
2183 else
49418b2c 2184 args->gid = INVALID_GID; /* no change */
3fe5c1dd
JL
2185
2186 if (attrs->ia_valid & ATTR_ATIME)
2187 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2188 else
2189 args->atime = NO_CHANGE_64;
2190
2191 if (attrs->ia_valid & ATTR_MTIME)
2192 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2193 else
2194 args->mtime = NO_CHANGE_64;
2195
2196 if (attrs->ia_valid & ATTR_CTIME)
2197 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2198 else
2199 args->ctime = NO_CHANGE_64;
2200
2201 args->device = 0;
6508d904 2202 open_file = find_writable_file(cifsInode, true);
3bbeeb3c 2203 if (open_file) {
4b4de76e 2204 u16 nfid = open_file->fid.netfid;
3bbeeb3c 2205 u32 npid = open_file->pid;
13cfb733 2206 pTcon = tlink_tcon(open_file->tlink);
3bbeeb3c 2207 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
6ab409b5 2208 cifsFileInfo_put(open_file);
3bbeeb3c 2209 } else {
7ffec372
JL
2210 tlink = cifs_sb_tlink(cifs_sb);
2211 if (IS_ERR(tlink)) {
2212 rc = PTR_ERR(tlink);
2213 goto out;
2214 }
2215 pTcon = tlink_tcon(tlink);
3bbeeb3c 2216 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
01ea95e3
JL
2217 cifs_sb->local_nls,
2218 cifs_sb->mnt_cifs_flags &
2219 CIFS_MOUNT_MAP_SPECIAL_CHR);
7ffec372 2220 cifs_put_tlink(tlink);
3bbeeb3c 2221 }
3fe5c1dd 2222
1025774c
CH
2223 if (rc)
2224 goto out;
ccd4bb1b 2225
1025774c 2226 if ((attrs->ia_valid & ATTR_SIZE) &&
1b947463
CH
2227 attrs->ia_size != i_size_read(inode))
2228 truncate_setsize(inode, attrs->ia_size);
1025774c
CH
2229
2230 setattr_copy(inode, attrs);
2231 mark_inode_dirty(inode);
2232
2233 /* force revalidate when any of these times are set since some
2234 of the fs types (eg ext3, fat) do not have fine enough
2235 time granularity to match protocol, and we do not have a
2236 a way (yet) to query the server fs's time granularity (and
2237 whether it rounds times down).
2238 */
2239 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2240 cifsInode->time = 0;
3fe5c1dd
JL
2241out:
2242 kfree(args);
2243 kfree(full_path);
6d5786a3 2244 free_xid(xid);
3fe5c1dd
JL
2245 return rc;
2246}
2247
0510eeb7
JL
2248static int
2249cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
1da177e4 2250{
6d5786a3 2251 unsigned int xid;
8abf2775
EB
2252 kuid_t uid = INVALID_UID;
2253 kgid_t gid = INVALID_GID;
3fe5c1dd
JL
2254 struct inode *inode = direntry->d_inode;
2255 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3fe5c1dd 2256 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1da177e4
LT
2257 char *full_path = NULL;
2258 int rc = -EACCES;
feb3e20c 2259 __u32 dosattr = 0;
4e1e7fb9 2260 __u64 mode = NO_CHANGE_64;
3fe5c1dd 2261
6d5786a3 2262 xid = get_xid();
1da177e4 2263
35c265e0
AV
2264 cifs_dbg(FYI, "setattr on file %pd attrs->iavalid 0x%x\n",
2265 direntry, attrs->ia_valid);
6473a559 2266
db78b877
CH
2267 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2268 attrs->ia_valid |= ATTR_FORCE;
2269
2270 rc = inode_change_ok(inode, attrs);
2271 if (rc < 0) {
6d5786a3 2272 free_xid(xid);
db78b877 2273 return rc;
6473a559 2274 }
50c2f753 2275
7f57356b 2276 full_path = build_path_from_dentry(direntry);
1da177e4 2277 if (full_path == NULL) {
0f3bc09e 2278 rc = -ENOMEM;
6d5786a3 2279 free_xid(xid);
0f3bc09e 2280 return rc;
1da177e4 2281 }
1da177e4 2282
0f4d634c
JL
2283 /*
2284 * Attempt to flush data before changing attributes. We need to do
2285 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2286 * ownership or mode then we may also need to do this. Here, we take
2287 * the safe way out and just do the flush on all setattr requests. If
2288 * the flush returns error, store it to report later and continue.
2289 *
2290 * BB: This should be smarter. Why bother flushing pages that
2291 * will be truncated anyway? Also, should we error out here if
2292 * the flush returns error?
2293 */
2294 rc = filemap_write_and_wait(inode->i_mapping);
eb4b756b
JL
2295 mapping_set_error(inode->i_mapping, rc);
2296 rc = 0;
cea21805 2297
50531444 2298 if (attrs->ia_valid & ATTR_SIZE) {
8efdbde6
JL
2299 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2300 if (rc != 0)
e30dcf3a 2301 goto cifs_setattr_exit;
1da177e4 2302 }
4ca691a8 2303
a5ff3769
SP
2304 if (attrs->ia_valid & ATTR_UID)
2305 uid = attrs->ia_uid;
2306
2307 if (attrs->ia_valid & ATTR_GID)
2308 gid = attrs->ia_gid;
2309
2310#ifdef CONFIG_CIFS_ACL
2311 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
8abf2775 2312 if (uid_valid(uid) || gid_valid(gid)) {
a5ff3769
SP
2313 rc = id_mode_to_cifs_acl(inode, full_path, NO_CHANGE_64,
2314 uid, gid);
2315 if (rc) {
f96637be
JP
2316 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2317 __func__, rc);
a5ff3769
SP
2318 goto cifs_setattr_exit;
2319 }
2320 }
2321 } else
2322#endif /* CONFIG_CIFS_ACL */
3fe5c1dd 2323 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
4ca691a8 2324 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
1da177e4 2325
d32c4f26
JL
2326 /* skip mode change if it's just for clearing setuid/setgid */
2327 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2328 attrs->ia_valid &= ~ATTR_MODE;
2329
1da177e4 2330 if (attrs->ia_valid & ATTR_MODE) {
1da177e4 2331 mode = attrs->ia_mode;
cdbce9c8 2332 rc = 0;
79df1bae 2333#ifdef CONFIG_CIFS_ACL
78415d2d 2334 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
a5ff3769 2335 rc = id_mode_to_cifs_acl(inode, full_path, mode,
8abf2775 2336 INVALID_UID, INVALID_GID);
78415d2d 2337 if (rc) {
f96637be
JP
2338 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2339 __func__, rc);
78415d2d
SP
2340 goto cifs_setattr_exit;
2341 }
2342 } else
79df1bae 2343#endif /* CONFIG_CIFS_ACL */
5132861a
JL
2344 if (((mode & S_IWUGO) == 0) &&
2345 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
feb3e20c
JL
2346
2347 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2348
5132861a
JL
2349 /* fix up mode if we're not using dynperm */
2350 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2351 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2352 } else if ((mode & S_IWUGO) &&
2353 (cifsInode->cifsAttrs & ATTR_READONLY)) {
feb3e20c
JL
2354
2355 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2356 /* Attributes of 0 are ignored */
2357 if (dosattr == 0)
2358 dosattr |= ATTR_NORMAL;
5132861a
JL
2359
2360 /* reset local inode permissions to normal */
2361 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2362 attrs->ia_mode &= ~(S_IALLUGO);
2363 if (S_ISDIR(inode->i_mode))
2364 attrs->ia_mode |=
2365 cifs_sb->mnt_dir_mode;
2366 else
2367 attrs->ia_mode |=
2368 cifs_sb->mnt_file_mode;
2369 }
2370 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2371 /* ignore mode change - ATTR_READONLY hasn't changed */
2372 attrs->ia_valid &= ~ATTR_MODE;
1da177e4 2373 }
1da177e4
LT
2374 }
2375
feb3e20c
JL
2376 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2377 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2378 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2379 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
1da177e4 2380
e30dcf3a
SF
2381 /* Even if error on time set, no sense failing the call if
2382 the server would set the time to a reasonable value anyway,
2383 and this check ensures that we are not being called from
2384 sys_utimes in which case we ought to fail the call back to
2385 the user when the server rejects the call */
fb8c4b14 2386 if ((rc) && (attrs->ia_valid &
feb3e20c 2387 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
e30dcf3a 2388 rc = 0;
1da177e4
LT
2389 }
2390
2391 /* do not need local check to inode_check_ok since the server does
2392 that */
1025774c
CH
2393 if (rc)
2394 goto cifs_setattr_exit;
2395
2396 if ((attrs->ia_valid & ATTR_SIZE) &&
1b947463
CH
2397 attrs->ia_size != i_size_read(inode))
2398 truncate_setsize(inode, attrs->ia_size);
1025774c
CH
2399
2400 setattr_copy(inode, attrs);
2401 mark_inode_dirty(inode);
1025774c 2402
e30dcf3a 2403cifs_setattr_exit:
1da177e4 2404 kfree(full_path);
6d5786a3 2405 free_xid(xid);
1da177e4
LT
2406 return rc;
2407}
2408
0510eeb7
JL
2409int
2410cifs_setattr(struct dentry *direntry, struct iattr *attrs)
2411{
2412 struct inode *inode = direntry->d_inode;
2413 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
96daf2b0 2414 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
0510eeb7
JL
2415
2416 if (pTcon->unix_ext)
2417 return cifs_setattr_unix(direntry, attrs);
2418
2419 return cifs_setattr_nounix(direntry, attrs);
2420
2421 /* BB: add cifs_setattr_legacy for really old servers */
2422}
2423
99ee4dbd 2424#if 0
1da177e4
LT
2425void cifs_delete_inode(struct inode *inode)
2426{
f96637be 2427 cifs_dbg(FYI, "In cifs_delete_inode, inode = 0x%p\n", inode);
1da177e4
LT
2428 /* may have to add back in if and when safe distributed caching of
2429 directories added e.g. via FindNotify */
2430}
99ee4dbd 2431#endif
This page took 0.991331 seconds and 4 git commands to generate.