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