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