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