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