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