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