[CIFS] Missing line from previous commit
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / cifs / inode.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/inode.c
3 *
f19159dc 4 * Copyright (C) International Business Machines Corp., 2002,2010
1da177e4
LT
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21#include <linux/fs.h>
1da177e4 22#include <linux/stat.h>
5a0e3ad6 23#include <linux/slab.h>
1da177e4
LT
24#include <linux/pagemap.h>
25#include <asm/div64.h>
26#include "cifsfs.h"
27#include "cifspdu.h"
28#include "cifsglob.h"
29#include "cifsproto.h"
30#include "cifs_debug.h"
31#include "cifs_fs_sb.h"
9451a9a5 32#include "fscache.h"
1da177e4 33
70eff55d 34
7962670e 35static void cifs_set_ops(struct inode *inode, const bool is_dfs_referral)
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;
47 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
48 inode->i_fop = &cifs_file_nobrl_ops;
49 else { /* not direct, send byte range locks */
50 inode->i_fop = &cifs_file_ops;
51 }
52
53
54 /* check if server can support readpages */
55 if (cifs_sb->tcon->ses->server->maxBuf <
56 PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
57 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
58 else
59 inode->i_data.a_ops = &cifs_addr_ops;
60 break;
61 case S_IFDIR:
bc5b6e24 62#ifdef CONFIG_CIFS_DFS_UPCALL
7962670e
IM
63 if (is_dfs_referral) {
64 inode->i_op = &cifs_dfs_referral_inode_operations;
65 } else {
bc5b6e24
SF
66#else /* NO DFS support, treat as a directory */
67 {
68#endif
7962670e
IM
69 inode->i_op = &cifs_dir_inode_ops;
70 inode->i_fop = &cifs_dir_ops;
71 }
70eff55d
CH
72 break;
73 case S_IFLNK:
74 inode->i_op = &cifs_symlink_inode_ops;
75 break;
76 default:
77 init_special_inode(inode, inode->i_mode, inode->i_rdev);
78 break;
79 }
80}
81
df2cf170
JL
82/* check inode attributes against fattr. If they don't match, tag the
83 * inode for cache invalidation
84 */
85static void
86cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
87{
88 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
89
f19159dc 90 cFYI(1, "%s: revalidating inode %llu", __func__, cifs_i->uniqueid);
df2cf170
JL
91
92 if (inode->i_state & I_NEW) {
f19159dc 93 cFYI(1, "%s: inode %llu is new", __func__, cifs_i->uniqueid);
df2cf170
JL
94 return;
95 }
96
97 /* don't bother with revalidation if we have an oplock */
98 if (cifs_i->clientCanCacheRead) {
f19159dc
SF
99 cFYI(1, "%s: inode %llu is oplocked", __func__,
100 cifs_i->uniqueid);
df2cf170
JL
101 return;
102 }
103
104 /* revalidate if mtime or size have changed */
105 if (timespec_equal(&inode->i_mtime, &fattr->cf_mtime) &&
106 cifs_i->server_eof == fattr->cf_eof) {
f19159dc
SF
107 cFYI(1, "%s: inode %llu is unchanged", __func__,
108 cifs_i->uniqueid);
df2cf170
JL
109 return;
110 }
111
f19159dc
SF
112 cFYI(1, "%s: invalidating inode %llu mapping", __func__,
113 cifs_i->uniqueid);
df2cf170
JL
114 cifs_i->invalid_mapping = true;
115}
116
cc0bad75
JL
117/* populate an inode with info from a cifs_fattr struct */
118void
119cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
75f12983 120{
cc0bad75 121 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
0b8f18e3
JL
122 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
123 unsigned long oldtime = cifs_i->time;
cc0bad75 124
df2cf170
JL
125 cifs_revalidate_cache(inode, fattr);
126
cc0bad75
JL
127 inode->i_atime = fattr->cf_atime;
128 inode->i_mtime = fattr->cf_mtime;
129 inode->i_ctime = fattr->cf_ctime;
cc0bad75
JL
130 inode->i_rdev = fattr->cf_rdev;
131 inode->i_nlink = fattr->cf_nlink;
132 inode->i_uid = fattr->cf_uid;
133 inode->i_gid = fattr->cf_gid;
134
0b8f18e3
JL
135 /* if dynperm is set, don't clobber existing mode */
136 if (inode->i_state & I_NEW ||
137 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
138 inode->i_mode = fattr->cf_mode;
139
cc0bad75 140 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
75f12983 141
0b8f18e3
JL
142 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
143 cifs_i->time = 0;
144 else
145 cifs_i->time = jiffies;
146
b6b38f70
JP
147 cFYI(1, "inode 0x%p old_time=%ld new_time=%ld", inode,
148 oldtime, cifs_i->time);
0b8f18e3
JL
149
150 cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING;
cc0bad75 151
835a36ca 152 cifs_i->server_eof = fattr->cf_eof;
cc0bad75
JL
153 /*
154 * Can't safely change the file size here if the client is writing to
155 * it due to potential races.
156 */
157 spin_lock(&inode->i_lock);
158 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
159 i_size_write(inode, fattr->cf_eof);
160
161 /*
162 * i_blocks is not related to (i_size / i_blksize),
163 * but instead 512 byte (2**9) size is required for
164 * calculating num blocks.
165 */
166 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
167 }
168 spin_unlock(&inode->i_lock);
169
170 cifs_set_ops(inode, fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL);
171}
172
4065c802
JL
173void
174cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
175{
176 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
177
178 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
179 return;
180
181 fattr->cf_uniqueid = iunique(sb, ROOT_I);
182}
183
cc0bad75
JL
184/* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
185void
186cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
187 struct cifs_sb_info *cifs_sb)
188{
189 memset(fattr, 0, sizeof(*fattr));
190 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
191 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
192 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
193
194 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
195 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
196 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
197 fattr->cf_mode = le64_to_cpu(info->Permissions);
75f12983
CH
198
199 /*
200 * Since we set the inode type below we need to mask off
201 * to avoid strange results if bits set above.
202 */
cc0bad75 203 fattr->cf_mode &= ~S_IFMT;
75f12983
CH
204 switch (le32_to_cpu(info->Type)) {
205 case UNIX_FILE:
cc0bad75
JL
206 fattr->cf_mode |= S_IFREG;
207 fattr->cf_dtype = DT_REG;
75f12983
CH
208 break;
209 case UNIX_SYMLINK:
cc0bad75
JL
210 fattr->cf_mode |= S_IFLNK;
211 fattr->cf_dtype = DT_LNK;
75f12983
CH
212 break;
213 case UNIX_DIR:
cc0bad75
JL
214 fattr->cf_mode |= S_IFDIR;
215 fattr->cf_dtype = DT_DIR;
75f12983
CH
216 break;
217 case UNIX_CHARDEV:
cc0bad75
JL
218 fattr->cf_mode |= S_IFCHR;
219 fattr->cf_dtype = DT_CHR;
220 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
221 le64_to_cpu(info->DevMinor) & MINORMASK);
75f12983
CH
222 break;
223 case UNIX_BLOCKDEV:
cc0bad75
JL
224 fattr->cf_mode |= S_IFBLK;
225 fattr->cf_dtype = DT_BLK;
226 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
227 le64_to_cpu(info->DevMinor) & MINORMASK);
75f12983
CH
228 break;
229 case UNIX_FIFO:
cc0bad75
JL
230 fattr->cf_mode |= S_IFIFO;
231 fattr->cf_dtype = DT_FIFO;
75f12983
CH
232 break;
233 case UNIX_SOCKET:
cc0bad75
JL
234 fattr->cf_mode |= S_IFSOCK;
235 fattr->cf_dtype = DT_SOCK;
75f12983
CH
236 break;
237 default:
238 /* safest to call it a file if we do not know */
cc0bad75
JL
239 fattr->cf_mode |= S_IFREG;
240 fattr->cf_dtype = DT_REG;
b6b38f70 241 cFYI(1, "unknown type %d", le32_to_cpu(info->Type));
75f12983
CH
242 break;
243 }
244
cc0bad75
JL
245 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
246 fattr->cf_uid = cifs_sb->mnt_uid;
75f12983 247 else
cc0bad75 248 fattr->cf_uid = le64_to_cpu(info->Uid);
75f12983 249
cc0bad75
JL
250 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
251 fattr->cf_gid = cifs_sb->mnt_gid;
75f12983 252 else
cc0bad75 253 fattr->cf_gid = le64_to_cpu(info->Gid);
75f12983 254
cc0bad75 255 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
75f12983
CH
256}
257
b9a3260f 258/*
cc0bad75
JL
259 * Fill a cifs_fattr struct with fake inode info.
260 *
261 * Needed to setup cifs_fattr data for the directory which is the
262 * junction to the new submount (ie to setup the fake directory
263 * which represents a DFS referral).
b9a3260f 264 */
f1230c97 265static void
cc0bad75 266cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
0e4bbde9 267{
cc0bad75 268 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
0e4bbde9 269
b6b38f70 270 cFYI(1, "creating fake fattr for DFS referral");
cc0bad75
JL
271
272 memset(fattr, 0, sizeof(*fattr));
273 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
274 fattr->cf_uid = cifs_sb->mnt_uid;
275 fattr->cf_gid = cifs_sb->mnt_gid;
276 fattr->cf_atime = CURRENT_TIME;
277 fattr->cf_ctime = CURRENT_TIME;
278 fattr->cf_mtime = CURRENT_TIME;
279 fattr->cf_nlink = 2;
280 fattr->cf_flags |= CIFS_FATTR_DFS_REFERRAL;
0e4bbde9
SF
281}
282
abab095d
JL
283int cifs_get_file_info_unix(struct file *filp)
284{
285 int rc;
286 int xid;
287 FILE_UNIX_BASIC_INFO find_data;
288 struct cifs_fattr fattr;
289 struct inode *inode = filp->f_path.dentry->d_inode;
290 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
291 struct cifsTconInfo *tcon = cifs_sb->tcon;
c21dfb69 292 struct cifsFileInfo *cfile = filp->private_data;
abab095d
JL
293
294 xid = GetXid();
295 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->netfid, &find_data);
296 if (!rc) {
297 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
298 } else if (rc == -EREMOTE) {
299 cifs_create_dfs_fattr(&fattr, inode->i_sb);
300 rc = 0;
301 }
302
303 cifs_fattr_to_inode(inode, &fattr);
304 FreeXid(xid);
305 return rc;
306}
307
1da177e4 308int cifs_get_inode_info_unix(struct inode **pinode,
cc0bad75
JL
309 const unsigned char *full_path,
310 struct super_block *sb, int xid)
1da177e4 311{
cc0bad75 312 int rc;
0e4bbde9 313 FILE_UNIX_BASIC_INFO find_data;
cc0bad75
JL
314 struct cifs_fattr fattr;
315 struct cifsTconInfo *tcon;
1da177e4 316 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1da177e4 317
cc0bad75 318 tcon = cifs_sb->tcon;
b6b38f70 319 cFYI(1, "Getting info on %s", full_path);
7962670e 320
1da177e4 321 /* could have done a find first instead but this returns more info */
cc0bad75 322 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
737b758c
SF
323 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
324 CIFS_MOUNT_MAP_SPECIAL_CHR);
e911d0cc 325
cc0bad75
JL
326 if (!rc) {
327 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
328 } else if (rc == -EREMOTE) {
329 cifs_create_dfs_fattr(&fattr, sb);
330 rc = 0;
331 } else {
332 return rc;
333 }
1da177e4 334
0e4bbde9 335 if (*pinode == NULL) {
cc0bad75 336 /* get new inode */
4065c802 337 cifs_fill_uniqueid(sb, &fattr);
cc0bad75
JL
338 *pinode = cifs_iget(sb, &fattr);
339 if (!*pinode)
0e4bbde9 340 rc = -ENOMEM;
cc0bad75
JL
341 } else {
342 /* we already have inode, update it */
343 cifs_fattr_to_inode(*pinode, &fattr);
0e4bbde9 344 }
1da177e4 345
1da177e4
LT
346 return rc;
347}
348
0b8f18e3
JL
349static int
350cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path,
351 struct cifs_sb_info *cifs_sb, int xid)
d6e2f2a4
SF
352{
353 int rc;
4b18f2a9 354 int oplock = 0;
d6e2f2a4
SF
355 __u16 netfid;
356 struct cifsTconInfo *pTcon = cifs_sb->tcon;
86c96b4b 357 char buf[24];
d6e2f2a4 358 unsigned int bytes_read;
fb8c4b14 359 char *pbuf;
d6e2f2a4
SF
360
361 pbuf = buf;
362
0b8f18e3
JL
363 fattr->cf_mode &= ~S_IFMT;
364
365 if (fattr->cf_eof == 0) {
366 fattr->cf_mode |= S_IFIFO;
367 fattr->cf_dtype = DT_FIFO;
d6e2f2a4 368 return 0;
0b8f18e3
JL
369 } else if (fattr->cf_eof < 8) {
370 fattr->cf_mode |= S_IFREG;
371 fattr->cf_dtype = DT_REG;
d6e2f2a4
SF
372 return -EINVAL; /* EOPNOTSUPP? */
373 }
50c2f753 374
d6e2f2a4
SF
375 rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ,
376 CREATE_NOT_DIR, &netfid, &oplock, NULL,
377 cifs_sb->local_nls,
378 cifs_sb->mnt_cifs_flags &
379 CIFS_MOUNT_MAP_SPECIAL_CHR);
fb8c4b14 380 if (rc == 0) {
ec637e3f 381 int buf_type = CIFS_NO_BUFFER;
d6e2f2a4 382 /* Read header */
0b8f18e3 383 rc = CIFSSMBRead(xid, pTcon, netfid,
86c96b4b 384 24 /* length */, 0 /* offset */,
ec637e3f 385 &bytes_read, &pbuf, &buf_type);
4523cc30
SF
386 if ((rc == 0) && (bytes_read >= 8)) {
387 if (memcmp("IntxBLK", pbuf, 8) == 0) {
b6b38f70 388 cFYI(1, "Block device");
0b8f18e3
JL
389 fattr->cf_mode |= S_IFBLK;
390 fattr->cf_dtype = DT_BLK;
4523cc30 391 if (bytes_read == 24) {
86c96b4b
SF
392 /* we have enough to decode dev num */
393 __u64 mjr; /* major */
394 __u64 mnr; /* minor */
395 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
396 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
0b8f18e3 397 fattr->cf_rdev = MKDEV(mjr, mnr);
86c96b4b 398 }
4523cc30 399 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
b6b38f70 400 cFYI(1, "Char device");
0b8f18e3
JL
401 fattr->cf_mode |= S_IFCHR;
402 fattr->cf_dtype = DT_CHR;
4523cc30 403 if (bytes_read == 24) {
86c96b4b
SF
404 /* we have enough to decode dev num */
405 __u64 mjr; /* major */
406 __u64 mnr; /* minor */
407 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
408 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
0b8f18e3 409 fattr->cf_rdev = MKDEV(mjr, mnr);
fb8c4b14 410 }
4523cc30 411 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
b6b38f70 412 cFYI(1, "Symlink");
0b8f18e3
JL
413 fattr->cf_mode |= S_IFLNK;
414 fattr->cf_dtype = DT_LNK;
86c96b4b 415 } else {
0b8f18e3
JL
416 fattr->cf_mode |= S_IFREG; /* file? */
417 fattr->cf_dtype = DT_REG;
fb8c4b14 418 rc = -EOPNOTSUPP;
86c96b4b 419 }
3020a1f5 420 } else {
0b8f18e3
JL
421 fattr->cf_mode |= S_IFREG; /* then it is a file */
422 fattr->cf_dtype = DT_REG;
fb8c4b14
SF
423 rc = -EOPNOTSUPP; /* or some unknown SFU type */
424 }
d6e2f2a4 425 CIFSSMBClose(xid, pTcon, netfid);
d6e2f2a4
SF
426 }
427 return rc;
d6e2f2a4
SF
428}
429
9e294f1c
SF
430#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
431
0b8f18e3
JL
432/*
433 * Fetch mode bits as provided by SFU.
434 *
435 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
436 */
437static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
438 struct cifs_sb_info *cifs_sb, int xid)
9e294f1c 439{
3020a1f5 440#ifdef CONFIG_CIFS_XATTR
9e294f1c
SF
441 ssize_t rc;
442 char ea_value[4];
443 __u32 mode;
444
31c0519f 445 rc = CIFSSMBQAllEAs(xid, cifs_sb->tcon, path, "SETFILEBITS",
0b8f18e3
JL
446 ea_value, 4 /* size of buf */, cifs_sb->local_nls,
447 cifs_sb->mnt_cifs_flags &
448 CIFS_MOUNT_MAP_SPECIAL_CHR);
4523cc30 449 if (rc < 0)
9e294f1c
SF
450 return (int)rc;
451 else if (rc > 3) {
452 mode = le32_to_cpu(*((__le32 *)ea_value));
0b8f18e3 453 fattr->cf_mode &= ~SFBITS_MASK;
b6b38f70
JP
454 cFYI(1, "special bits 0%o org mode 0%o", mode,
455 fattr->cf_mode);
0b8f18e3 456 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
b6b38f70 457 cFYI(1, "special mode bits 0%o", mode);
9e294f1c 458 }
0b8f18e3
JL
459
460 return 0;
3020a1f5
SF
461#else
462 return -EOPNOTSUPP;
463#endif
9e294f1c
SF
464}
465
0b8f18e3 466/* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
f1230c97 467static void
0b8f18e3
JL
468cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
469 struct cifs_sb_info *cifs_sb, bool adjust_tz)
b9a3260f 470{
0b8f18e3
JL
471 memset(fattr, 0, sizeof(*fattr));
472 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
473 if (info->DeletePending)
474 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
475
476 if (info->LastAccessTime)
477 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
478 else
479 fattr->cf_atime = CURRENT_TIME;
480
481 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
482 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
483
484 if (adjust_tz) {
485 fattr->cf_ctime.tv_sec += cifs_sb->tcon->ses->server->timeAdj;
486 fattr->cf_mtime.tv_sec += cifs_sb->tcon->ses->server->timeAdj;
487 }
488
489 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
490 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
491
492 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
493 fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
494 fattr->cf_dtype = DT_DIR;
495 } else {
496 fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
497 fattr->cf_dtype = DT_REG;
0b8f18e3 498
d0c280d2
JL
499 /* clear write bits if ATTR_READONLY is set */
500 if (fattr->cf_cifsattrs & ATTR_READONLY)
501 fattr->cf_mode &= ~(S_IWUGO);
502 }
0b8f18e3
JL
503
504 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
505
506 fattr->cf_uid = cifs_sb->mnt_uid;
507 fattr->cf_gid = cifs_sb->mnt_gid;
b9a3260f
SF
508}
509
abab095d
JL
510int cifs_get_file_info(struct file *filp)
511{
512 int rc;
513 int xid;
514 FILE_ALL_INFO find_data;
515 struct cifs_fattr fattr;
516 struct inode *inode = filp->f_path.dentry->d_inode;
517 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
518 struct cifsTconInfo *tcon = cifs_sb->tcon;
c21dfb69 519 struct cifsFileInfo *cfile = filp->private_data;
abab095d
JL
520
521 xid = GetXid();
522 rc = CIFSSMBQFileInfo(xid, tcon, cfile->netfid, &find_data);
523 if (rc == -EOPNOTSUPP || rc == -EINVAL) {
524 /*
525 * FIXME: legacy server -- fall back to path-based call?
ff215713
SF
526 * for now, just skip revalidating and mark inode for
527 * immediate reval.
528 */
abab095d
JL
529 rc = 0;
530 CIFS_I(inode)->time = 0;
531 goto cgfi_exit;
532 } else if (rc == -EREMOTE) {
533 cifs_create_dfs_fattr(&fattr, inode->i_sb);
534 rc = 0;
535 } else if (rc)
536 goto cgfi_exit;
537
538 /*
539 * don't bother with SFU junk here -- just mark inode as needing
540 * revalidation.
541 */
542 cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false);
543 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
544 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
545 cifs_fattr_to_inode(inode, &fattr);
546cgfi_exit:
547 FreeXid(xid);
548 return rc;
549}
550
1da177e4 551int cifs_get_inode_info(struct inode **pinode,
646dd539 552 const unsigned char *full_path, FILE_ALL_INFO *pfindData,
8b1327f6 553 struct super_block *sb, int xid, const __u16 *pfid)
1da177e4 554{
0b8f18e3 555 int rc = 0, tmprc;
1da177e4 556 struct cifsTconInfo *pTcon;
1da177e4 557 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1da177e4 558 char *buf = NULL;
5ade9dea 559 bool adjustTZ = false;
0b8f18e3 560 struct cifs_fattr fattr;
1da177e4
LT
561
562 pTcon = cifs_sb->tcon;
b6b38f70 563 cFYI(1, "Getting info on %s", full_path);
1da177e4 564
d0d2f2df
SF
565 if ((pfindData == NULL) && (*pinode != NULL)) {
566 if (CIFS_I(*pinode)->clientCanCacheRead) {
b6b38f70 567 cFYI(1, "No need to revalidate cached inode sizes");
1da177e4
LT
568 return rc;
569 }
570 }
571
572 /* if file info not passed in then get it from server */
d0d2f2df 573 if (pfindData == NULL) {
1da177e4 574 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
d0d2f2df 575 if (buf == NULL)
1da177e4
LT
576 return -ENOMEM;
577 pfindData = (FILE_ALL_INFO *)buf;
7962670e 578
1da177e4 579 /* could do find first instead but this returns more info */
7962670e 580 rc = CIFSSMBQPathInfo(xid, pTcon, full_path, pfindData,
acf1a1b1 581 0 /* not legacy */,
6b8edfe0 582 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
737b758c 583 CIFS_MOUNT_MAP_SPECIAL_CHR);
6b8edfe0
SF
584 /* BB optimize code so we do not make the above call
585 when server claims no NT SMB support and the above call
586 failed at least once - set flag in tcon or mount */
4523cc30 587 if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) {
7962670e 588 rc = SMBQueryInformation(xid, pTcon, full_path,
fb8c4b14 589 pfindData, cifs_sb->local_nls,
6b8edfe0
SF
590 cifs_sb->mnt_cifs_flags &
591 CIFS_MOUNT_MAP_SPECIAL_CHR);
4b18f2a9 592 adjustTZ = true;
6b8edfe0 593 }
1da177e4 594 }
0b8f18e3
JL
595
596 if (!rc) {
597 cifs_all_info_to_fattr(&fattr, (FILE_ALL_INFO *) pfindData,
598 cifs_sb, adjustTZ);
599 } else if (rc == -EREMOTE) {
600 cifs_create_dfs_fattr(&fattr, sb);
b9a3260f 601 rc = 0;
0b8f18e3 602 } else {
7962670e 603 goto cgii_exit;
0b8f18e3 604 }
1da177e4 605
0b8f18e3
JL
606 /*
607 * If an inode wasn't passed in, then get the inode number
608 *
609 * Is an i_ino of zero legal? Can we use that to check if the server
610 * supports returning inode numbers? Are there other sanity checks we
611 * can use to ensure that the server is really filling in that field?
612 *
613 * We can not use the IndexNumber field by default from Windows or
614 * Samba (in ALL_INFO buf) but we can request it explicitly. The SNIA
615 * CIFS spec claims that this value is unique within the scope of a
616 * share, and the windows docs hint that it's actually unique
617 * per-machine.
618 *
619 * There may be higher info levels that work but are there Windows
620 * server or network appliances for which IndexNumber field is not
621 * guaranteed unique?
622 */
b9a3260f 623 if (*pinode == NULL) {
b9a3260f
SF
624 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
625 int rc1 = 0;
b9a3260f
SF
626
627 rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
0b8f18e3 628 full_path, &fattr.cf_uniqueid,
737b758c
SF
629 cifs_sb->local_nls,
630 cifs_sb->mnt_cifs_flags &
631 CIFS_MOUNT_MAP_SPECIAL_CHR);
ec06aedd 632 if (rc1 || !fattr.cf_uniqueid) {
b6b38f70 633 cFYI(1, "GetSrvInodeNum rc %d", rc1);
0b8f18e3 634 fattr.cf_uniqueid = iunique(sb, ROOT_I);
ec06aedd 635 cifs_autodisable_serverino(cifs_sb);
132ac7b7 636 }
132ac7b7 637 } else {
0b8f18e3 638 fattr.cf_uniqueid = iunique(sb, ROOT_I);
132ac7b7 639 }
b9a3260f 640 } else {
0b8f18e3 641 fattr.cf_uniqueid = CIFS_I(*pinode)->uniqueid;
b9a3260f
SF
642 }
643
0b8f18e3
JL
644 /* query for SFU type info if supported and needed */
645 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
646 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
647 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
648 if (tmprc)
b6b38f70 649 cFYI(1, "cifs_sfu_type failed: %d", tmprc);
b9a3260f 650 }
1da177e4 651
4879b448 652#ifdef CONFIG_CIFS_EXPERIMENTAL
b9a3260f
SF
653 /* fill in 0777 bits from ACL */
654 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
b6b38f70 655 cFYI(1, "Getting mode bits from ACL");
0b8f18e3 656 cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, pfid);
b9a3260f 657 }
4879b448 658#endif
b9a3260f 659
0b8f18e3
JL
660 /* fill in remaining high mode bits e.g. SUID, VTX */
661 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
662 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
b9a3260f 663
0b8f18e3
JL
664 if (!*pinode) {
665 *pinode = cifs_iget(sb, &fattr);
666 if (!*pinode)
667 rc = -ENOMEM;
668 } else {
669 cifs_fattr_to_inode(*pinode, &fattr);
670 }
b9a3260f 671
7962670e 672cgii_exit:
1da177e4
LT
673 kfree(buf);
674 return rc;
675}
676
7f8ed420
SF
677static const struct inode_operations cifs_ipc_inode_ops = {
678 .lookup = cifs_lookup,
679};
680
e4cce94c 681char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb)
8be0ed44
SF
682{
683 int pplen = cifs_sb->prepathlen;
684 int dfsplen;
685 char *full_path = NULL;
686
687 /* if no prefix path, simply set path to the root of share to "" */
688 if (pplen == 0) {
689 full_path = kmalloc(1, GFP_KERNEL);
690 if (full_path)
691 full_path[0] = 0;
692 return full_path;
693 }
694
695 if (cifs_sb->tcon && (cifs_sb->tcon->Flags & SMB_SHARE_IS_IN_DFS))
696 dfsplen = strnlen(cifs_sb->tcon->treeName, MAX_TREE_SIZE + 1);
697 else
698 dfsplen = 0;
699
700 full_path = kmalloc(dfsplen + pplen + 1, GFP_KERNEL);
701 if (full_path == NULL)
702 return full_path;
703
704 if (dfsplen) {
705 strncpy(full_path, cifs_sb->tcon->treeName, dfsplen);
706 /* switch slash direction in prepath depending on whether
707 * windows or posix style path names
708 */
709 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
710 int i;
711 for (i = 0; i < dfsplen; i++) {
712 if (full_path[i] == '\\')
713 full_path[i] = '/';
714 }
715 }
716 }
717 strncpy(full_path + dfsplen, cifs_sb->prepath, pplen);
718 full_path[dfsplen + pplen] = 0; /* add trailing null */
719 return full_path;
720}
721
cc0bad75
JL
722static int
723cifs_find_inode(struct inode *inode, void *opaque)
724{
725 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
726
727 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
728 return 0;
729
3d694380
JL
730 /*
731 * uh oh -- it's a directory. We can't use it since hardlinked dirs are
732 * verboten. Disable serverino and return it as if it were found, the
733 * caller can discard it, generate a uniqueid and retry the find
734 */
735 if (S_ISDIR(inode->i_mode) && !list_empty(&inode->i_dentry)) {
736 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
737 cifs_autodisable_serverino(CIFS_SB(inode->i_sb));
738 }
739
cc0bad75
JL
740 return 1;
741}
742
743static int
744cifs_init_inode(struct inode *inode, void *opaque)
745{
746 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
747
748 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
749 return 0;
750}
751
752/* Given fattrs, get a corresponding inode */
753struct inode *
754cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
755{
756 unsigned long hash;
757 struct inode *inode;
758
3d694380 759retry_iget5_locked:
b6b38f70 760 cFYI(1, "looking for uniqueid=%llu", fattr->cf_uniqueid);
cc0bad75
JL
761
762 /* hash down to 32-bits on 32-bit arch */
763 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
764
765 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
cc0bad75 766 if (inode) {
3d694380
JL
767 /* was there a problematic inode number collision? */
768 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
769 iput(inode);
770 fattr->cf_uniqueid = iunique(sb, ROOT_I);
771 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
772 goto retry_iget5_locked;
773 }
774
cc0bad75
JL
775 cifs_fattr_to_inode(inode, fattr);
776 if (sb->s_flags & MS_NOATIME)
777 inode->i_flags |= S_NOATIME | S_NOCMTIME;
778 if (inode->i_state & I_NEW) {
779 inode->i_ino = hash;
9451a9a5
SJ
780 /* initialize per-inode cache cookie pointer */
781 CIFS_I(inode)->fscache = NULL;
cc0bad75
JL
782 unlock_new_inode(inode);
783 }
784 }
785
786 return inode;
787}
788
1da177e4 789/* gets root inode */
bd433d4c 790struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)
1da177e4 791{
ce634ab2 792 int xid;
1da177e4 793 struct cifs_sb_info *cifs_sb;
cc0bad75 794 struct inode *inode = NULL;
ce634ab2 795 long rc;
8be0ed44 796 char *full_path;
ce634ab2 797
cc0bad75 798 cifs_sb = CIFS_SB(sb);
e4cce94c 799 full_path = cifs_build_path_to_root(cifs_sb);
8be0ed44
SF
800 if (full_path == NULL)
801 return ERR_PTR(-ENOMEM);
c18c842b 802
8be0ed44 803 xid = GetXid();
0b8f18e3 804 if (cifs_sb->tcon->unix_ext)
cc0bad75 805 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
0b8f18e3
JL
806 else
807 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
8be0ed44 808 xid, NULL);
0b8f18e3
JL
809
810 if (!inode)
811 return ERR_PTR(-ENOMEM);
cc0bad75 812
d03382ce
SJ
813 /* populate tcon->resource_id */
814 cifs_sb->tcon->resource_id = CIFS_I(inode)->uniqueid;
815
7f8ed420 816 if (rc && cifs_sb->tcon->ipc) {
b6b38f70 817 cFYI(1, "ipc connection - fake read inode");
7f8ed420
SF
818 inode->i_mode |= S_IFDIR;
819 inode->i_nlink = 2;
820 inode->i_op = &cifs_ipc_inode_ops;
821 inode->i_fop = &simple_dir_operations;
822 inode->i_uid = cifs_sb->mnt_uid;
823 inode->i_gid = cifs_sb->mnt_gid;
ad661334 824 } else if (rc) {
8be0ed44 825 kfree(full_path);
ce634ab2
DH
826 _FreeXid(xid);
827 iget_failed(inode);
828 return ERR_PTR(rc);
7f8ed420
SF
829 }
830
ce634ab2 831
8be0ed44 832 kfree(full_path);
ce634ab2
DH
833 /* can not call macro FreeXid here since in a void func
834 * TODO: This is no longer true
835 */
1da177e4 836 _FreeXid(xid);
ce634ab2 837 return inode;
1da177e4
LT
838}
839
388e57b2
SF
840static int
841cifs_set_file_info(struct inode *inode, struct iattr *attrs, int xid,
842 char *full_path, __u32 dosattr)
843{
844 int rc;
845 int oplock = 0;
846 __u16 netfid;
847 __u32 netpid;
848 bool set_time = false;
849 struct cifsFileInfo *open_file;
850 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
851 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
852 struct cifsTconInfo *pTcon = cifs_sb->tcon;
853 FILE_BASIC_INFO info_buf;
854
1adcb710
SF
855 if (attrs == NULL)
856 return -EINVAL;
857
388e57b2
SF
858 if (attrs->ia_valid & ATTR_ATIME) {
859 set_time = true;
860 info_buf.LastAccessTime =
861 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
862 } else
863 info_buf.LastAccessTime = 0;
864
865 if (attrs->ia_valid & ATTR_MTIME) {
866 set_time = true;
867 info_buf.LastWriteTime =
868 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
869 } else
870 info_buf.LastWriteTime = 0;
871
872 /*
873 * Samba throws this field away, but windows may actually use it.
874 * Do not set ctime unless other time stamps are changed explicitly
875 * (i.e. by utimes()) since we would then have a mix of client and
876 * server times.
877 */
878 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
b6b38f70 879 cFYI(1, "CIFS - CTIME changed");
388e57b2
SF
880 info_buf.ChangeTime =
881 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
882 } else
883 info_buf.ChangeTime = 0;
884
885 info_buf.CreationTime = 0; /* don't change */
886 info_buf.Attributes = cpu_to_le32(dosattr);
887
888 /*
889 * If the file is already open for write, just use that fileid
890 */
891 open_file = find_writable_file(cifsInode);
892 if (open_file) {
893 netfid = open_file->netfid;
894 netpid = open_file->pid;
895 goto set_via_filehandle;
896 }
897
898 /*
899 * NT4 apparently returns success on this call, but it doesn't
900 * really work.
901 */
902 if (!(pTcon->ses->flags & CIFS_SES_NT4)) {
903 rc = CIFSSMBSetPathInfo(xid, pTcon, full_path,
904 &info_buf, cifs_sb->local_nls,
905 cifs_sb->mnt_cifs_flags &
906 CIFS_MOUNT_MAP_SPECIAL_CHR);
6b37faa1
JL
907 if (rc == 0) {
908 cifsInode->cifsAttrs = dosattr;
909 goto out;
910 } else if (rc != -EOPNOTSUPP && rc != -EINVAL)
388e57b2
SF
911 goto out;
912 }
913
b6b38f70
JP
914 cFYI(1, "calling SetFileInfo since SetPathInfo for "
915 "times not supported by this server");
388e57b2
SF
916 rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN,
917 SYNCHRONIZE | FILE_WRITE_ATTRIBUTES,
918 CREATE_NOT_DIR, &netfid, &oplock,
919 NULL, cifs_sb->local_nls,
920 cifs_sb->mnt_cifs_flags &
921 CIFS_MOUNT_MAP_SPECIAL_CHR);
922
923 if (rc != 0) {
924 if (rc == -EIO)
925 rc = -EINVAL;
926 goto out;
927 }
928
929 netpid = current->tgid;
930
931set_via_filehandle:
932 rc = CIFSSMBSetFileInfo(xid, pTcon, &info_buf, netfid, netpid);
d388908e
SF
933 if (!rc)
934 cifsInode->cifsAttrs = dosattr;
935
388e57b2
SF
936 if (open_file == NULL)
937 CIFSSMBClose(xid, pTcon, netfid);
938 else
6ab409b5 939 cifsFileInfo_put(open_file);
388e57b2
SF
940out:
941 return rc;
942}
943
a12a1ac7
JL
944/*
945 * open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
946 * and rename it to a random name that hopefully won't conflict with
947 * anything else.
948 */
949static int
3270958b 950cifs_rename_pending_delete(char *full_path, struct dentry *dentry, int xid)
a12a1ac7
JL
951{
952 int oplock = 0;
953 int rc;
954 __u16 netfid;
3270958b 955 struct inode *inode = dentry->d_inode;
a12a1ac7
JL
956 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
957 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
958 struct cifsTconInfo *tcon = cifs_sb->tcon;
3270958b
SF
959 __u32 dosattr, origattr;
960 FILE_BASIC_INFO *info_buf = NULL;
a12a1ac7
JL
961
962 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
dd1db2de 963 DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
a12a1ac7
JL
964 &netfid, &oplock, NULL, cifs_sb->local_nls,
965 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
966 if (rc != 0)
967 goto out;
968
3270958b
SF
969 origattr = cifsInode->cifsAttrs;
970 if (origattr == 0)
971 origattr |= ATTR_NORMAL;
972
973 dosattr = origattr & ~ATTR_READONLY;
a12a1ac7
JL
974 if (dosattr == 0)
975 dosattr |= ATTR_NORMAL;
976 dosattr |= ATTR_HIDDEN;
977
3270958b
SF
978 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
979 if (dosattr != origattr) {
980 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
981 if (info_buf == NULL) {
982 rc = -ENOMEM;
983 goto out_close;
984 }
985 info_buf->Attributes = cpu_to_le32(dosattr);
986 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid,
987 current->tgid);
988 /* although we would like to mark the file hidden
989 if that fails we will still try to rename it */
41346098 990 if (rc != 0)
3270958b
SF
991 cifsInode->cifsAttrs = dosattr;
992 else
993 dosattr = origattr; /* since not able to change them */
a12a1ac7 994 }
a12a1ac7 995
dd1db2de
JL
996 /* rename the file */
997 rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
a12a1ac7
JL
998 cifs_sb->mnt_cifs_flags &
999 CIFS_MOUNT_MAP_SPECIAL_CHR);
3270958b
SF
1000 if (rc != 0) {
1001 rc = -ETXTBSY;
1002 goto undo_setattr;
1003 }
6d22f098 1004
3270958b
SF
1005 /* try to set DELETE_ON_CLOSE */
1006 if (!cifsInode->delete_pending) {
1007 rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid,
1008 current->tgid);
1009 /*
1010 * some samba versions return -ENOENT when we try to set the
1011 * file disposition here. Likely a samba bug, but work around
1012 * it for now. This means that some cifsXXX files may hang
1013 * around after they shouldn't.
1014 *
1015 * BB: remove this hack after more servers have the fix
1016 */
1017 if (rc == -ENOENT)
1018 rc = 0;
1019 else if (rc != 0) {
1020 rc = -ETXTBSY;
1021 goto undo_rename;
1022 }
1023 cifsInode->delete_pending = true;
1024 }
7ce86d5a 1025
a12a1ac7
JL
1026out_close:
1027 CIFSSMBClose(xid, tcon, netfid);
1028out:
3270958b 1029 kfree(info_buf);
a12a1ac7 1030 return rc;
3270958b
SF
1031
1032 /*
1033 * reset everything back to the original state. Don't bother
1034 * dealing with errors here since we can't do anything about
1035 * them anyway.
1036 */
1037undo_rename:
1038 CIFSSMBRenameOpenFile(xid, tcon, netfid, dentry->d_name.name,
1039 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1040 CIFS_MOUNT_MAP_SPECIAL_CHR);
1041undo_setattr:
1042 if (dosattr != origattr) {
1043 info_buf->Attributes = cpu_to_le32(origattr);
1044 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid,
1045 current->tgid))
1046 cifsInode->cifsAttrs = origattr;
1047 }
1048
1049 goto out_close;
a12a1ac7
JL
1050}
1051
ff694527
SF
1052
1053/*
1054 * If dentry->d_inode is null (usually meaning the cached dentry
1055 * is a negative dentry) then we would attempt a standard SMB delete, but
af901ca1
AGR
1056 * if that fails we can not attempt the fall back mechanisms on EACCESS
1057 * but will return the EACCESS to the caller. Note that the VFS does not call
ff694527
SF
1058 * unlink on negative dentries currently.
1059 */
5f0319a7 1060int cifs_unlink(struct inode *dir, struct dentry *dentry)
1da177e4
LT
1061{
1062 int rc = 0;
1063 int xid;
1da177e4 1064 char *full_path = NULL;
5f0319a7 1065 struct inode *inode = dentry->d_inode;
ff694527 1066 struct cifsInodeInfo *cifs_inode;
5f0319a7
JL
1067 struct super_block *sb = dir->i_sb;
1068 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1069 struct cifsTconInfo *tcon = cifs_sb->tcon;
6050247d
SF
1070 struct iattr *attrs = NULL;
1071 __u32 dosattr = 0, origattr = 0;
1da177e4 1072
b6b38f70 1073 cFYI(1, "cifs_unlink, dir=0x%p, dentry=0x%p", dir, dentry);
1da177e4
LT
1074
1075 xid = GetXid();
1076
5f0319a7
JL
1077 /* Unlink can be called from rename so we can not take the
1078 * sb->s_vfs_rename_mutex here */
1079 full_path = build_path_from_dentry(dentry);
1da177e4 1080 if (full_path == NULL) {
0f3bc09e 1081 rc = -ENOMEM;
1da177e4 1082 FreeXid(xid);
0f3bc09e 1083 return rc;
1da177e4 1084 }
2d785a50 1085
5f0319a7 1086 if ((tcon->ses->capabilities & CAP_UNIX) &&
2d785a50 1087 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
5f0319a7
JL
1088 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1089 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
2d785a50 1090 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
737b758c 1091 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
b6b38f70 1092 cFYI(1, "posix del rc %d", rc);
2d785a50
SF
1093 if ((rc == 0) || (rc == -ENOENT))
1094 goto psx_del_no_retry;
1095 }
1da177e4 1096
6050247d 1097retry_std_delete:
5f0319a7 1098 rc = CIFSSMBDelFile(xid, tcon, full_path, cifs_sb->local_nls,
2d785a50 1099 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
6050247d 1100
2d785a50 1101psx_del_no_retry:
1da177e4 1102 if (!rc) {
5f0319a7
JL
1103 if (inode)
1104 drop_nlink(inode);
1da177e4 1105 } else if (rc == -ENOENT) {
5f0319a7 1106 d_drop(dentry);
1da177e4 1107 } else if (rc == -ETXTBSY) {
3270958b 1108 rc = cifs_rename_pending_delete(full_path, dentry, xid);
a12a1ac7
JL
1109 if (rc == 0)
1110 drop_nlink(inode);
ff694527 1111 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
388e57b2
SF
1112 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1113 if (attrs == NULL) {
1114 rc = -ENOMEM;
1115 goto out_reval;
1da177e4 1116 }
388e57b2
SF
1117
1118 /* try to reset dos attributes */
ff694527
SF
1119 cifs_inode = CIFS_I(inode);
1120 origattr = cifs_inode->cifsAttrs;
6050247d
SF
1121 if (origattr == 0)
1122 origattr |= ATTR_NORMAL;
1123 dosattr = origattr & ~ATTR_READONLY;
388e57b2
SF
1124 if (dosattr == 0)
1125 dosattr |= ATTR_NORMAL;
1126 dosattr |= ATTR_HIDDEN;
1127
1128 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
388e57b2
SF
1129 if (rc != 0)
1130 goto out_reval;
6050247d
SF
1131
1132 goto retry_std_delete;
1da177e4 1133 }
6050247d
SF
1134
1135 /* undo the setattr if we errored out and it's needed */
1136 if (rc != 0 && dosattr != 0)
1137 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1138
388e57b2 1139out_reval:
4523cc30 1140 if (inode) {
ff694527
SF
1141 cifs_inode = CIFS_I(inode);
1142 cifs_inode->time = 0; /* will force revalidate to get info
5f0319a7
JL
1143 when needed */
1144 inode->i_ctime = current_fs_time(sb);
06bcfedd 1145 }
5f0319a7 1146 dir->i_ctime = dir->i_mtime = current_fs_time(sb);
ff694527 1147 cifs_inode = CIFS_I(dir);
6050247d 1148 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1da177e4
LT
1149
1150 kfree(full_path);
6050247d 1151 kfree(attrs);
1da177e4
LT
1152 FreeXid(xid);
1153 return rc;
1154}
1155
1156int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
1157{
6b37faa1 1158 int rc = 0, tmprc;
1da177e4
LT
1159 int xid;
1160 struct cifs_sb_info *cifs_sb;
1161 struct cifsTconInfo *pTcon;
1162 char *full_path = NULL;
1163 struct inode *newinode = NULL;
cc0bad75 1164 struct cifs_fattr fattr;
1da177e4 1165
b6b38f70 1166 cFYI(1, "In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode);
1da177e4
LT
1167
1168 xid = GetXid();
1169
1170 cifs_sb = CIFS_SB(inode->i_sb);
1171 pTcon = cifs_sb->tcon;
1172
7f57356b 1173 full_path = build_path_from_dentry(direntry);
1da177e4 1174 if (full_path == NULL) {
0f3bc09e 1175 rc = -ENOMEM;
1da177e4 1176 FreeXid(xid);
0f3bc09e 1177 return rc;
1da177e4 1178 }
50c2f753 1179
fb8c4b14
SF
1180 if ((pTcon->ses->capabilities & CAP_UNIX) &&
1181 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2dd29d31
SF
1182 le64_to_cpu(pTcon->fsUnixInfo.Capability))) {
1183 u32 oplock = 0;
f6d09982 1184 FILE_UNIX_BASIC_INFO *pInfo =
2dd29d31 1185 kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
fb8c4b14 1186 if (pInfo == NULL) {
2dd29d31
SF
1187 rc = -ENOMEM;
1188 goto mkdir_out;
1189 }
50c2f753 1190
ce3b0f8d 1191 mode &= ~current_umask();
2dd29d31
SF
1192 rc = CIFSPOSIXCreate(xid, pTcon, SMB_O_DIRECTORY | SMB_O_CREAT,
1193 mode, NULL /* netfid */, pInfo, &oplock,
fb8c4b14
SF
1194 full_path, cifs_sb->local_nls,
1195 cifs_sb->mnt_cifs_flags &
2dd29d31 1196 CIFS_MOUNT_MAP_SPECIAL_CHR);
c45d707f
SF
1197 if (rc == -EOPNOTSUPP) {
1198 kfree(pInfo);
1199 goto mkdir_retry_old;
1200 } else if (rc) {
b6b38f70 1201 cFYI(1, "posix mkdir returned 0x%x", rc);
2dd29d31
SF
1202 d_drop(direntry);
1203 } else {
8f2376ad
CG
1204 if (pInfo->Type == cpu_to_le32(-1)) {
1205 /* no return info, go query for it */
5a07cdf8 1206 kfree(pInfo);
fb8c4b14 1207 goto mkdir_get_info;
5a07cdf8 1208 }
fb8c4b14
SF
1209/*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need
1210 to set uid/gid */
2dd29d31
SF
1211 inc_nlink(inode);
1212 if (pTcon->nocase)
1213 direntry->d_op = &cifs_ci_dentry_ops;
1214 else
1215 direntry->d_op = &cifs_dentry_ops;
cbac3cba 1216
cc0bad75 1217 cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb);
4065c802 1218 cifs_fill_uniqueid(inode->i_sb, &fattr);
cc0bad75
JL
1219 newinode = cifs_iget(inode->i_sb, &fattr);
1220 if (!newinode) {
5a07cdf8 1221 kfree(pInfo);
cbac3cba 1222 goto mkdir_get_info;
5a07cdf8 1223 }
6b37faa1 1224
2dd29d31 1225 d_instantiate(direntry, newinode);
cbac3cba 1226
cbac3cba 1227#ifdef CONFIG_CIFS_DEBUG2
b6b38f70
JP
1228 cFYI(1, "instantiated dentry %p %s to inode %p",
1229 direntry, direntry->d_name.name, newinode);
cbac3cba 1230
fb8c4b14 1231 if (newinode->i_nlink != 2)
b6b38f70
JP
1232 cFYI(1, "unexpected number of links %d",
1233 newinode->i_nlink);
cbac3cba 1234#endif
2dd29d31
SF
1235 }
1236 kfree(pInfo);
1237 goto mkdir_out;
fb8c4b14 1238 }
c45d707f 1239mkdir_retry_old:
1da177e4 1240 /* BB add setting the equivalent of mode via CreateX w/ACLs */
737b758c
SF
1241 rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls,
1242 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
1da177e4 1243 if (rc) {
b6b38f70 1244 cFYI(1, "cifs_mkdir returned 0x%x", rc);
1da177e4
LT
1245 d_drop(direntry);
1246 } else {
fb8c4b14 1247mkdir_get_info:
d8c76e6f 1248 inc_nlink(inode);
c18c842b 1249 if (pTcon->unix_ext)
1da177e4 1250 rc = cifs_get_inode_info_unix(&newinode, full_path,
fb8c4b14 1251 inode->i_sb, xid);
1da177e4
LT
1252 else
1253 rc = cifs_get_inode_info(&newinode, full_path, NULL,
8b1327f6 1254 inode->i_sb, xid, NULL);
1da177e4 1255
b92327fe
SF
1256 if (pTcon->nocase)
1257 direntry->d_op = &cifs_ci_dentry_ops;
1258 else
1259 direntry->d_op = &cifs_dentry_ops;
1da177e4 1260 d_instantiate(direntry, newinode);
2dd29d31 1261 /* setting nlink not necessary except in cases where we
fb8c4b14 1262 * failed to get it from the server or was set bogus */
2dd29d31 1263 if ((direntry->d_inode) && (direntry->d_inode->i_nlink < 2))
fb8c4b14 1264 direntry->d_inode->i_nlink = 2;
95089910 1265
ce3b0f8d 1266 mode &= ~current_umask();
95089910
JL
1267 /* must turn on setgid bit if parent dir has it */
1268 if (inode->i_mode & S_ISGID)
1269 mode |= S_ISGID;
1270
c18c842b 1271 if (pTcon->unix_ext) {
4e1e7fb9
JL
1272 struct cifs_unix_set_info_args args = {
1273 .mode = mode,
1274 .ctime = NO_CHANGE_64,
1275 .atime = NO_CHANGE_64,
1276 .mtime = NO_CHANGE_64,
1277 .device = 0,
1278 };
d0d2f2df 1279 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
a001e5b5 1280 args.uid = (__u64)current_fsuid();
95089910
JL
1281 if (inode->i_mode & S_ISGID)
1282 args.gid = (__u64)inode->i_gid;
1283 else
a001e5b5 1284 args.gid = (__u64)current_fsgid();
1da177e4 1285 } else {
4e1e7fb9
JL
1286 args.uid = NO_CHANGE_64;
1287 args.gid = NO_CHANGE_64;
1da177e4 1288 }
01ea95e3
JL
1289 CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, &args,
1290 cifs_sb->local_nls,
1291 cifs_sb->mnt_cifs_flags &
1292 CIFS_MOUNT_MAP_SPECIAL_CHR);
3ce53fc4 1293 } else {
67750fb9
JL
1294 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1295 (mode & S_IWUGO) == 0) {
1296 FILE_BASIC_INFO pInfo;
6b37faa1
JL
1297 struct cifsInodeInfo *cifsInode;
1298 u32 dosattrs;
1299
67750fb9 1300 memset(&pInfo, 0, sizeof(pInfo));
6b37faa1
JL
1301 cifsInode = CIFS_I(newinode);
1302 dosattrs = cifsInode->cifsAttrs|ATTR_READONLY;
1303 pInfo.Attributes = cpu_to_le32(dosattrs);
1304 tmprc = CIFSSMBSetPathInfo(xid, pTcon,
1305 full_path, &pInfo,
1306 cifs_sb->local_nls,
67750fb9
JL
1307 cifs_sb->mnt_cifs_flags &
1308 CIFS_MOUNT_MAP_SPECIAL_CHR);
6b37faa1
JL
1309 if (tmprc == 0)
1310 cifsInode->cifsAttrs = dosattrs;
67750fb9 1311 }
fb8c4b14 1312 if (direntry->d_inode) {
b0fd30d3
JL
1313 if (cifs_sb->mnt_cifs_flags &
1314 CIFS_MOUNT_DYNPERM)
1315 direntry->d_inode->i_mode =
1316 (mode | S_IFDIR);
4e94a105 1317
fb8c4b14 1318 if (cifs_sb->mnt_cifs_flags &
6473a559 1319 CIFS_MOUNT_SET_UID) {
fb8c4b14 1320 direntry->d_inode->i_uid =
a001e5b5 1321 current_fsuid();
95089910
JL
1322 if (inode->i_mode & S_ISGID)
1323 direntry->d_inode->i_gid =
1324 inode->i_gid;
1325 else
1326 direntry->d_inode->i_gid =
a001e5b5 1327 current_fsgid();
6473a559
SF
1328 }
1329 }
2a138ebb 1330 }
1da177e4 1331 }
fb8c4b14 1332mkdir_out:
1da177e4
LT
1333 kfree(full_path);
1334 FreeXid(xid);
1335 return rc;
1336}
1337
1338int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1339{
1340 int rc = 0;
1341 int xid;
1342 struct cifs_sb_info *cifs_sb;
1343 struct cifsTconInfo *pTcon;
1344 char *full_path = NULL;
1345 struct cifsInodeInfo *cifsInode;
1346
b6b38f70 1347 cFYI(1, "cifs_rmdir, inode = 0x%p", inode);
1da177e4
LT
1348
1349 xid = GetXid();
1350
1351 cifs_sb = CIFS_SB(inode->i_sb);
1352 pTcon = cifs_sb->tcon;
1353
7f57356b 1354 full_path = build_path_from_dentry(direntry);
1da177e4 1355 if (full_path == NULL) {
0f3bc09e 1356 rc = -ENOMEM;
1da177e4 1357 FreeXid(xid);
0f3bc09e 1358 return rc;
1da177e4
LT
1359 }
1360
737b758c
SF
1361 rc = CIFSSMBRmDir(xid, pTcon, full_path, cifs_sb->local_nls,
1362 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
1da177e4
LT
1363
1364 if (!rc) {
9a53c3a7 1365 drop_nlink(inode);
3677db10 1366 spin_lock(&direntry->d_inode->i_lock);
fb8c4b14 1367 i_size_write(direntry->d_inode, 0);
ce71ec36 1368 clear_nlink(direntry->d_inode);
3677db10 1369 spin_unlock(&direntry->d_inode->i_lock);
1da177e4
LT
1370 }
1371
1372 cifsInode = CIFS_I(direntry->d_inode);
1373 cifsInode->time = 0; /* force revalidate to go get info when
1374 needed */
42c24544
SF
1375
1376 cifsInode = CIFS_I(inode);
1377 cifsInode->time = 0; /* force revalidate to get parent dir info
1378 since cached search results now invalid */
1379
1da177e4
LT
1380 direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
1381 current_fs_time(inode->i_sb);
1382
1383 kfree(full_path);
1384 FreeXid(xid);
1385 return rc;
1386}
1387
ee2fd967
SF
1388static int
1389cifs_do_rename(int xid, struct dentry *from_dentry, const char *fromPath,
1390 struct dentry *to_dentry, const char *toPath)
1391{
1392 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
1393 struct cifsTconInfo *pTcon = cifs_sb->tcon;
1394 __u16 srcfid;
1395 int oplock, rc;
1396
1397 /* try path-based rename first */
1398 rc = CIFSSMBRename(xid, pTcon, fromPath, toPath, cifs_sb->local_nls,
1399 cifs_sb->mnt_cifs_flags &
1400 CIFS_MOUNT_MAP_SPECIAL_CHR);
1401
1402 /*
1403 * don't bother with rename by filehandle unless file is busy and
1404 * source Note that cross directory moves do not work with
1405 * rename by filehandle to various Windows servers.
1406 */
1407 if (rc == 0 || rc != -ETXTBSY)
1408 return rc;
1409
ed0e3ace
JL
1410 /* open-file renames don't work across directories */
1411 if (to_dentry->d_parent != from_dentry->d_parent)
1412 return rc;
1413
ee2fd967
SF
1414 /* open the file to be renamed -- we need DELETE perms */
1415 rc = CIFSSMBOpen(xid, pTcon, fromPath, FILE_OPEN, DELETE,
1416 CREATE_NOT_DIR, &srcfid, &oplock, NULL,
1417 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1418 CIFS_MOUNT_MAP_SPECIAL_CHR);
1419
1420 if (rc == 0) {
1421 rc = CIFSSMBRenameOpenFile(xid, pTcon, srcfid,
1422 (const char *) to_dentry->d_name.name,
1423 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1424 CIFS_MOUNT_MAP_SPECIAL_CHR);
1425
1426 CIFSSMBClose(xid, pTcon, srcfid);
1427 }
1428
1429 return rc;
1430}
1431
14121bdc
JL
1432int cifs_rename(struct inode *source_dir, struct dentry *source_dentry,
1433 struct inode *target_dir, struct dentry *target_dentry)
1da177e4 1434{
ee2fd967
SF
1435 char *fromName = NULL;
1436 char *toName = NULL;
1da177e4
LT
1437 struct cifs_sb_info *cifs_sb_source;
1438 struct cifs_sb_info *cifs_sb_target;
14121bdc 1439 struct cifsTconInfo *tcon;
ee2fd967
SF
1440 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
1441 FILE_UNIX_BASIC_INFO *info_buf_target;
8d281efb 1442 int xid, rc, tmprc;
1da177e4 1443
14121bdc
JL
1444 cifs_sb_target = CIFS_SB(target_dir->i_sb);
1445 cifs_sb_source = CIFS_SB(source_dir->i_sb);
1446 tcon = cifs_sb_source->tcon;
1da177e4 1447
ee2fd967
SF
1448 xid = GetXid();
1449
1450 /*
1451 * BB: this might be allowed if same server, but different share.
1452 * Consider adding support for this
1453 */
14121bdc 1454 if (tcon != cifs_sb_target->tcon) {
ee2fd967
SF
1455 rc = -EXDEV;
1456 goto cifs_rename_exit;
1da177e4
LT
1457 }
1458
ee2fd967
SF
1459 /*
1460 * we already have the rename sem so we do not need to
1461 * grab it again here to protect the path integrity
1462 */
14121bdc 1463 fromName = build_path_from_dentry(source_dentry);
ee2fd967
SF
1464 if (fromName == NULL) {
1465 rc = -ENOMEM;
1466 goto cifs_rename_exit;
1467 }
1468
14121bdc 1469 toName = build_path_from_dentry(target_dentry);
ee2fd967 1470 if (toName == NULL) {
1da177e4
LT
1471 rc = -ENOMEM;
1472 goto cifs_rename_exit;
1473 }
1474
14121bdc
JL
1475 rc = cifs_do_rename(xid, source_dentry, fromName,
1476 target_dentry, toName);
ee2fd967 1477
14121bdc
JL
1478 if (rc == -EEXIST && tcon->unix_ext) {
1479 /*
1480 * Are src and dst hardlinks of same inode? We can
1481 * only tell with unix extensions enabled
1482 */
1483 info_buf_source =
1484 kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO),
1485 GFP_KERNEL);
1486 if (info_buf_source == NULL) {
1487 rc = -ENOMEM;
1488 goto cifs_rename_exit;
1489 }
1490
1491 info_buf_target = info_buf_source + 1;
8d281efb 1492 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, fromName,
14121bdc
JL
1493 info_buf_source,
1494 cifs_sb_source->local_nls,
1495 cifs_sb_source->mnt_cifs_flags &
1496 CIFS_MOUNT_MAP_SPECIAL_CHR);
8d281efb 1497 if (tmprc != 0)
14121bdc 1498 goto unlink_target;
ee2fd967 1499
8d281efb 1500 tmprc = CIFSSMBUnixQPathInfo(xid, tcon,
14121bdc
JL
1501 toName, info_buf_target,
1502 cifs_sb_target->local_nls,
1503 /* remap based on source sb */
1504 cifs_sb_source->mnt_cifs_flags &
1505 CIFS_MOUNT_MAP_SPECIAL_CHR);
1506
8d281efb 1507 if (tmprc == 0 && (info_buf_source->UniqueId ==
ae6884a9 1508 info_buf_target->UniqueId)) {
14121bdc 1509 /* same file, POSIX says that this is a noop */
ae6884a9 1510 rc = 0;
14121bdc 1511 goto cifs_rename_exit;
ae6884a9 1512 }
14121bdc 1513 } /* else ... BB we could add the same check for Windows by
ee2fd967 1514 checking the UniqueId via FILE_INTERNAL_INFO */
14121bdc 1515
ee2fd967 1516unlink_target:
fc6f3943
JL
1517 /* Try unlinking the target dentry if it's not negative */
1518 if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) {
8d281efb 1519 tmprc = cifs_unlink(target_dir, target_dentry);
14121bdc
JL
1520 if (tmprc)
1521 goto cifs_rename_exit;
1522
14121bdc
JL
1523 rc = cifs_do_rename(xid, source_dentry, fromName,
1524 target_dentry, toName);
1da177e4
LT
1525 }
1526
1527cifs_rename_exit:
ee2fd967 1528 kfree(info_buf_source);
1da177e4
LT
1529 kfree(fromName);
1530 kfree(toName);
1531 FreeXid(xid);
1532 return rc;
1533}
1534
df2cf170
JL
1535static bool
1536cifs_inode_needs_reval(struct inode *inode)
1da177e4 1537{
df2cf170 1538 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1da177e4 1539
df2cf170
JL
1540 if (cifs_i->clientCanCacheRead)
1541 return false;
1da177e4 1542
df2cf170
JL
1543 if (!lookupCacheEnabled)
1544 return true;
1da177e4 1545
df2cf170
JL
1546 if (cifs_i->time == 0)
1547 return true;
1da177e4 1548
df2cf170
JL
1549 /* FIXME: the actimeo should be tunable */
1550 if (time_after_eq(jiffies, cifs_i->time + HZ))
1551 return true;
1552
db19272e
JL
1553 /* hardlinked files w/ noserverino get "special" treatment */
1554 if (!(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
1555 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
1556 return true;
1557
df2cf170
JL
1558 return false;
1559}
1560
1561/* check invalid_mapping flag and zap the cache if it's set */
1562static void
1563cifs_invalidate_mapping(struct inode *inode)
1564{
1565 int rc;
1566 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1567
1568 cifs_i->invalid_mapping = false;
1569
1570 /* write back any cached data */
1571 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
1572 rc = filemap_write_and_wait(inode->i_mapping);
1573 if (rc)
1574 cifs_i->write_behind_rc = rc;
1575 }
1576 invalidate_remote_inode(inode);
9451a9a5 1577 cifs_fscache_reset_inode_cookie(inode);
df2cf170
JL
1578}
1579
abab095d
JL
1580int cifs_revalidate_file(struct file *filp)
1581{
1582 int rc = 0;
1583 struct inode *inode = filp->f_path.dentry->d_inode;
1584
1585 if (!cifs_inode_needs_reval(inode))
1586 goto check_inval;
1587
1588 if (CIFS_SB(inode->i_sb)->tcon->unix_ext)
1589 rc = cifs_get_file_info_unix(filp);
1590 else
1591 rc = cifs_get_file_info(filp);
1592
1593check_inval:
1594 if (CIFS_I(inode)->invalid_mapping)
1595 cifs_invalidate_mapping(inode);
1596
1597 return rc;
1598}
1599
df2cf170
JL
1600/* revalidate a dentry's inode attributes */
1601int cifs_revalidate_dentry(struct dentry *dentry)
1602{
1603 int xid;
1604 int rc = 0;
1605 char *full_path = NULL;
1606 struct inode *inode = dentry->d_inode;
1607 struct super_block *sb = dentry->d_sb;
1608
1609 if (inode == NULL)
1610 return -ENOENT;
1da177e4
LT
1611
1612 xid = GetXid();
1613
df2cf170
JL
1614 if (!cifs_inode_needs_reval(inode))
1615 goto check_inval;
1da177e4
LT
1616
1617 /* can not safely grab the rename sem here if rename calls revalidate
1618 since that would deadlock */
df2cf170 1619 full_path = build_path_from_dentry(dentry);
1da177e4 1620 if (full_path == NULL) {
0f3bc09e 1621 rc = -ENOMEM;
df2cf170 1622 goto check_inval;
1da177e4
LT
1623 }
1624
f19159dc 1625 cFYI(1, "Revalidate: %s inode 0x%p count %d dentry: 0x%p d_time %ld "
df2cf170 1626 "jiffies %ld", full_path, inode, inode->i_count.counter,
f19159dc 1627 dentry, dentry->d_time, jiffies);
1da177e4 1628
df2cf170
JL
1629 if (CIFS_SB(sb)->tcon->unix_ext)
1630 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
1631 else
1632 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
1633 xid, NULL);
1da177e4 1634
df2cf170
JL
1635check_inval:
1636 if (CIFS_I(inode)->invalid_mapping)
1637 cifs_invalidate_mapping(inode);
50c2f753 1638
1da177e4
LT
1639 kfree(full_path);
1640 FreeXid(xid);
1641 return rc;
1642}
1643
1644int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
1645 struct kstat *stat)
1646{
df2cf170 1647 int err = cifs_revalidate_dentry(dentry);
5fe14c85 1648 if (!err) {
1da177e4 1649 generic_fillattr(dentry->d_inode, stat);
5fe14c85 1650 stat->blksize = CIFS_MAX_MSGSIZE;
cc0bad75 1651 stat->ino = CIFS_I(dentry->d_inode)->uniqueid;
5fe14c85 1652 }
1da177e4
LT
1653 return err;
1654}
1655
1656static int cifs_truncate_page(struct address_space *mapping, loff_t from)
1657{
1658 pgoff_t index = from >> PAGE_CACHE_SHIFT;
1659 unsigned offset = from & (PAGE_CACHE_SIZE - 1);
1660 struct page *page;
1da177e4
LT
1661 int rc = 0;
1662
1663 page = grab_cache_page(mapping, index);
1664 if (!page)
1665 return -ENOMEM;
1666
eebd2aa3 1667 zero_user_segment(page, offset, PAGE_CACHE_SIZE);
1da177e4
LT
1668 unlock_page(page);
1669 page_cache_release(page);
1670 return rc;
1671}
1672
fb8c4b14 1673static int cifs_vmtruncate(struct inode *inode, loff_t offset)
3677db10 1674{
c08d3b0e 1675 loff_t oldsize;
1676 int err;
3677db10 1677
ba6a46a0 1678 spin_lock(&inode->i_lock);
c08d3b0e 1679 err = inode_newsize_ok(inode, offset);
1680 if (err) {
ba6a46a0 1681 spin_unlock(&inode->i_lock);
c08d3b0e 1682 goto out;
ba6a46a0 1683 }
c08d3b0e 1684
1685 oldsize = inode->i_size;
3677db10 1686 i_size_write(inode, offset);
ba6a46a0 1687 spin_unlock(&inode->i_lock);
c08d3b0e 1688 truncate_pagecache(inode, oldsize, offset);
acfa4380 1689 if (inode->i_op->truncate)
3677db10 1690 inode->i_op->truncate(inode);
c08d3b0e 1691out:
1692 return err;
3677db10
SF
1693}
1694
8efdbde6
JL
1695static int
1696cifs_set_file_size(struct inode *inode, struct iattr *attrs,
1697 int xid, char *full_path)
1698{
1699 int rc;
1700 struct cifsFileInfo *open_file;
1701 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1702 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1703 struct cifsTconInfo *pTcon = cifs_sb->tcon;
1704
1705 /*
1706 * To avoid spurious oplock breaks from server, in the case of
1707 * inodes that we already have open, avoid doing path based
1708 * setting of file size if we can do it by handle.
1709 * This keeps our caching token (oplock) and avoids timeouts
1710 * when the local oplock break takes longer to flush
1711 * writebehind data than the SMB timeout for the SetPathInfo
1712 * request would allow
1713 */
1714 open_file = find_writable_file(cifsInode);
1715 if (open_file) {
1716 __u16 nfid = open_file->netfid;
1717 __u32 npid = open_file->pid;
1718 rc = CIFSSMBSetFileSize(xid, pTcon, attrs->ia_size, nfid,
1719 npid, false);
6ab409b5 1720 cifsFileInfo_put(open_file);
b6b38f70 1721 cFYI(1, "SetFSize for attrs rc = %d", rc);
8efdbde6
JL
1722 if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
1723 unsigned int bytes_written;
1724 rc = CIFSSMBWrite(xid, pTcon, nfid, 0, attrs->ia_size,
1725 &bytes_written, NULL, NULL, 1);
b6b38f70 1726 cFYI(1, "Wrt seteof rc %d", rc);
8efdbde6
JL
1727 }
1728 } else
1729 rc = -EINVAL;
1730
1731 if (rc != 0) {
1732 /* Set file size by pathname rather than by handle
1733 either because no valid, writeable file handle for
1734 it was found or because there was an error setting
1735 it by handle */
1736 rc = CIFSSMBSetEOF(xid, pTcon, full_path, attrs->ia_size,
1737 false, cifs_sb->local_nls,
1738 cifs_sb->mnt_cifs_flags &
1739 CIFS_MOUNT_MAP_SPECIAL_CHR);
b6b38f70 1740 cFYI(1, "SetEOF by path (setattrs) rc = %d", rc);
8efdbde6
JL
1741 if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
1742 __u16 netfid;
1743 int oplock = 0;
1744
1745 rc = SMBLegacyOpen(xid, pTcon, full_path,
1746 FILE_OPEN, GENERIC_WRITE,
1747 CREATE_NOT_DIR, &netfid, &oplock, NULL,
1748 cifs_sb->local_nls,
1749 cifs_sb->mnt_cifs_flags &
1750 CIFS_MOUNT_MAP_SPECIAL_CHR);
1751 if (rc == 0) {
1752 unsigned int bytes_written;
1753 rc = CIFSSMBWrite(xid, pTcon, netfid, 0,
1754 attrs->ia_size,
1755 &bytes_written, NULL,
1756 NULL, 1);
b6b38f70 1757 cFYI(1, "wrt seteof rc %d", rc);
8efdbde6
JL
1758 CIFSSMBClose(xid, pTcon, netfid);
1759 }
1760 }
1761 }
1762
1763 if (rc == 0) {
fbec9ab9 1764 cifsInode->server_eof = attrs->ia_size;
8efdbde6
JL
1765 rc = cifs_vmtruncate(inode, attrs->ia_size);
1766 cifs_truncate_page(inode->i_mapping, inode->i_size);
1767 }
1768
1769 return rc;
1770}
1771
3fe5c1dd
JL
1772static int
1773cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
1774{
1775 int rc;
1776 int xid;
1777 char *full_path = NULL;
1778 struct inode *inode = direntry->d_inode;
1779 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1780 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1781 struct cifsTconInfo *pTcon = cifs_sb->tcon;
1782 struct cifs_unix_set_info_args *args = NULL;
3bbeeb3c 1783 struct cifsFileInfo *open_file;
3fe5c1dd 1784
b6b38f70
JP
1785 cFYI(1, "setattr_unix on file %s attrs->ia_valid=0x%x",
1786 direntry->d_name.name, attrs->ia_valid);
3fe5c1dd
JL
1787
1788 xid = GetXid();
1789
1790 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) {
1791 /* check if we have permission to change attrs */
1792 rc = inode_change_ok(inode, attrs);
1793 if (rc < 0)
1794 goto out;
1795 else
1796 rc = 0;
1797 }
1798
1799 full_path = build_path_from_dentry(direntry);
1800 if (full_path == NULL) {
1801 rc = -ENOMEM;
1802 goto out;
1803 }
1804
0f4d634c
JL
1805 /*
1806 * Attempt to flush data before changing attributes. We need to do
1807 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
1808 * ownership or mode then we may also need to do this. Here, we take
1809 * the safe way out and just do the flush on all setattr requests. If
1810 * the flush returns error, store it to report later and continue.
1811 *
1812 * BB: This should be smarter. Why bother flushing pages that
1813 * will be truncated anyway? Also, should we error out here if
1814 * the flush returns error?
1815 */
1816 rc = filemap_write_and_wait(inode->i_mapping);
1817 if (rc != 0) {
1818 cifsInode->write_behind_rc = rc;
1819 rc = 0;
3fe5c1dd
JL
1820 }
1821
1822 if (attrs->ia_valid & ATTR_SIZE) {
1823 rc = cifs_set_file_size(inode, attrs, xid, full_path);
1824 if (rc != 0)
1825 goto out;
1826 }
1827
1828 /* skip mode change if it's just for clearing setuid/setgid */
1829 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
1830 attrs->ia_valid &= ~ATTR_MODE;
1831
1832 args = kmalloc(sizeof(*args), GFP_KERNEL);
1833 if (args == NULL) {
1834 rc = -ENOMEM;
1835 goto out;
1836 }
1837
1838 /* set up the struct */
1839 if (attrs->ia_valid & ATTR_MODE)
1840 args->mode = attrs->ia_mode;
1841 else
1842 args->mode = NO_CHANGE_64;
1843
1844 if (attrs->ia_valid & ATTR_UID)
1845 args->uid = attrs->ia_uid;
1846 else
1847 args->uid = NO_CHANGE_64;
1848
1849 if (attrs->ia_valid & ATTR_GID)
1850 args->gid = attrs->ia_gid;
1851 else
1852 args->gid = NO_CHANGE_64;
1853
1854 if (attrs->ia_valid & ATTR_ATIME)
1855 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
1856 else
1857 args->atime = NO_CHANGE_64;
1858
1859 if (attrs->ia_valid & ATTR_MTIME)
1860 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
1861 else
1862 args->mtime = NO_CHANGE_64;
1863
1864 if (attrs->ia_valid & ATTR_CTIME)
1865 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
1866 else
1867 args->ctime = NO_CHANGE_64;
1868
1869 args->device = 0;
3bbeeb3c
JL
1870 open_file = find_writable_file(cifsInode);
1871 if (open_file) {
1872 u16 nfid = open_file->netfid;
1873 u32 npid = open_file->pid;
1874 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
6ab409b5 1875 cifsFileInfo_put(open_file);
3bbeeb3c
JL
1876 } else {
1877 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
01ea95e3
JL
1878 cifs_sb->local_nls,
1879 cifs_sb->mnt_cifs_flags &
1880 CIFS_MOUNT_MAP_SPECIAL_CHR);
3bbeeb3c 1881 }
3fe5c1dd 1882
ccd4bb1b 1883 if (!rc) {
3fe5c1dd 1884 rc = inode_setattr(inode, attrs);
ccd4bb1b
SF
1885
1886 /* force revalidate when any of these times are set since some
1887 of the fs types (eg ext3, fat) do not have fine enough
1888 time granularity to match protocol, and we do not have a
1889 a way (yet) to query the server fs's time granularity (and
1890 whether it rounds times down).
1891 */
1892 if (!rc && (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME)))
1893 cifsInode->time = 0;
1894 }
3fe5c1dd
JL
1895out:
1896 kfree(args);
1897 kfree(full_path);
1898 FreeXid(xid);
1899 return rc;
1900}
1901
0510eeb7
JL
1902static int
1903cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
1da177e4
LT
1904{
1905 int xid;
3fe5c1dd
JL
1906 struct inode *inode = direntry->d_inode;
1907 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3fe5c1dd 1908 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1da177e4
LT
1909 char *full_path = NULL;
1910 int rc = -EACCES;
feb3e20c 1911 __u32 dosattr = 0;
4e1e7fb9 1912 __u64 mode = NO_CHANGE_64;
3fe5c1dd 1913
1da177e4
LT
1914 xid = GetXid();
1915
b6b38f70
JP
1916 cFYI(1, "setattr on file %s attrs->iavalid 0x%x",
1917 direntry->d_name.name, attrs->ia_valid);
6473a559 1918
2a138ebb 1919 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) {
6473a559 1920 /* check if we have permission to change attrs */
02eadeff 1921 rc = inode_change_ok(inode, attrs);
fb8c4b14 1922 if (rc < 0) {
6473a559
SF
1923 FreeXid(xid);
1924 return rc;
1925 } else
1926 rc = 0;
1927 }
50c2f753 1928
7f57356b 1929 full_path = build_path_from_dentry(direntry);
1da177e4 1930 if (full_path == NULL) {
0f3bc09e 1931 rc = -ENOMEM;
1da177e4 1932 FreeXid(xid);
0f3bc09e 1933 return rc;
1da177e4 1934 }
1da177e4 1935
0f4d634c
JL
1936 /*
1937 * Attempt to flush data before changing attributes. We need to do
1938 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
1939 * ownership or mode then we may also need to do this. Here, we take
1940 * the safe way out and just do the flush on all setattr requests. If
1941 * the flush returns error, store it to report later and continue.
1942 *
1943 * BB: This should be smarter. Why bother flushing pages that
1944 * will be truncated anyway? Also, should we error out here if
1945 * the flush returns error?
1946 */
1947 rc = filemap_write_and_wait(inode->i_mapping);
1948 if (rc != 0) {
1949 cifsInode->write_behind_rc = rc;
1950 rc = 0;
50531444 1951 }
cea21805 1952
50531444 1953 if (attrs->ia_valid & ATTR_SIZE) {
8efdbde6
JL
1954 rc = cifs_set_file_size(inode, attrs, xid, full_path);
1955 if (rc != 0)
e30dcf3a 1956 goto cifs_setattr_exit;
1da177e4 1957 }
4ca691a8
JL
1958
1959 /*
1960 * Without unix extensions we can't send ownership changes to the
1961 * server, so silently ignore them. This is consistent with how
1962 * local DOS/Windows filesystems behave (VFAT, NTFS, etc). With
1963 * CIFSACL support + proper Windows to Unix idmapping, we may be
1964 * able to support this in the future.
1965 */
3fe5c1dd 1966 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
4ca691a8 1967 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
1da177e4 1968
d32c4f26
JL
1969 /* skip mode change if it's just for clearing setuid/setgid */
1970 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
1971 attrs->ia_valid &= ~ATTR_MODE;
1972
1da177e4 1973 if (attrs->ia_valid & ATTR_MODE) {
b6b38f70 1974 cFYI(1, "Mode changed to 0%o", attrs->ia_mode);
1da177e4 1975 mode = attrs->ia_mode;
1da177e4
LT
1976 }
1977
3fe5c1dd 1978 if (attrs->ia_valid & ATTR_MODE) {
cdbce9c8 1979 rc = 0;
97837582
SF
1980#ifdef CONFIG_CIFS_EXPERIMENTAL
1981 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
02eadeff 1982 rc = mode_to_acl(inode, full_path, mode);
5132861a 1983 else
97837582 1984#endif
5132861a
JL
1985 if (((mode & S_IWUGO) == 0) &&
1986 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
feb3e20c
JL
1987
1988 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
1989
5132861a
JL
1990 /* fix up mode if we're not using dynperm */
1991 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
1992 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
1993 } else if ((mode & S_IWUGO) &&
1994 (cifsInode->cifsAttrs & ATTR_READONLY)) {
feb3e20c
JL
1995
1996 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
1997 /* Attributes of 0 are ignored */
1998 if (dosattr == 0)
1999 dosattr |= ATTR_NORMAL;
5132861a
JL
2000
2001 /* reset local inode permissions to normal */
2002 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2003 attrs->ia_mode &= ~(S_IALLUGO);
2004 if (S_ISDIR(inode->i_mode))
2005 attrs->ia_mode |=
2006 cifs_sb->mnt_dir_mode;
2007 else
2008 attrs->ia_mode |=
2009 cifs_sb->mnt_file_mode;
2010 }
2011 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2012 /* ignore mode change - ATTR_READONLY hasn't changed */
2013 attrs->ia_valid &= ~ATTR_MODE;
1da177e4 2014 }
1da177e4
LT
2015 }
2016
feb3e20c
JL
2017 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2018 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2019 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2020 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
1da177e4 2021
e30dcf3a
SF
2022 /* Even if error on time set, no sense failing the call if
2023 the server would set the time to a reasonable value anyway,
2024 and this check ensures that we are not being called from
2025 sys_utimes in which case we ought to fail the call back to
2026 the user when the server rejects the call */
fb8c4b14 2027 if ((rc) && (attrs->ia_valid &
feb3e20c 2028 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
e30dcf3a 2029 rc = 0;
1da177e4
LT
2030 }
2031
2032 /* do not need local check to inode_check_ok since the server does
2033 that */
2034 if (!rc)
02eadeff 2035 rc = inode_setattr(inode, attrs);
e30dcf3a 2036cifs_setattr_exit:
1da177e4
LT
2037 kfree(full_path);
2038 FreeXid(xid);
2039 return rc;
2040}
2041
0510eeb7
JL
2042int
2043cifs_setattr(struct dentry *direntry, struct iattr *attrs)
2044{
2045 struct inode *inode = direntry->d_inode;
2046 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2047 struct cifsTconInfo *pTcon = cifs_sb->tcon;
2048
2049 if (pTcon->unix_ext)
2050 return cifs_setattr_unix(direntry, attrs);
2051
2052 return cifs_setattr_nounix(direntry, attrs);
2053
2054 /* BB: add cifs_setattr_legacy for really old servers */
2055}
2056
99ee4dbd 2057#if 0
1da177e4
LT
2058void cifs_delete_inode(struct inode *inode)
2059{
b6b38f70 2060 cFYI(1, "In cifs_delete_inode, inode = 0x%p", inode);
1da177e4
LT
2061 /* may have to add back in if and when safe distributed caching of
2062 directories added e.g. via FindNotify */
2063}
99ee4dbd 2064#endif