blob: 020f49c15b30401a5cbc967fdb8f904410f75e19 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001/*
2 * fs/cifs/inode.c
3 *
4 * Copyright (C) International Business Machines Corp., 2002,2010
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>
22#include <linux/stat.h>
23#include <linux/slab.h>
24#include <linux/pagemap.h>
25#include <linux/freezer.h>
26#include <linux/sched/signal.h>
27#include <linux/wait_bit.h>
28
29#include <asm/div64.h>
30#include "cifsfs.h"
31#include "cifspdu.h"
32#include "cifsglob.h"
33#include "cifsproto.h"
34#include "cifs_debug.h"
35#include "cifs_fs_sb.h"
36#include "cifs_unicode.h"
37#include "fscache.h"
38
39
40static void cifs_set_ops(struct inode *inode)
41{
42 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
43
44 switch (inode->i_mode & S_IFMT) {
45 case S_IFREG:
46 inode->i_op = &cifs_file_inode_ops;
47 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
48 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
49 inode->i_fop = &cifs_file_direct_nobrl_ops;
50 else
51 inode->i_fop = &cifs_file_direct_ops;
52 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
53 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
54 inode->i_fop = &cifs_file_strict_nobrl_ops;
55 else
56 inode->i_fop = &cifs_file_strict_ops;
57 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
58 inode->i_fop = &cifs_file_nobrl_ops;
59 else { /* not direct, send byte range locks */
60 inode->i_fop = &cifs_file_ops;
61 }
62
63 /* check if server can support readpages */
64 if (cifs_sb_master_tcon(cifs_sb)->ses->server->maxBuf <
65 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
66 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
67 else
68 inode->i_data.a_ops = &cifs_addr_ops;
69 break;
70 case S_IFDIR:
71#ifdef CONFIG_CIFS_DFS_UPCALL
72 if (IS_AUTOMOUNT(inode)) {
73 inode->i_op = &cifs_dfs_referral_inode_operations;
74 } else {
75#else /* NO DFS support, treat as a directory */
76 {
77#endif
78 inode->i_op = &cifs_dir_inode_ops;
79 inode->i_fop = &cifs_dir_ops;
80 }
81 break;
82 case S_IFLNK:
83 inode->i_op = &cifs_symlink_inode_ops;
84 break;
85 default:
86 init_special_inode(inode, inode->i_mode, inode->i_rdev);
87 break;
88 }
89}
90
91/* check inode attributes against fattr. If they don't match, tag the
92 * inode for cache invalidation
93 */
94static void
95cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
96{
97 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
98
99 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
100 __func__, cifs_i->uniqueid);
101
102 if (inode->i_state & I_NEW) {
103 cifs_dbg(FYI, "%s: inode %llu is new\n",
104 __func__, cifs_i->uniqueid);
105 return;
106 }
107
108 /* don't bother with revalidation if we have an oplock */
109 if (CIFS_CACHE_READ(cifs_i)) {
110 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
111 __func__, cifs_i->uniqueid);
112 return;
113 }
114
115 /* revalidate if mtime or size have changed */
116 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
117 cifs_i->server_eof == fattr->cf_eof) {
118 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
119 __func__, cifs_i->uniqueid);
120 return;
121 }
122
123 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
124 __func__, cifs_i->uniqueid);
125 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
126}
127
128/*
129 * copy nlink to the inode, unless it wasn't provided. Provide
130 * sane values if we don't have an existing one and none was provided
131 */
132static void
133cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
134{
135 /*
136 * if we're in a situation where we can't trust what we
137 * got from the server (readdir, some non-unix cases)
138 * fake reasonable values
139 */
140 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
141 /* only provide fake values on a new inode */
142 if (inode->i_state & I_NEW) {
143 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
144 set_nlink(inode, 2);
145 else
146 set_nlink(inode, 1);
147 }
148 return;
149 }
150
151 /* we trust the server, so update it */
152 set_nlink(inode, fattr->cf_nlink);
153}
154
155/* populate an inode with info from a cifs_fattr struct */
156void
157cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
158{
159 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
160 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
161
162 cifs_revalidate_cache(inode, fattr);
163
164 spin_lock(&inode->i_lock);
165 inode->i_atime = fattr->cf_atime;
166 inode->i_mtime = fattr->cf_mtime;
167 inode->i_ctime = fattr->cf_ctime;
168 inode->i_rdev = fattr->cf_rdev;
169 cifs_nlink_fattr_to_inode(inode, fattr);
170 inode->i_uid = fattr->cf_uid;
171 inode->i_gid = fattr->cf_gid;
172
173 /* if dynperm is set, don't clobber existing mode */
174 if (inode->i_state & I_NEW ||
175 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
176 inode->i_mode = fattr->cf_mode;
177
178 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
179
180 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
181 cifs_i->time = 0;
182 else
183 cifs_i->time = jiffies;
184
185 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
186 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
187 else
188 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
189
190 cifs_i->server_eof = fattr->cf_eof;
191 /*
192 * Can't safely change the file size here if the client is writing to
193 * it due to potential races.
194 */
195 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
196 i_size_write(inode, fattr->cf_eof);
197
198 /*
199 * i_blocks is not related to (i_size / i_blksize),
200 * but instead 512 byte (2**9) size is required for
201 * calculating num blocks.
202 */
203 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
204 }
205 spin_unlock(&inode->i_lock);
206
207 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
208 inode->i_flags |= S_AUTOMOUNT;
209 if (inode->i_state & I_NEW)
210 cifs_set_ops(inode);
211}
212
213void
214cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
215{
216 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
217
218 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
219 return;
220
221 fattr->cf_uniqueid = iunique(sb, ROOT_I);
222}
223
224/* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
225void
226cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
227 struct cifs_sb_info *cifs_sb)
228{
229 memset(fattr, 0, sizeof(*fattr));
230 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
231 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
232 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
233
234 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
235 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
236 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
237 /* old POSIX extensions don't get create time */
238
239 fattr->cf_mode = le64_to_cpu(info->Permissions);
240
241 /*
242 * Since we set the inode type below we need to mask off
243 * to avoid strange results if bits set above.
244 */
245 fattr->cf_mode &= ~S_IFMT;
246 switch (le32_to_cpu(info->Type)) {
247 case UNIX_FILE:
248 fattr->cf_mode |= S_IFREG;
249 fattr->cf_dtype = DT_REG;
250 break;
251 case UNIX_SYMLINK:
252 fattr->cf_mode |= S_IFLNK;
253 fattr->cf_dtype = DT_LNK;
254 break;
255 case UNIX_DIR:
256 fattr->cf_mode |= S_IFDIR;
257 fattr->cf_dtype = DT_DIR;
258 break;
259 case UNIX_CHARDEV:
260 fattr->cf_mode |= S_IFCHR;
261 fattr->cf_dtype = DT_CHR;
262 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
263 le64_to_cpu(info->DevMinor) & MINORMASK);
264 break;
265 case UNIX_BLOCKDEV:
266 fattr->cf_mode |= S_IFBLK;
267 fattr->cf_dtype = DT_BLK;
268 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
269 le64_to_cpu(info->DevMinor) & MINORMASK);
270 break;
271 case UNIX_FIFO:
272 fattr->cf_mode |= S_IFIFO;
273 fattr->cf_dtype = DT_FIFO;
274 break;
275 case UNIX_SOCKET:
276 fattr->cf_mode |= S_IFSOCK;
277 fattr->cf_dtype = DT_SOCK;
278 break;
279 default:
280 /* safest to call it a file if we do not know */
281 fattr->cf_mode |= S_IFREG;
282 fattr->cf_dtype = DT_REG;
283 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
284 break;
285 }
286
287 fattr->cf_uid = cifs_sb->mnt_uid;
288 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
289 u64 id = le64_to_cpu(info->Uid);
290 if (id < ((uid_t)-1)) {
291 kuid_t uid = make_kuid(&init_user_ns, id);
292 if (uid_valid(uid))
293 fattr->cf_uid = uid;
294 }
295 }
296
297 fattr->cf_gid = cifs_sb->mnt_gid;
298 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
299 u64 id = le64_to_cpu(info->Gid);
300 if (id < ((gid_t)-1)) {
301 kgid_t gid = make_kgid(&init_user_ns, id);
302 if (gid_valid(gid))
303 fattr->cf_gid = gid;
304 }
305 }
306
307 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
308}
309
310/*
311 * Fill a cifs_fattr struct with fake inode info.
312 *
313 * Needed to setup cifs_fattr data for the directory which is the
314 * junction to the new submount (ie to setup the fake directory
315 * which represents a DFS referral).
316 */
317static void
318cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
319{
320 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
321
322 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
323
324 memset(fattr, 0, sizeof(*fattr));
325 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
326 fattr->cf_uid = cifs_sb->mnt_uid;
327 fattr->cf_gid = cifs_sb->mnt_gid;
328 ktime_get_real_ts64(&fattr->cf_mtime);
329 fattr->cf_mtime = timespec64_trunc(fattr->cf_mtime, sb->s_time_gran);
330 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
331 fattr->cf_nlink = 2;
332 fattr->cf_flags |= CIFS_FATTR_DFS_REFERRAL;
333}
334
335static int
336cifs_get_file_info_unix(struct file *filp)
337{
338 int rc;
339 unsigned int xid;
340 FILE_UNIX_BASIC_INFO find_data;
341 struct cifs_fattr fattr;
342 struct inode *inode = file_inode(filp);
343 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
344 struct cifsFileInfo *cfile = filp->private_data;
345 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
346
347 xid = get_xid();
348 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
349 if (!rc) {
350 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
351 } else if (rc == -EREMOTE) {
352 cifs_create_dfs_fattr(&fattr, inode->i_sb);
353 rc = 0;
354 }
355
356 cifs_fattr_to_inode(inode, &fattr);
357 free_xid(xid);
358 return rc;
359}
360
361int cifs_get_inode_info_unix(struct inode **pinode,
362 const unsigned char *full_path,
363 struct super_block *sb, unsigned int xid)
364{
365 int rc;
366 FILE_UNIX_BASIC_INFO find_data;
367 struct cifs_fattr fattr;
368 struct cifs_tcon *tcon;
369 struct tcon_link *tlink;
370 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
371
372 cifs_dbg(FYI, "Getting info on %s\n", full_path);
373
374 tlink = cifs_sb_tlink(cifs_sb);
375 if (IS_ERR(tlink))
376 return PTR_ERR(tlink);
377 tcon = tlink_tcon(tlink);
378
379 /* could have done a find first instead but this returns more info */
380 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
381 cifs_sb->local_nls, cifs_remap(cifs_sb));
382 cifs_put_tlink(tlink);
383
384 if (!rc) {
385 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
386 } else if (rc == -EREMOTE) {
387 cifs_create_dfs_fattr(&fattr, sb);
388 rc = 0;
389 } else {
390 return rc;
391 }
392
393 /* check for Minshall+French symlinks */
394 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
395 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
396 full_path);
397 if (tmprc)
398 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
399 }
400
401 if (*pinode == NULL) {
402 /* get new inode */
403 cifs_fill_uniqueid(sb, &fattr);
404 *pinode = cifs_iget(sb, &fattr);
405 if (!*pinode)
406 rc = -ENOMEM;
407 } else {
408 /* we already have inode, update it */
409
410 /* if uniqueid is different, return error */
411 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
412 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
413 rc = -ESTALE;
414 goto cgiiu_exit;
415 }
416
417 /* if filetype is different, return error */
418 if (unlikely(((*pinode)->i_mode & S_IFMT) !=
419 (fattr.cf_mode & S_IFMT))) {
420 rc = -ESTALE;
421 goto cgiiu_exit;
422 }
423
424 cifs_fattr_to_inode(*pinode, &fattr);
425 }
426
427cgiiu_exit:
428 return rc;
429}
430
431static int
432cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
433 struct cifs_sb_info *cifs_sb, unsigned int xid)
434{
435 int rc;
436 __u32 oplock;
437 struct tcon_link *tlink;
438 struct cifs_tcon *tcon;
439 struct cifs_fid fid;
440 struct cifs_open_parms oparms;
441 struct cifs_io_parms io_parms;
442 char buf[24];
443 unsigned int bytes_read;
444 char *pbuf;
445 int buf_type = CIFS_NO_BUFFER;
446
447 pbuf = buf;
448
449 fattr->cf_mode &= ~S_IFMT;
450
451 if (fattr->cf_eof == 0) {
452 fattr->cf_mode |= S_IFIFO;
453 fattr->cf_dtype = DT_FIFO;
454 return 0;
455 } else if (fattr->cf_eof < 8) {
456 fattr->cf_mode |= S_IFREG;
457 fattr->cf_dtype = DT_REG;
458 return -EINVAL; /* EOPNOTSUPP? */
459 }
460
461 tlink = cifs_sb_tlink(cifs_sb);
462 if (IS_ERR(tlink))
463 return PTR_ERR(tlink);
464 tcon = tlink_tcon(tlink);
465
466 oparms.tcon = tcon;
467 oparms.cifs_sb = cifs_sb;
468 oparms.desired_access = GENERIC_READ;
469 oparms.create_options = CREATE_NOT_DIR;
470 if (backup_cred(cifs_sb))
471 oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
472 oparms.disposition = FILE_OPEN;
473 oparms.path = path;
474 oparms.fid = &fid;
475 oparms.reconnect = false;
476
477 if (tcon->ses->server->oplocks)
478 oplock = REQ_OPLOCK;
479 else
480 oplock = 0;
481 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
482 if (rc) {
483 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
484 cifs_put_tlink(tlink);
485 return rc;
486 }
487
488 /* Read header */
489 io_parms.netfid = fid.netfid;
490 io_parms.pid = current->tgid;
491 io_parms.tcon = tcon;
492 io_parms.offset = 0;
493 io_parms.length = 24;
494
495 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
496 &bytes_read, &pbuf, &buf_type);
497 if ((rc == 0) && (bytes_read >= 8)) {
498 if (memcmp("IntxBLK", pbuf, 8) == 0) {
499 cifs_dbg(FYI, "Block device\n");
500 fattr->cf_mode |= S_IFBLK;
501 fattr->cf_dtype = DT_BLK;
502 if (bytes_read == 24) {
503 /* we have enough to decode dev num */
504 __u64 mjr; /* major */
505 __u64 mnr; /* minor */
506 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
507 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
508 fattr->cf_rdev = MKDEV(mjr, mnr);
509 }
510 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
511 cifs_dbg(FYI, "Char device\n");
512 fattr->cf_mode |= S_IFCHR;
513 fattr->cf_dtype = DT_CHR;
514 if (bytes_read == 24) {
515 /* we have enough to decode dev num */
516 __u64 mjr; /* major */
517 __u64 mnr; /* minor */
518 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
519 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
520 fattr->cf_rdev = MKDEV(mjr, mnr);
521 }
522 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
523 cifs_dbg(FYI, "Symlink\n");
524 fattr->cf_mode |= S_IFLNK;
525 fattr->cf_dtype = DT_LNK;
526 } else {
527 fattr->cf_mode |= S_IFREG; /* file? */
528 fattr->cf_dtype = DT_REG;
529 rc = -EOPNOTSUPP;
530 }
531 } else {
532 fattr->cf_mode |= S_IFREG; /* then it is a file */
533 fattr->cf_dtype = DT_REG;
534 rc = -EOPNOTSUPP; /* or some unknown SFU type */
535 }
536
537 tcon->ses->server->ops->close(xid, tcon, &fid);
538 cifs_put_tlink(tlink);
539 return rc;
540}
541
542#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
543
544/*
545 * Fetch mode bits as provided by SFU.
546 *
547 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
548 */
549static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
550 struct cifs_sb_info *cifs_sb, unsigned int xid)
551{
552#ifdef CONFIG_CIFS_XATTR
553 ssize_t rc;
554 char ea_value[4];
555 __u32 mode;
556 struct tcon_link *tlink;
557 struct cifs_tcon *tcon;
558
559 tlink = cifs_sb_tlink(cifs_sb);
560 if (IS_ERR(tlink))
561 return PTR_ERR(tlink);
562 tcon = tlink_tcon(tlink);
563
564 if (tcon->ses->server->ops->query_all_EAs == NULL) {
565 cifs_put_tlink(tlink);
566 return -EOPNOTSUPP;
567 }
568
569 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
570 "SETFILEBITS", ea_value, 4 /* size of buf */,
571 cifs_sb);
572 cifs_put_tlink(tlink);
573 if (rc < 0)
574 return (int)rc;
575 else if (rc > 3) {
576 mode = le32_to_cpu(*((__le32 *)ea_value));
577 fattr->cf_mode &= ~SFBITS_MASK;
578 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
579 mode, fattr->cf_mode);
580 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
581 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
582 }
583
584 return 0;
585#else
586 return -EOPNOTSUPP;
587#endif
588}
589
590/* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
591static void
592cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
593 struct super_block *sb, bool adjust_tz,
594 bool symlink)
595{
596 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
597 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
598
599 memset(fattr, 0, sizeof(*fattr));
600 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
601 if (info->DeletePending)
602 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
603
604 if (info->LastAccessTime)
605 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
606 else {
607 ktime_get_real_ts64(&fattr->cf_atime);
608 fattr->cf_atime = timespec64_trunc(fattr->cf_atime, sb->s_time_gran);
609 }
610
611 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
612 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
613
614 if (adjust_tz) {
615 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
616 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
617 }
618
619 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
620 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
621 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
622
623 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
624
625 if (symlink) {
626 fattr->cf_mode = S_IFLNK;
627 fattr->cf_dtype = DT_LNK;
628 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
629 fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
630 fattr->cf_dtype = DT_DIR;
631 /*
632 * Server can return wrong NumberOfLinks value for directories
633 * when Unix extensions are disabled - fake it.
634 */
635 if (!tcon->unix_ext)
636 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
637 } else {
638 fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
639 fattr->cf_dtype = DT_REG;
640
641 /* clear write bits if ATTR_READONLY is set */
642 if (fattr->cf_cifsattrs & ATTR_READONLY)
643 fattr->cf_mode &= ~(S_IWUGO);
644
645 /*
646 * Don't accept zero nlink from non-unix servers unless
647 * delete is pending. Instead mark it as unknown.
648 */
649 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
650 !info->DeletePending) {
651 cifs_dbg(1, "bogus file nlink value %u\n",
652 fattr->cf_nlink);
653 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
654 }
655 }
656
657 fattr->cf_uid = cifs_sb->mnt_uid;
658 fattr->cf_gid = cifs_sb->mnt_gid;
659}
660
661static int
662cifs_get_file_info(struct file *filp)
663{
664 int rc;
665 unsigned int xid;
666 FILE_ALL_INFO find_data;
667 struct cifs_fattr fattr;
668 struct inode *inode = file_inode(filp);
669 struct cifsFileInfo *cfile = filp->private_data;
670 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
671 struct TCP_Server_Info *server = tcon->ses->server;
672
673 if (!server->ops->query_file_info)
674 return -ENOSYS;
675
676 xid = get_xid();
677 rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
678 switch (rc) {
679 case 0:
680 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
681 false);
682 break;
683 case -EREMOTE:
684 cifs_create_dfs_fattr(&fattr, inode->i_sb);
685 rc = 0;
686 break;
687 case -EOPNOTSUPP:
688 case -EINVAL:
689 /*
690 * FIXME: legacy server -- fall back to path-based call?
691 * for now, just skip revalidating and mark inode for
692 * immediate reval.
693 */
694 rc = 0;
695 CIFS_I(inode)->time = 0;
696 default:
697 goto cgfi_exit;
698 }
699
700 /*
701 * don't bother with SFU junk here -- just mark inode as needing
702 * revalidation.
703 */
704 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
705 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
706 cifs_fattr_to_inode(inode, &fattr);
707cgfi_exit:
708 free_xid(xid);
709 return rc;
710}
711
712/* Simple function to return a 64 bit hash of string. Rarely called */
713static __u64 simple_hashstr(const char *str)
714{
715 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
716 __u64 hash = 0;
717
718 while (*str)
719 hash = (hash + (__u64) *str++) * hash_mult;
720
721 return hash;
722}
723
724int
725cifs_get_inode_info(struct inode **inode, const char *full_path,
726 FILE_ALL_INFO *data, struct super_block *sb, int xid,
727 const struct cifs_fid *fid)
728{
729 bool validinum = false;
730 __u16 srchflgs;
731 int rc = 0, tmprc = ENOSYS;
732 struct cifs_tcon *tcon;
733 struct TCP_Server_Info *server;
734 struct tcon_link *tlink;
735 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
736 char *buf = NULL;
737 bool adjust_tz = false;
738 struct cifs_fattr fattr;
739 struct cifs_search_info *srchinf = NULL;
740 bool symlink = false;
741
742 tlink = cifs_sb_tlink(cifs_sb);
743 if (IS_ERR(tlink))
744 return PTR_ERR(tlink);
745 tcon = tlink_tcon(tlink);
746 server = tcon->ses->server;
747
748 cifs_dbg(FYI, "Getting info on %s\n", full_path);
749
750 if ((data == NULL) && (*inode != NULL)) {
751 if (CIFS_CACHE_READ(CIFS_I(*inode)) &&
752 CIFS_I(*inode)->time != 0) {
753 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
754 goto cgii_exit;
755 }
756 }
757
758 /* if inode info is not passed, get it from server */
759 if (data == NULL) {
760 if (!server->ops->query_path_info) {
761 rc = -ENOSYS;
762 goto cgii_exit;
763 }
764 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
765 if (buf == NULL) {
766 rc = -ENOMEM;
767 goto cgii_exit;
768 }
769 data = (FILE_ALL_INFO *)buf;
770 rc = server->ops->query_path_info(xid, tcon, cifs_sb, full_path,
771 data, &adjust_tz, &symlink);
772 }
773
774 if (!rc) {
775 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
776 symlink);
777 } else if (rc == -EREMOTE) {
778 cifs_create_dfs_fattr(&fattr, sb);
779 rc = 0;
780 } else if ((rc == -EACCES) && backup_cred(cifs_sb) &&
781 (strcmp(server->vals->version_string, SMB1_VERSION_STRING)
782 == 0)) {
783 /*
784 * For SMB2 and later the backup intent flag is already
785 * sent if needed on open and there is no path based
786 * FindFirst operation to use to retry with
787 */
788
789 srchinf = kzalloc(sizeof(struct cifs_search_info),
790 GFP_KERNEL);
791 if (srchinf == NULL) {
792 rc = -ENOMEM;
793 goto cgii_exit;
794 }
795
796 srchinf->endOfSearch = false;
797 srchinf->info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
798
799 srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
800 CIFS_SEARCH_CLOSE_AT_END |
801 CIFS_SEARCH_BACKUP_SEARCH;
802
803 rc = CIFSFindFirst(xid, tcon, full_path,
804 cifs_sb, NULL, srchflgs, srchinf, false);
805 if (!rc) {
806 data =
807 (FILE_ALL_INFO *)srchinf->srch_entries_start;
808
809 cifs_dir_info_to_fattr(&fattr,
810 (FILE_DIRECTORY_INFO *)data, cifs_sb);
811 fattr.cf_uniqueid = le64_to_cpu(
812 ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
813 validinum = true;
814
815 cifs_buf_release(srchinf->ntwrk_buf_start);
816 }
817 kfree(srchinf);
818 if (rc)
819 goto cgii_exit;
820 } else
821 goto cgii_exit;
822
823 /*
824 * If an inode wasn't passed in, then get the inode number
825 *
826 * Is an i_ino of zero legal? Can we use that to check if the server
827 * supports returning inode numbers? Are there other sanity checks we
828 * can use to ensure that the server is really filling in that field?
829 */
830 if (*inode == NULL) {
831 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
832 if (validinum == false) {
833 if (server->ops->get_srv_inum)
834 tmprc = server->ops->get_srv_inum(xid,
835 tcon, cifs_sb, full_path,
836 &fattr.cf_uniqueid, data);
837 if (tmprc) {
838 cifs_dbg(FYI, "GetSrvInodeNum rc %d\n",
839 tmprc);
840 fattr.cf_uniqueid = iunique(sb, ROOT_I);
841 cifs_autodisable_serverino(cifs_sb);
842 } else if ((fattr.cf_uniqueid == 0) &&
843 strlen(full_path) == 0) {
844 /* some servers ret bad root ino ie 0 */
845 cifs_dbg(FYI, "Invalid (0) inodenum\n");
846 fattr.cf_flags |=
847 CIFS_FATTR_FAKE_ROOT_INO;
848 fattr.cf_uniqueid =
849 simple_hashstr(tcon->treeName);
850 }
851 }
852 } else
853 fattr.cf_uniqueid = iunique(sb, ROOT_I);
854 } else {
855 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
856 validinum == false && server->ops->get_srv_inum) {
857 /*
858 * Pass a NULL tcon to ensure we don't make a round
859 * trip to the server. This only works for SMB2+.
860 */
861 tmprc = server->ops->get_srv_inum(xid,
862 NULL, cifs_sb, full_path,
863 &fattr.cf_uniqueid, data);
864 if (tmprc)
865 fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
866 else if ((fattr.cf_uniqueid == 0) &&
867 strlen(full_path) == 0) {
868 /*
869 * Reuse existing root inode num since
870 * inum zero for root causes ls of . and .. to
871 * not be returned
872 */
873 cifs_dbg(FYI, "Srv ret 0 inode num for root\n");
874 fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
875 }
876 } else
877 fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
878 }
879
880 /* query for SFU type info if supported and needed */
881 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
882 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
883 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
884 if (tmprc)
885 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
886 }
887
888#ifdef CONFIG_CIFS_ACL
889 /* fill in 0777 bits from ACL */
890 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
891 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, full_path, fid);
892 if (rc) {
893 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
894 __func__, rc);
895 goto cgii_exit;
896 }
897 }
898#endif /* CONFIG_CIFS_ACL */
899
900 /* fill in remaining high mode bits e.g. SUID, VTX */
901 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
902 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
903
904 /* check for Minshall+French symlinks */
905 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
906 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
907 full_path);
908 if (tmprc)
909 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
910 }
911
912 if (!*inode) {
913 *inode = cifs_iget(sb, &fattr);
914 if (!*inode)
915 rc = -ENOMEM;
916 } else {
917 /* we already have inode, update it */
918
919 /* if uniqueid is different, return error */
920 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
921 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
922 rc = -ESTALE;
923 goto cgii_exit;
924 }
925
926 /* if filetype is different, return error */
927 if (unlikely(((*inode)->i_mode & S_IFMT) !=
928 (fattr.cf_mode & S_IFMT))) {
929 rc = -ESTALE;
930 goto cgii_exit;
931 }
932
933 cifs_fattr_to_inode(*inode, &fattr);
934 }
935
936cgii_exit:
937 if ((*inode) && ((*inode)->i_ino == 0))
938 cifs_dbg(FYI, "inode number of zero returned\n");
939
940 kfree(buf);
941 cifs_put_tlink(tlink);
942 return rc;
943}
944
945static const struct inode_operations cifs_ipc_inode_ops = {
946 .lookup = cifs_lookup,
947};
948
949static int
950cifs_find_inode(struct inode *inode, void *opaque)
951{
952 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
953
954 /* don't match inode with different uniqueid */
955 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
956 return 0;
957
958 /* use createtime like an i_generation field */
959 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
960 return 0;
961
962 /* don't match inode of different type */
963 if ((inode->i_mode & S_IFMT) != (fattr->cf_mode & S_IFMT))
964 return 0;
965
966 /* if it's not a directory or has no dentries, then flag it */
967 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
968 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
969
970 return 1;
971}
972
973static int
974cifs_init_inode(struct inode *inode, void *opaque)
975{
976 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
977
978 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
979 CIFS_I(inode)->createtime = fattr->cf_createtime;
980 return 0;
981}
982
983/*
984 * walk dentry list for an inode and report whether it has aliases that
985 * are hashed. We use this to determine if a directory inode can actually
986 * be used.
987 */
988static bool
989inode_has_hashed_dentries(struct inode *inode)
990{
991 struct dentry *dentry;
992
993 spin_lock(&inode->i_lock);
994 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
995 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
996 spin_unlock(&inode->i_lock);
997 return true;
998 }
999 }
1000 spin_unlock(&inode->i_lock);
1001 return false;
1002}
1003
1004/* Given fattrs, get a corresponding inode */
1005struct inode *
1006cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1007{
1008 unsigned long hash;
1009 struct inode *inode;
1010
1011retry_iget5_locked:
1012 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1013
1014 /* hash down to 32-bits on 32-bit arch */
1015 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1016
1017 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1018 if (inode) {
1019 /* was there a potentially problematic inode collision? */
1020 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1021 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1022
1023 if (inode_has_hashed_dentries(inode)) {
1024 cifs_autodisable_serverino(CIFS_SB(sb));
1025 iput(inode);
1026 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1027 goto retry_iget5_locked;
1028 }
1029 }
1030
1031 cifs_fattr_to_inode(inode, fattr);
1032 if (sb->s_flags & SB_NOATIME)
1033 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1034 if (inode->i_state & I_NEW) {
1035 inode->i_ino = hash;
1036#ifdef CONFIG_CIFS_FSCACHE
1037 /* initialize per-inode cache cookie pointer */
1038 CIFS_I(inode)->fscache = NULL;
1039#endif
1040 unlock_new_inode(inode);
1041 }
1042 }
1043
1044 return inode;
1045}
1046
1047/* gets root inode */
1048struct inode *cifs_root_iget(struct super_block *sb)
1049{
1050 unsigned int xid;
1051 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1052 struct inode *inode = NULL;
1053 long rc;
1054 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1055 char *path = NULL;
1056 int len;
1057
1058 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1059 && cifs_sb->prepath) {
1060 len = strlen(cifs_sb->prepath);
1061 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1062 if (path == NULL)
1063 return ERR_PTR(-ENOMEM);
1064 path[0] = '/';
1065 memcpy(path+1, cifs_sb->prepath, len);
1066 } else {
1067 path = kstrdup("", GFP_KERNEL);
1068 if (path == NULL)
1069 return ERR_PTR(-ENOMEM);
1070 }
1071
1072 xid = get_xid();
1073 if (tcon->unix_ext) {
1074 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1075 /* some servers mistakenly claim POSIX support */
1076 if (rc != -EOPNOTSUPP)
1077 goto iget_no_retry;
1078 cifs_dbg(VFS, "server does not support POSIX extensions");
1079 tcon->unix_ext = false;
1080 }
1081
1082 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1083 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1084
1085iget_no_retry:
1086 if (!inode) {
1087 inode = ERR_PTR(rc);
1088 goto out;
1089 }
1090
1091#ifdef CONFIG_CIFS_FSCACHE
1092 /* populate tcon->resource_id */
1093 tcon->resource_id = CIFS_I(inode)->uniqueid;
1094#endif
1095
1096 if (rc && tcon->pipe) {
1097 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1098 spin_lock(&inode->i_lock);
1099 inode->i_mode |= S_IFDIR;
1100 set_nlink(inode, 2);
1101 inode->i_op = &cifs_ipc_inode_ops;
1102 inode->i_fop = &simple_dir_operations;
1103 inode->i_uid = cifs_sb->mnt_uid;
1104 inode->i_gid = cifs_sb->mnt_gid;
1105 spin_unlock(&inode->i_lock);
1106 } else if (rc) {
1107 iget_failed(inode);
1108 inode = ERR_PTR(rc);
1109 }
1110
1111out:
1112 kfree(path);
1113 free_xid(xid);
1114 return inode;
1115}
1116
1117int
1118cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1119 char *full_path, __u32 dosattr)
1120{
1121 bool set_time = false;
1122 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1123 struct TCP_Server_Info *server;
1124 FILE_BASIC_INFO info_buf;
1125
1126 if (attrs == NULL)
1127 return -EINVAL;
1128
1129 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1130 if (!server->ops->set_file_info)
1131 return -ENOSYS;
1132
1133 info_buf.Pad = 0;
1134
1135 if (attrs->ia_valid & ATTR_ATIME) {
1136 set_time = true;
1137 info_buf.LastAccessTime =
1138 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1139 } else
1140 info_buf.LastAccessTime = 0;
1141
1142 if (attrs->ia_valid & ATTR_MTIME) {
1143 set_time = true;
1144 info_buf.LastWriteTime =
1145 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1146 } else
1147 info_buf.LastWriteTime = 0;
1148
1149 /*
1150 * Samba throws this field away, but windows may actually use it.
1151 * Do not set ctime unless other time stamps are changed explicitly
1152 * (i.e. by utimes()) since we would then have a mix of client and
1153 * server times.
1154 */
1155 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1156 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1157 info_buf.ChangeTime =
1158 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1159 } else
1160 info_buf.ChangeTime = 0;
1161
1162 info_buf.CreationTime = 0; /* don't change */
1163 info_buf.Attributes = cpu_to_le32(dosattr);
1164
1165 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1166}
1167
1168/*
1169 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1170 * and rename it to a random name that hopefully won't conflict with
1171 * anything else.
1172 */
1173int
1174cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1175 const unsigned int xid)
1176{
1177 int oplock = 0;
1178 int rc;
1179 struct cifs_fid fid;
1180 struct cifs_open_parms oparms;
1181 struct inode *inode = d_inode(dentry);
1182 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1183 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1184 struct tcon_link *tlink;
1185 struct cifs_tcon *tcon;
1186 __u32 dosattr, origattr;
1187 FILE_BASIC_INFO *info_buf = NULL;
1188
1189 tlink = cifs_sb_tlink(cifs_sb);
1190 if (IS_ERR(tlink))
1191 return PTR_ERR(tlink);
1192 tcon = tlink_tcon(tlink);
1193
1194 /*
1195 * We cannot rename the file if the server doesn't support
1196 * CAP_INFOLEVEL_PASSTHRU
1197 */
1198 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1199 rc = -EBUSY;
1200 goto out;
1201 }
1202
1203 oparms.tcon = tcon;
1204 oparms.cifs_sb = cifs_sb;
1205 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1206 oparms.create_options = CREATE_NOT_DIR;
1207 oparms.disposition = FILE_OPEN;
1208 oparms.path = full_path;
1209 oparms.fid = &fid;
1210 oparms.reconnect = false;
1211
1212 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1213 if (rc != 0)
1214 goto out;
1215
1216 origattr = cifsInode->cifsAttrs;
1217 if (origattr == 0)
1218 origattr |= ATTR_NORMAL;
1219
1220 dosattr = origattr & ~ATTR_READONLY;
1221 if (dosattr == 0)
1222 dosattr |= ATTR_NORMAL;
1223 dosattr |= ATTR_HIDDEN;
1224
1225 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1226 if (dosattr != origattr) {
1227 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1228 if (info_buf == NULL) {
1229 rc = -ENOMEM;
1230 goto out_close;
1231 }
1232 info_buf->Attributes = cpu_to_le32(dosattr);
1233 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1234 current->tgid);
1235 /* although we would like to mark the file hidden
1236 if that fails we will still try to rename it */
1237 if (!rc)
1238 cifsInode->cifsAttrs = dosattr;
1239 else
1240 dosattr = origattr; /* since not able to change them */
1241 }
1242
1243 /* rename the file */
1244 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1245 cifs_sb->local_nls,
1246 cifs_remap(cifs_sb));
1247 if (rc != 0) {
1248 rc = -EBUSY;
1249 goto undo_setattr;
1250 }
1251
1252 /* try to set DELETE_ON_CLOSE */
1253 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1254 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1255 current->tgid);
1256 /*
1257 * some samba versions return -ENOENT when we try to set the
1258 * file disposition here. Likely a samba bug, but work around
1259 * it for now. This means that some cifsXXX files may hang
1260 * around after they shouldn't.
1261 *
1262 * BB: remove this hack after more servers have the fix
1263 */
1264 if (rc == -ENOENT)
1265 rc = 0;
1266 else if (rc != 0) {
1267 rc = -EBUSY;
1268 goto undo_rename;
1269 }
1270 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1271 }
1272
1273out_close:
1274 CIFSSMBClose(xid, tcon, fid.netfid);
1275out:
1276 kfree(info_buf);
1277 cifs_put_tlink(tlink);
1278 return rc;
1279
1280 /*
1281 * reset everything back to the original state. Don't bother
1282 * dealing with errors here since we can't do anything about
1283 * them anyway.
1284 */
1285undo_rename:
1286 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1287 cifs_sb->local_nls, cifs_remap(cifs_sb));
1288undo_setattr:
1289 if (dosattr != origattr) {
1290 info_buf->Attributes = cpu_to_le32(origattr);
1291 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1292 current->tgid))
1293 cifsInode->cifsAttrs = origattr;
1294 }
1295
1296 goto out_close;
1297}
1298
1299/* copied from fs/nfs/dir.c with small changes */
1300static void
1301cifs_drop_nlink(struct inode *inode)
1302{
1303 spin_lock(&inode->i_lock);
1304 if (inode->i_nlink > 0)
1305 drop_nlink(inode);
1306 spin_unlock(&inode->i_lock);
1307}
1308
1309/*
1310 * If d_inode(dentry) is null (usually meaning the cached dentry
1311 * is a negative dentry) then we would attempt a standard SMB delete, but
1312 * if that fails we can not attempt the fall back mechanisms on EACCESS
1313 * but will return the EACCESS to the caller. Note that the VFS does not call
1314 * unlink on negative dentries currently.
1315 */
1316int cifs_unlink(struct inode *dir, struct dentry *dentry)
1317{
1318 int rc = 0;
1319 unsigned int xid;
1320 char *full_path = NULL;
1321 struct inode *inode = d_inode(dentry);
1322 struct cifsInodeInfo *cifs_inode;
1323 struct super_block *sb = dir->i_sb;
1324 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1325 struct tcon_link *tlink;
1326 struct cifs_tcon *tcon;
1327 struct TCP_Server_Info *server;
1328 struct iattr *attrs = NULL;
1329 __u32 dosattr = 0, origattr = 0;
1330
1331 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1332
1333 tlink = cifs_sb_tlink(cifs_sb);
1334 if (IS_ERR(tlink))
1335 return PTR_ERR(tlink);
1336 tcon = tlink_tcon(tlink);
1337 server = tcon->ses->server;
1338
1339 xid = get_xid();
1340
1341 /* Unlink can be called from rename so we can not take the
1342 * sb->s_vfs_rename_mutex here */
1343 full_path = build_path_from_dentry(dentry);
1344 if (full_path == NULL) {
1345 rc = -ENOMEM;
1346 goto unlink_out;
1347 }
1348
1349 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1350 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1351 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1352 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1353 cifs_remap(cifs_sb));
1354 cifs_dbg(FYI, "posix del rc %d\n", rc);
1355 if ((rc == 0) || (rc == -ENOENT))
1356 goto psx_del_no_retry;
1357 }
1358
1359retry_std_delete:
1360 if (!server->ops->unlink) {
1361 rc = -ENOSYS;
1362 goto psx_del_no_retry;
1363 }
1364
1365 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1366
1367psx_del_no_retry:
1368 if (!rc) {
1369 if (inode)
1370 cifs_drop_nlink(inode);
1371 } else if (rc == -ENOENT) {
1372 d_drop(dentry);
1373 } else if (rc == -EBUSY) {
1374 if (server->ops->rename_pending_delete) {
1375 rc = server->ops->rename_pending_delete(full_path,
1376 dentry, xid);
1377 if (rc == 0)
1378 cifs_drop_nlink(inode);
1379 }
1380 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1381 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1382 if (attrs == NULL) {
1383 rc = -ENOMEM;
1384 goto out_reval;
1385 }
1386
1387 /* try to reset dos attributes */
1388 cifs_inode = CIFS_I(inode);
1389 origattr = cifs_inode->cifsAttrs;
1390 if (origattr == 0)
1391 origattr |= ATTR_NORMAL;
1392 dosattr = origattr & ~ATTR_READONLY;
1393 if (dosattr == 0)
1394 dosattr |= ATTR_NORMAL;
1395 dosattr |= ATTR_HIDDEN;
1396
1397 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1398 if (rc != 0)
1399 goto out_reval;
1400
1401 goto retry_std_delete;
1402 }
1403
1404 /* undo the setattr if we errored out and it's needed */
1405 if (rc != 0 && dosattr != 0)
1406 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1407
1408out_reval:
1409 if (inode) {
1410 cifs_inode = CIFS_I(inode);
1411 cifs_inode->time = 0; /* will force revalidate to get info
1412 when needed */
1413 inode->i_ctime = current_time(inode);
1414 }
1415 dir->i_ctime = dir->i_mtime = current_time(dir);
1416 cifs_inode = CIFS_I(dir);
1417 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1418unlink_out:
1419 kfree(full_path);
1420 kfree(attrs);
1421 free_xid(xid);
1422 cifs_put_tlink(tlink);
1423 return rc;
1424}
1425
1426static int
1427cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1428 const char *full_path, struct cifs_sb_info *cifs_sb,
1429 struct cifs_tcon *tcon, const unsigned int xid)
1430{
1431 int rc = 0;
1432 struct inode *inode = NULL;
1433
1434 if (tcon->unix_ext)
1435 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1436 xid);
1437 else
1438 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1439 xid, NULL);
1440
1441 if (rc)
1442 return rc;
1443
1444 /*
1445 * setting nlink not necessary except in cases where we failed to get it
1446 * from the server or was set bogus. Also, since this is a brand new
1447 * inode, no need to grab the i_lock before setting the i_nlink.
1448 */
1449 if (inode->i_nlink < 2)
1450 set_nlink(inode, 2);
1451 mode &= ~current_umask();
1452 /* must turn on setgid bit if parent dir has it */
1453 if (parent->i_mode & S_ISGID)
1454 mode |= S_ISGID;
1455
1456 if (tcon->unix_ext) {
1457 struct cifs_unix_set_info_args args = {
1458 .mode = mode,
1459 .ctime = NO_CHANGE_64,
1460 .atime = NO_CHANGE_64,
1461 .mtime = NO_CHANGE_64,
1462 .device = 0,
1463 };
1464 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1465 args.uid = current_fsuid();
1466 if (parent->i_mode & S_ISGID)
1467 args.gid = parent->i_gid;
1468 else
1469 args.gid = current_fsgid();
1470 } else {
1471 args.uid = INVALID_UID; /* no change */
1472 args.gid = INVALID_GID; /* no change */
1473 }
1474 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1475 cifs_sb->local_nls,
1476 cifs_remap(cifs_sb));
1477 } else {
1478 struct TCP_Server_Info *server = tcon->ses->server;
1479 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1480 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1481 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1482 tcon, xid);
1483 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1484 inode->i_mode = (mode | S_IFDIR);
1485
1486 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1487 inode->i_uid = current_fsuid();
1488 if (inode->i_mode & S_ISGID)
1489 inode->i_gid = parent->i_gid;
1490 else
1491 inode->i_gid = current_fsgid();
1492 }
1493 }
1494 d_instantiate(dentry, inode);
1495 return rc;
1496}
1497
1498static int
1499cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1500 const char *full_path, struct cifs_sb_info *cifs_sb,
1501 struct cifs_tcon *tcon, const unsigned int xid)
1502{
1503 int rc = 0;
1504 u32 oplock = 0;
1505 FILE_UNIX_BASIC_INFO *info = NULL;
1506 struct inode *newinode = NULL;
1507 struct cifs_fattr fattr;
1508
1509 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1510 if (info == NULL) {
1511 rc = -ENOMEM;
1512 goto posix_mkdir_out;
1513 }
1514
1515 mode &= ~current_umask();
1516 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1517 NULL /* netfid */, info, &oplock, full_path,
1518 cifs_sb->local_nls, cifs_remap(cifs_sb));
1519 if (rc == -EOPNOTSUPP)
1520 goto posix_mkdir_out;
1521 else if (rc) {
1522 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1523 d_drop(dentry);
1524 goto posix_mkdir_out;
1525 }
1526
1527 if (info->Type == cpu_to_le32(-1))
1528 /* no return info, go query for it */
1529 goto posix_mkdir_get_info;
1530 /*
1531 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1532 * need to set uid/gid.
1533 */
1534
1535 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1536 cifs_fill_uniqueid(inode->i_sb, &fattr);
1537 newinode = cifs_iget(inode->i_sb, &fattr);
1538 if (!newinode)
1539 goto posix_mkdir_get_info;
1540
1541 d_instantiate(dentry, newinode);
1542
1543#ifdef CONFIG_CIFS_DEBUG2
1544 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1545 dentry, dentry, newinode);
1546
1547 if (newinode->i_nlink != 2)
1548 cifs_dbg(FYI, "unexpected number of links %d\n",
1549 newinode->i_nlink);
1550#endif
1551
1552posix_mkdir_out:
1553 kfree(info);
1554 return rc;
1555posix_mkdir_get_info:
1556 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1557 xid);
1558 goto posix_mkdir_out;
1559}
1560
1561int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
1562{
1563 int rc = 0;
1564 unsigned int xid;
1565 struct cifs_sb_info *cifs_sb;
1566 struct tcon_link *tlink;
1567 struct cifs_tcon *tcon;
1568 struct TCP_Server_Info *server;
1569 char *full_path;
1570
1571 cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n",
1572 mode, inode);
1573
1574 cifs_sb = CIFS_SB(inode->i_sb);
1575 tlink = cifs_sb_tlink(cifs_sb);
1576 if (IS_ERR(tlink))
1577 return PTR_ERR(tlink);
1578 tcon = tlink_tcon(tlink);
1579
1580 xid = get_xid();
1581
1582 full_path = build_path_from_dentry(direntry);
1583 if (full_path == NULL) {
1584 rc = -ENOMEM;
1585 goto mkdir_out;
1586 }
1587
1588 server = tcon->ses->server;
1589
1590 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1591 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1592 cifs_sb);
1593 d_drop(direntry); /* for time being always refresh inode info */
1594 goto mkdir_out;
1595 }
1596
1597 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1598 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1599 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1600 tcon, xid);
1601 if (rc != -EOPNOTSUPP)
1602 goto mkdir_out;
1603 }
1604
1605 if (!server->ops->mkdir) {
1606 rc = -ENOSYS;
1607 goto mkdir_out;
1608 }
1609
1610 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1611 rc = server->ops->mkdir(xid, tcon, full_path, cifs_sb);
1612 if (rc) {
1613 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1614 d_drop(direntry);
1615 goto mkdir_out;
1616 }
1617
1618 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1619 xid);
1620mkdir_out:
1621 /*
1622 * Force revalidate to get parent dir info when needed since cached
1623 * attributes are invalid now.
1624 */
1625 CIFS_I(inode)->time = 0;
1626 kfree(full_path);
1627 free_xid(xid);
1628 cifs_put_tlink(tlink);
1629 return rc;
1630}
1631
1632int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1633{
1634 int rc = 0;
1635 unsigned int xid;
1636 struct cifs_sb_info *cifs_sb;
1637 struct tcon_link *tlink;
1638 struct cifs_tcon *tcon;
1639 struct TCP_Server_Info *server;
1640 char *full_path = NULL;
1641 struct cifsInodeInfo *cifsInode;
1642
1643 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1644
1645 xid = get_xid();
1646
1647 full_path = build_path_from_dentry(direntry);
1648 if (full_path == NULL) {
1649 rc = -ENOMEM;
1650 goto rmdir_exit;
1651 }
1652
1653 cifs_sb = CIFS_SB(inode->i_sb);
1654 tlink = cifs_sb_tlink(cifs_sb);
1655 if (IS_ERR(tlink)) {
1656 rc = PTR_ERR(tlink);
1657 goto rmdir_exit;
1658 }
1659 tcon = tlink_tcon(tlink);
1660 server = tcon->ses->server;
1661
1662 if (!server->ops->rmdir) {
1663 rc = -ENOSYS;
1664 cifs_put_tlink(tlink);
1665 goto rmdir_exit;
1666 }
1667
1668 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1669 cifs_put_tlink(tlink);
1670
1671 if (!rc) {
1672 spin_lock(&d_inode(direntry)->i_lock);
1673 i_size_write(d_inode(direntry), 0);
1674 clear_nlink(d_inode(direntry));
1675 spin_unlock(&d_inode(direntry)->i_lock);
1676 }
1677
1678 cifsInode = CIFS_I(d_inode(direntry));
1679 /* force revalidate to go get info when needed */
1680 cifsInode->time = 0;
1681
1682 cifsInode = CIFS_I(inode);
1683 /*
1684 * Force revalidate to get parent dir info when needed since cached
1685 * attributes are invalid now.
1686 */
1687 cifsInode->time = 0;
1688
1689 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
1690 current_time(inode);
1691
1692rmdir_exit:
1693 kfree(full_path);
1694 free_xid(xid);
1695 return rc;
1696}
1697
1698static int
1699cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1700 const char *from_path, struct dentry *to_dentry,
1701 const char *to_path)
1702{
1703 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
1704 struct tcon_link *tlink;
1705 struct cifs_tcon *tcon;
1706 struct TCP_Server_Info *server;
1707 struct cifs_fid fid;
1708 struct cifs_open_parms oparms;
1709 int oplock, rc;
1710
1711 tlink = cifs_sb_tlink(cifs_sb);
1712 if (IS_ERR(tlink))
1713 return PTR_ERR(tlink);
1714 tcon = tlink_tcon(tlink);
1715 server = tcon->ses->server;
1716
1717 if (!server->ops->rename)
1718 return -ENOSYS;
1719
1720 /* try path-based rename first */
1721 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
1722
1723 /*
1724 * Don't bother with rename by filehandle unless file is busy and
1725 * source. Note that cross directory moves do not work with
1726 * rename by filehandle to various Windows servers.
1727 */
1728 if (rc == 0 || rc != -EBUSY)
1729 goto do_rename_exit;
1730
1731 /* open-file renames don't work across directories */
1732 if (to_dentry->d_parent != from_dentry->d_parent)
1733 goto do_rename_exit;
1734
1735 oparms.tcon = tcon;
1736 oparms.cifs_sb = cifs_sb;
1737 /* open the file to be renamed -- we need DELETE perms */
1738 oparms.desired_access = DELETE;
1739 oparms.create_options = CREATE_NOT_DIR;
1740 oparms.disposition = FILE_OPEN;
1741 oparms.path = from_path;
1742 oparms.fid = &fid;
1743 oparms.reconnect = false;
1744
1745 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1746 if (rc == 0) {
1747 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
1748 (const char *) to_dentry->d_name.name,
1749 cifs_sb->local_nls, cifs_remap(cifs_sb));
1750 CIFSSMBClose(xid, tcon, fid.netfid);
1751 }
1752do_rename_exit:
1753 cifs_put_tlink(tlink);
1754 return rc;
1755}
1756
1757int
1758cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
1759 struct inode *target_dir, struct dentry *target_dentry,
1760 unsigned int flags)
1761{
1762 char *from_name = NULL;
1763 char *to_name = NULL;
1764 struct cifs_sb_info *cifs_sb;
1765 struct tcon_link *tlink;
1766 struct cifs_tcon *tcon;
1767 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
1768 FILE_UNIX_BASIC_INFO *info_buf_target;
1769 unsigned int xid;
1770 int rc, tmprc;
1771
1772 if (flags & ~RENAME_NOREPLACE)
1773 return -EINVAL;
1774
1775 cifs_sb = CIFS_SB(source_dir->i_sb);
1776 tlink = cifs_sb_tlink(cifs_sb);
1777 if (IS_ERR(tlink))
1778 return PTR_ERR(tlink);
1779 tcon = tlink_tcon(tlink);
1780
1781 xid = get_xid();
1782
1783 /*
1784 * we already have the rename sem so we do not need to
1785 * grab it again here to protect the path integrity
1786 */
1787 from_name = build_path_from_dentry(source_dentry);
1788 if (from_name == NULL) {
1789 rc = -ENOMEM;
1790 goto cifs_rename_exit;
1791 }
1792
1793 to_name = build_path_from_dentry(target_dentry);
1794 if (to_name == NULL) {
1795 rc = -ENOMEM;
1796 goto cifs_rename_exit;
1797 }
1798
1799 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
1800 to_name);
1801
1802 /*
1803 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
1804 */
1805 if (flags & RENAME_NOREPLACE)
1806 goto cifs_rename_exit;
1807
1808 if (rc == -EEXIST && tcon->unix_ext) {
1809 /*
1810 * Are src and dst hardlinks of same inode? We can only tell
1811 * with unix extensions enabled.
1812 */
1813 info_buf_source =
1814 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
1815 GFP_KERNEL);
1816 if (info_buf_source == NULL) {
1817 rc = -ENOMEM;
1818 goto cifs_rename_exit;
1819 }
1820
1821 info_buf_target = info_buf_source + 1;
1822 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
1823 info_buf_source,
1824 cifs_sb->local_nls,
1825 cifs_remap(cifs_sb));
1826 if (tmprc != 0)
1827 goto unlink_target;
1828
1829 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
1830 info_buf_target,
1831 cifs_sb->local_nls,
1832 cifs_remap(cifs_sb));
1833
1834 if (tmprc == 0 && (info_buf_source->UniqueId ==
1835 info_buf_target->UniqueId)) {
1836 /* same file, POSIX says that this is a noop */
1837 rc = 0;
1838 goto cifs_rename_exit;
1839 }
1840 }
1841 /*
1842 * else ... BB we could add the same check for Windows by
1843 * checking the UniqueId via FILE_INTERNAL_INFO
1844 */
1845
1846unlink_target:
1847 /* Try unlinking the target dentry if it's not negative */
1848 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
1849 if (d_is_dir(target_dentry))
1850 tmprc = cifs_rmdir(target_dir, target_dentry);
1851 else
1852 tmprc = cifs_unlink(target_dir, target_dentry);
1853 if (tmprc)
1854 goto cifs_rename_exit;
1855 rc = cifs_do_rename(xid, source_dentry, from_name,
1856 target_dentry, to_name);
1857 }
1858
1859 /* force revalidate to go get info when needed */
1860 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
1861
1862 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
1863 target_dir->i_mtime = current_time(source_dir);
1864
1865cifs_rename_exit:
1866 kfree(info_buf_source);
1867 kfree(from_name);
1868 kfree(to_name);
1869 free_xid(xid);
1870 cifs_put_tlink(tlink);
1871 return rc;
1872}
1873
1874static bool
1875cifs_inode_needs_reval(struct inode *inode)
1876{
1877 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1878 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1879
1880 if (cifs_i->time == 0)
1881 return true;
1882
1883 if (CIFS_CACHE_READ(cifs_i))
1884 return false;
1885
1886 if (!lookupCacheEnabled)
1887 return true;
1888
1889 if (!cifs_sb->actimeo)
1890 return true;
1891
1892 if (!time_in_range(jiffies, cifs_i->time,
1893 cifs_i->time + cifs_sb->actimeo))
1894 return true;
1895
1896 /* hardlinked files w/ noserverino get "special" treatment */
1897 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
1898 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
1899 return true;
1900
1901 return false;
1902}
1903
1904/*
1905 * Zap the cache. Called when invalid_mapping flag is set.
1906 */
1907int
1908cifs_invalidate_mapping(struct inode *inode)
1909{
1910 int rc = 0;
1911
1912 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
1913 rc = invalidate_inode_pages2(inode->i_mapping);
1914 if (rc)
1915 cifs_dbg(VFS, "%s: could not invalidate inode %p\n",
1916 __func__, inode);
1917 }
1918
1919 cifs_fscache_reset_inode_cookie(inode);
1920 return rc;
1921}
1922
1923/**
1924 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
1925 * @word: long word containing the bit lock
1926 */
1927static int
1928cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
1929{
1930 freezable_schedule_unsafe();
1931 if (signal_pending_state(mode, current))
1932 return -ERESTARTSYS;
1933 return 0;
1934}
1935
1936int
1937cifs_revalidate_mapping(struct inode *inode)
1938{
1939 int rc;
1940 unsigned long *flags = &CIFS_I(inode)->flags;
1941
1942 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
1943 TASK_KILLABLE);
1944 if (rc)
1945 return rc;
1946
1947 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
1948 rc = cifs_invalidate_mapping(inode);
1949 if (rc)
1950 set_bit(CIFS_INO_INVALID_MAPPING, flags);
1951 }
1952
1953 clear_bit_unlock(CIFS_INO_LOCK, flags);
1954 smp_mb__after_atomic();
1955 wake_up_bit(flags, CIFS_INO_LOCK);
1956
1957 return rc;
1958}
1959
1960int
1961cifs_zap_mapping(struct inode *inode)
1962{
1963 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
1964 return cifs_revalidate_mapping(inode);
1965}
1966
1967int cifs_revalidate_file_attr(struct file *filp)
1968{
1969 int rc = 0;
1970 struct inode *inode = file_inode(filp);
1971 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
1972
1973 if (!cifs_inode_needs_reval(inode))
1974 return rc;
1975
1976 if (tlink_tcon(cfile->tlink)->unix_ext)
1977 rc = cifs_get_file_info_unix(filp);
1978 else
1979 rc = cifs_get_file_info(filp);
1980
1981 return rc;
1982}
1983
1984int cifs_revalidate_dentry_attr(struct dentry *dentry)
1985{
1986 unsigned int xid;
1987 int rc = 0;
1988 struct inode *inode = d_inode(dentry);
1989 struct super_block *sb = dentry->d_sb;
1990 char *full_path = NULL;
1991
1992 if (inode == NULL)
1993 return -ENOENT;
1994
1995 if (!cifs_inode_needs_reval(inode))
1996 return rc;
1997
1998 xid = get_xid();
1999
2000 /* can not safely grab the rename sem here if rename calls revalidate
2001 since that would deadlock */
2002 full_path = build_path_from_dentry(dentry);
2003 if (full_path == NULL) {
2004 rc = -ENOMEM;
2005 goto out;
2006 }
2007
2008 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2009 full_path, inode, inode->i_count.counter,
2010 dentry, cifs_get_time(dentry), jiffies);
2011
2012 if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2013 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2014 else
2015 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2016 xid, NULL);
2017
2018out:
2019 kfree(full_path);
2020 free_xid(xid);
2021 return rc;
2022}
2023
2024int cifs_revalidate_file(struct file *filp)
2025{
2026 int rc;
2027 struct inode *inode = file_inode(filp);
2028
2029 rc = cifs_revalidate_file_attr(filp);
2030 if (rc)
2031 return rc;
2032
2033 return cifs_revalidate_mapping(inode);
2034}
2035
2036/* revalidate a dentry's inode attributes */
2037int cifs_revalidate_dentry(struct dentry *dentry)
2038{
2039 int rc;
2040 struct inode *inode = d_inode(dentry);
2041
2042 rc = cifs_revalidate_dentry_attr(dentry);
2043 if (rc)
2044 return rc;
2045
2046 return cifs_revalidate_mapping(inode);
2047}
2048
2049int cifs_getattr(const struct path *path, struct kstat *stat,
2050 u32 request_mask, unsigned int flags)
2051{
2052 struct dentry *dentry = path->dentry;
2053 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2054 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2055 struct inode *inode = d_inode(dentry);
2056 int rc;
2057
2058 /*
2059 * We need to be sure that all dirty pages are written and the server
2060 * has actual ctime, mtime and file length.
2061 */
2062 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2063 inode->i_mapping->nrpages != 0) {
2064 rc = filemap_fdatawait(inode->i_mapping);
2065 if (rc) {
2066 mapping_set_error(inode->i_mapping, rc);
2067 return rc;
2068 }
2069 }
2070
2071 rc = cifs_revalidate_dentry_attr(dentry);
2072 if (rc)
2073 return rc;
2074
2075 generic_fillattr(inode, stat);
2076 stat->blksize = CIFS_MAX_MSGSIZE;
2077 stat->ino = CIFS_I(inode)->uniqueid;
2078
2079 /* old CIFS Unix Extensions doesn't return create time */
2080 if (CIFS_I(inode)->createtime) {
2081 stat->result_mask |= STATX_BTIME;
2082 stat->btime =
2083 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2084 }
2085
2086 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2087 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2088 stat->attributes |= STATX_ATTR_COMPRESSED;
2089 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2090 stat->attributes |= STATX_ATTR_ENCRYPTED;
2091
2092 /*
2093 * If on a multiuser mount without unix extensions or cifsacl being
2094 * enabled, and the admin hasn't overridden them, set the ownership
2095 * to the fsuid/fsgid of the current process.
2096 */
2097 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2098 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2099 !tcon->unix_ext) {
2100 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2101 stat->uid = current_fsuid();
2102 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2103 stat->gid = current_fsgid();
2104 }
2105 return rc;
2106}
2107
2108static int cifs_truncate_page(struct address_space *mapping, loff_t from)
2109{
2110 pgoff_t index = from >> PAGE_SHIFT;
2111 unsigned offset = from & (PAGE_SIZE - 1);
2112 struct page *page;
2113 int rc = 0;
2114
2115 page = grab_cache_page(mapping, index);
2116 if (!page)
2117 return -ENOMEM;
2118
2119 zero_user_segment(page, offset, PAGE_SIZE);
2120 unlock_page(page);
2121 put_page(page);
2122 return rc;
2123}
2124
2125static void cifs_setsize(struct inode *inode, loff_t offset)
2126{
2127 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2128
2129 spin_lock(&inode->i_lock);
2130 i_size_write(inode, offset);
2131 spin_unlock(&inode->i_lock);
2132
2133 /* Cached inode must be refreshed on truncate */
2134 cifs_i->time = 0;
2135 truncate_pagecache(inode, offset);
2136}
2137
2138static int
2139cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2140 unsigned int xid, char *full_path)
2141{
2142 int rc;
2143 struct cifsFileInfo *open_file;
2144 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2145 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2146 struct tcon_link *tlink = NULL;
2147 struct cifs_tcon *tcon = NULL;
2148 struct TCP_Server_Info *server;
2149
2150 /*
2151 * To avoid spurious oplock breaks from server, in the case of
2152 * inodes that we already have open, avoid doing path based
2153 * setting of file size if we can do it by handle.
2154 * This keeps our caching token (oplock) and avoids timeouts
2155 * when the local oplock break takes longer to flush
2156 * writebehind data than the SMB timeout for the SetPathInfo
2157 * request would allow
2158 */
2159 open_file = find_writable_file(cifsInode, true);
2160 if (open_file) {
2161 tcon = tlink_tcon(open_file->tlink);
2162 server = tcon->ses->server;
2163 if (server->ops->set_file_size)
2164 rc = server->ops->set_file_size(xid, tcon, open_file,
2165 attrs->ia_size, false);
2166 else
2167 rc = -ENOSYS;
2168 cifsFileInfo_put(open_file);
2169 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2170 } else
2171 rc = -EINVAL;
2172
2173 if (!rc)
2174 goto set_size_out;
2175
2176 if (tcon == NULL) {
2177 tlink = cifs_sb_tlink(cifs_sb);
2178 if (IS_ERR(tlink))
2179 return PTR_ERR(tlink);
2180 tcon = tlink_tcon(tlink);
2181 server = tcon->ses->server;
2182 }
2183
2184 /*
2185 * Set file size by pathname rather than by handle either because no
2186 * valid, writeable file handle for it was found or because there was
2187 * an error setting it by handle.
2188 */
2189 if (server->ops->set_path_size)
2190 rc = server->ops->set_path_size(xid, tcon, full_path,
2191 attrs->ia_size, cifs_sb, false);
2192 else
2193 rc = -ENOSYS;
2194 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2195
2196 if (tlink)
2197 cifs_put_tlink(tlink);
2198
2199set_size_out:
2200 if (rc == 0) {
2201 cifsInode->server_eof = attrs->ia_size;
2202 cifs_setsize(inode, attrs->ia_size);
2203 cifs_truncate_page(inode->i_mapping, inode->i_size);
2204 }
2205
2206 return rc;
2207}
2208
2209static int
2210cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2211{
2212 int rc;
2213 unsigned int xid;
2214 char *full_path = NULL;
2215 struct inode *inode = d_inode(direntry);
2216 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2217 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2218 struct tcon_link *tlink;
2219 struct cifs_tcon *pTcon;
2220 struct cifs_unix_set_info_args *args = NULL;
2221 struct cifsFileInfo *open_file;
2222
2223 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2224 direntry, attrs->ia_valid);
2225
2226 xid = get_xid();
2227
2228 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2229 attrs->ia_valid |= ATTR_FORCE;
2230
2231 rc = setattr_prepare(direntry, attrs);
2232 if (rc < 0)
2233 goto out;
2234
2235 full_path = build_path_from_dentry(direntry);
2236 if (full_path == NULL) {
2237 rc = -ENOMEM;
2238 goto out;
2239 }
2240
2241 /*
2242 * Attempt to flush data before changing attributes. We need to do
2243 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2244 * ownership or mode then we may also need to do this. Here, we take
2245 * the safe way out and just do the flush on all setattr requests. If
2246 * the flush returns error, store it to report later and continue.
2247 *
2248 * BB: This should be smarter. Why bother flushing pages that
2249 * will be truncated anyway? Also, should we error out here if
2250 * the flush returns error?
2251 */
2252 rc = filemap_write_and_wait(inode->i_mapping);
2253 mapping_set_error(inode->i_mapping, rc);
2254 rc = 0;
2255
2256 if (attrs->ia_valid & ATTR_SIZE) {
2257 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2258 if (rc != 0)
2259 goto out;
2260 }
2261
2262 /* skip mode change if it's just for clearing setuid/setgid */
2263 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2264 attrs->ia_valid &= ~ATTR_MODE;
2265
2266 args = kmalloc(sizeof(*args), GFP_KERNEL);
2267 if (args == NULL) {
2268 rc = -ENOMEM;
2269 goto out;
2270 }
2271
2272 /* set up the struct */
2273 if (attrs->ia_valid & ATTR_MODE)
2274 args->mode = attrs->ia_mode;
2275 else
2276 args->mode = NO_CHANGE_64;
2277
2278 if (attrs->ia_valid & ATTR_UID)
2279 args->uid = attrs->ia_uid;
2280 else
2281 args->uid = INVALID_UID; /* no change */
2282
2283 if (attrs->ia_valid & ATTR_GID)
2284 args->gid = attrs->ia_gid;
2285 else
2286 args->gid = INVALID_GID; /* no change */
2287
2288 if (attrs->ia_valid & ATTR_ATIME)
2289 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2290 else
2291 args->atime = NO_CHANGE_64;
2292
2293 if (attrs->ia_valid & ATTR_MTIME)
2294 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2295 else
2296 args->mtime = NO_CHANGE_64;
2297
2298 if (attrs->ia_valid & ATTR_CTIME)
2299 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2300 else
2301 args->ctime = NO_CHANGE_64;
2302
2303 args->device = 0;
2304 open_file = find_writable_file(cifsInode, true);
2305 if (open_file) {
2306 u16 nfid = open_file->fid.netfid;
2307 u32 npid = open_file->pid;
2308 pTcon = tlink_tcon(open_file->tlink);
2309 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2310 cifsFileInfo_put(open_file);
2311 } else {
2312 tlink = cifs_sb_tlink(cifs_sb);
2313 if (IS_ERR(tlink)) {
2314 rc = PTR_ERR(tlink);
2315 goto out;
2316 }
2317 pTcon = tlink_tcon(tlink);
2318 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2319 cifs_sb->local_nls,
2320 cifs_remap(cifs_sb));
2321 cifs_put_tlink(tlink);
2322 }
2323
2324 if (rc)
2325 goto out;
2326
2327 if ((attrs->ia_valid & ATTR_SIZE) &&
2328 attrs->ia_size != i_size_read(inode))
2329 truncate_setsize(inode, attrs->ia_size);
2330
2331 setattr_copy(inode, attrs);
2332 mark_inode_dirty(inode);
2333
2334 /* force revalidate when any of these times are set since some
2335 of the fs types (eg ext3, fat) do not have fine enough
2336 time granularity to match protocol, and we do not have a
2337 a way (yet) to query the server fs's time granularity (and
2338 whether it rounds times down).
2339 */
2340 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2341 cifsInode->time = 0;
2342out:
2343 kfree(args);
2344 kfree(full_path);
2345 free_xid(xid);
2346 return rc;
2347}
2348
2349static int
2350cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2351{
2352 unsigned int xid;
2353 kuid_t uid = INVALID_UID;
2354 kgid_t gid = INVALID_GID;
2355 struct inode *inode = d_inode(direntry);
2356 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2357 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2358 char *full_path = NULL;
2359 int rc = -EACCES;
2360 __u32 dosattr = 0;
2361 __u64 mode = NO_CHANGE_64;
2362
2363 xid = get_xid();
2364
2365 cifs_dbg(FYI, "setattr on file %pd attrs->iavalid 0x%x\n",
2366 direntry, attrs->ia_valid);
2367
2368 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2369 attrs->ia_valid |= ATTR_FORCE;
2370
2371 rc = setattr_prepare(direntry, attrs);
2372 if (rc < 0) {
2373 free_xid(xid);
2374 return rc;
2375 }
2376
2377 full_path = build_path_from_dentry(direntry);
2378 if (full_path == NULL) {
2379 rc = -ENOMEM;
2380 free_xid(xid);
2381 return rc;
2382 }
2383
2384 /*
2385 * Attempt to flush data before changing attributes. We need to do
2386 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2387 * ownership or mode then we may also need to do this. Here, we take
2388 * the safe way out and just do the flush on all setattr requests. If
2389 * the flush returns error, store it to report later and continue.
2390 *
2391 * BB: This should be smarter. Why bother flushing pages that
2392 * will be truncated anyway? Also, should we error out here if
2393 * the flush returns error?
2394 */
2395 rc = filemap_write_and_wait(inode->i_mapping);
2396 mapping_set_error(inode->i_mapping, rc);
2397 rc = 0;
2398
2399 if (attrs->ia_valid & ATTR_SIZE) {
2400 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2401 if (rc != 0)
2402 goto cifs_setattr_exit;
2403 }
2404
2405 if (attrs->ia_valid & ATTR_UID)
2406 uid = attrs->ia_uid;
2407
2408 if (attrs->ia_valid & ATTR_GID)
2409 gid = attrs->ia_gid;
2410
2411#ifdef CONFIG_CIFS_ACL
2412 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
2413 if (uid_valid(uid) || gid_valid(gid)) {
2414 rc = id_mode_to_cifs_acl(inode, full_path, NO_CHANGE_64,
2415 uid, gid);
2416 if (rc) {
2417 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2418 __func__, rc);
2419 goto cifs_setattr_exit;
2420 }
2421 }
2422 } else
2423#endif /* CONFIG_CIFS_ACL */
2424 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2425 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2426
2427 /* skip mode change if it's just for clearing setuid/setgid */
2428 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2429 attrs->ia_valid &= ~ATTR_MODE;
2430
2431 if (attrs->ia_valid & ATTR_MODE) {
2432 mode = attrs->ia_mode;
2433 rc = 0;
2434#ifdef CONFIG_CIFS_ACL
2435 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
2436 rc = id_mode_to_cifs_acl(inode, full_path, mode,
2437 INVALID_UID, INVALID_GID);
2438 if (rc) {
2439 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2440 __func__, rc);
2441 goto cifs_setattr_exit;
2442 }
2443 } else
2444#endif /* CONFIG_CIFS_ACL */
2445 if (((mode & S_IWUGO) == 0) &&
2446 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2447
2448 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2449
2450 /* fix up mode if we're not using dynperm */
2451 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2452 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2453 } else if ((mode & S_IWUGO) &&
2454 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2455
2456 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2457 /* Attributes of 0 are ignored */
2458 if (dosattr == 0)
2459 dosattr |= ATTR_NORMAL;
2460
2461 /* reset local inode permissions to normal */
2462 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2463 attrs->ia_mode &= ~(S_IALLUGO);
2464 if (S_ISDIR(inode->i_mode))
2465 attrs->ia_mode |=
2466 cifs_sb->mnt_dir_mode;
2467 else
2468 attrs->ia_mode |=
2469 cifs_sb->mnt_file_mode;
2470 }
2471 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2472 /* ignore mode change - ATTR_READONLY hasn't changed */
2473 attrs->ia_valid &= ~ATTR_MODE;
2474 }
2475 }
2476
2477 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2478 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2479 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2480 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2481
2482 /* Even if error on time set, no sense failing the call if
2483 the server would set the time to a reasonable value anyway,
2484 and this check ensures that we are not being called from
2485 sys_utimes in which case we ought to fail the call back to
2486 the user when the server rejects the call */
2487 if ((rc) && (attrs->ia_valid &
2488 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2489 rc = 0;
2490 }
2491
2492 /* do not need local check to inode_check_ok since the server does
2493 that */
2494 if (rc)
2495 goto cifs_setattr_exit;
2496
2497 if ((attrs->ia_valid & ATTR_SIZE) &&
2498 attrs->ia_size != i_size_read(inode))
2499 truncate_setsize(inode, attrs->ia_size);
2500
2501 setattr_copy(inode, attrs);
2502 mark_inode_dirty(inode);
2503
2504cifs_setattr_exit:
2505 kfree(full_path);
2506 free_xid(xid);
2507 return rc;
2508}
2509
2510int
2511cifs_setattr(struct dentry *direntry, struct iattr *attrs)
2512{
2513 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2514 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2515
2516 if (pTcon->unix_ext)
2517 return cifs_setattr_unix(direntry, attrs);
2518
2519 return cifs_setattr_nounix(direntry, attrs);
2520
2521 /* BB: add cifs_setattr_legacy for really old servers */
2522}
2523
2524#if 0
2525void cifs_delete_inode(struct inode *inode)
2526{
2527 cifs_dbg(FYI, "In cifs_delete_inode, inode = 0x%p\n", inode);
2528 /* may have to add back in if and when safe distributed caching of
2529 directories added e.g. via FindNotify */
2530}
2531#endif