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