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