4 * Copyright (C) International Business Machines Corp., 2002,2010
5 * Author(s): Steve French (sfrench@us.ibm.com)
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.
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.
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
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>
29 #include <asm/div64.h>
33 #include "cifsproto.h"
34 #include "cifs_debug.h"
35 #include "cifs_fs_sb.h"
36 #include "cifs_unicode.h"
40 static void cifs_set_ops(struct inode
*inode
)
42 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
44 switch (inode
->i_mode
& S_IFMT
) {
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
;
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
;
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
;
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
;
68 inode
->i_data
.a_ops
= &cifs_addr_ops
;
71 #ifdef CONFIG_CIFS_DFS_UPCALL
72 if (IS_AUTOMOUNT(inode
)) {
73 inode
->i_op
= &cifs_dfs_referral_inode_operations
;
75 #else /* NO DFS support, treat as a directory */
78 inode
->i_op
= &cifs_dir_inode_ops
;
79 inode
->i_fop
= &cifs_dir_ops
;
83 inode
->i_op
= &cifs_symlink_inode_ops
;
86 init_special_inode(inode
, inode
->i_mode
, inode
->i_rdev
);
91 /* check inode attributes against fattr. If they don't match, tag the
92 * inode for cache invalidation
95 cifs_revalidate_cache(struct inode
*inode
, struct cifs_fattr
*fattr
)
97 struct cifsInodeInfo
*cifs_i
= CIFS_I(inode
);
99 cifs_dbg(FYI
, "%s: revalidating inode %llu\n",
100 __func__
, cifs_i
->uniqueid
);
102 if (inode
->i_state
& I_NEW
) {
103 cifs_dbg(FYI
, "%s: inode %llu is new\n",
104 __func__
, cifs_i
->uniqueid
);
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
);
115 /* revalidate if mtime or size have changed */
116 if (timespec_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
);
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
);
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
133 cifs_nlink_fattr_to_inode(struct inode
*inode
, struct cifs_fattr
*fattr
)
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
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
)
151 /* we trust the server, so update it */
152 set_nlink(inode
, fattr
->cf_nlink
);
155 /* populate an inode with info from a cifs_fattr struct */
157 cifs_fattr_to_inode(struct inode
*inode
, struct cifs_fattr
*fattr
)
159 struct cifsInodeInfo
*cifs_i
= CIFS_I(inode
);
160 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
162 cifs_revalidate_cache(inode
, fattr
);
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
;
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
;
178 cifs_i
->cifsAttrs
= fattr
->cf_cifsattrs
;
180 if (fattr
->cf_flags
& CIFS_FATTR_NEED_REVAL
)
183 cifs_i
->time
= jiffies
;
185 if (fattr
->cf_flags
& CIFS_FATTR_DELETE_PENDING
)
186 set_bit(CIFS_INO_DELETE_PENDING
, &cifs_i
->flags
);
188 clear_bit(CIFS_INO_DELETE_PENDING
, &cifs_i
->flags
);
190 cifs_i
->server_eof
= fattr
->cf_eof
;
192 * Can't safely change the file size here if the client is writing to
193 * it due to potential races.
195 if (is_size_safe_to_change(cifs_i
, fattr
->cf_eof
)) {
196 i_size_write(inode
, fattr
->cf_eof
);
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.
203 inode
->i_blocks
= (512 - 1 + fattr
->cf_bytes
) >> 9;
205 spin_unlock(&inode
->i_lock
);
207 if (fattr
->cf_flags
& CIFS_FATTR_DFS_REFERRAL
)
208 inode
->i_flags
|= S_AUTOMOUNT
;
209 if (inode
->i_state
& I_NEW
)
214 cifs_fill_uniqueid(struct super_block
*sb
, struct cifs_fattr
*fattr
)
216 struct cifs_sb_info
*cifs_sb
= CIFS_SB(sb
);
218 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SERVER_INUM
)
221 fattr
->cf_uniqueid
= iunique(sb
, ROOT_I
);
224 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
226 cifs_unix_basic_to_fattr(struct cifs_fattr
*fattr
, FILE_UNIX_BASIC_INFO
*info
,
227 struct cifs_sb_info
*cifs_sb
)
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
);
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 */
239 fattr
->cf_mode
= le64_to_cpu(info
->Permissions
);
242 * Since we set the inode type below we need to mask off
243 * to avoid strange results if bits set above.
245 fattr
->cf_mode
&= ~S_IFMT
;
246 switch (le32_to_cpu(info
->Type
)) {
248 fattr
->cf_mode
|= S_IFREG
;
249 fattr
->cf_dtype
= DT_REG
;
252 fattr
->cf_mode
|= S_IFLNK
;
253 fattr
->cf_dtype
= DT_LNK
;
256 fattr
->cf_mode
|= S_IFDIR
;
257 fattr
->cf_dtype
= DT_DIR
;
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
);
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
);
272 fattr
->cf_mode
|= S_IFIFO
;
273 fattr
->cf_dtype
= DT_FIFO
;
276 fattr
->cf_mode
|= S_IFSOCK
;
277 fattr
->cf_dtype
= DT_SOCK
;
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
));
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
);
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
);
307 fattr
->cf_nlink
= le64_to_cpu(info
->Nlinks
);
311 * Fill a cifs_fattr struct with fake inode info.
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).
318 cifs_create_dfs_fattr(struct cifs_fattr
*fattr
, struct super_block
*sb
)
320 struct cifs_sb_info
*cifs_sb
= CIFS_SB(sb
);
322 cifs_dbg(FYI
, "creating fake fattr for DFS referral\n");
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_ts(&fattr
->cf_mtime
);
329 fattr
->cf_mtime
= timespec_trunc(fattr
->cf_mtime
, sb
->s_time_gran
);
330 fattr
->cf_atime
= fattr
->cf_ctime
= fattr
->cf_mtime
;
332 fattr
->cf_flags
|= CIFS_FATTR_DFS_REFERRAL
;
336 cifs_get_file_info_unix(struct file
*filp
)
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
);
348 rc
= CIFSSMBUnixQFileInfo(xid
, tcon
, cfile
->fid
.netfid
, &find_data
);
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
);
356 cifs_fattr_to_inode(inode
, &fattr
);
361 int cifs_get_inode_info_unix(struct inode
**pinode
,
362 const unsigned char *full_path
,
363 struct super_block
*sb
, unsigned int xid
)
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
);
372 cifs_dbg(FYI
, "Getting info on %s\n", full_path
);
374 tlink
= cifs_sb_tlink(cifs_sb
);
376 return PTR_ERR(tlink
);
377 tcon
= tlink_tcon(tlink
);
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
);
385 cifs_unix_basic_to_fattr(&fattr
, &find_data
, cifs_sb
);
386 } else if (rc
== -EREMOTE
) {
387 cifs_create_dfs_fattr(&fattr
, sb
);
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
,
398 cifs_dbg(FYI
, "check_mf_symlink: %d\n", tmprc
);
401 if (*pinode
== NULL
) {
403 cifs_fill_uniqueid(sb
, &fattr
);
404 *pinode
= cifs_iget(sb
, &fattr
);
408 /* we already have inode, update it */
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
)) {
417 /* if filetype is different, return error */
418 if (unlikely(((*pinode
)->i_mode
& S_IFMT
) !=
419 (fattr
.cf_mode
& S_IFMT
))) {
424 cifs_fattr_to_inode(*pinode
, &fattr
);
432 cifs_sfu_type(struct cifs_fattr
*fattr
, const char *path
,
433 struct cifs_sb_info
*cifs_sb
, unsigned int xid
)
437 struct tcon_link
*tlink
;
438 struct cifs_tcon
*tcon
;
440 struct cifs_open_parms oparms
;
441 struct cifs_io_parms io_parms
;
443 unsigned int bytes_read
;
445 int buf_type
= CIFS_NO_BUFFER
;
449 fattr
->cf_mode
&= ~S_IFMT
;
451 if (fattr
->cf_eof
== 0) {
452 fattr
->cf_mode
|= S_IFIFO
;
453 fattr
->cf_dtype
= DT_FIFO
;
455 } else if (fattr
->cf_eof
< 8) {
456 fattr
->cf_mode
|= S_IFREG
;
457 fattr
->cf_dtype
= DT_REG
;
458 return -EINVAL
; /* EOPNOTSUPP? */
461 tlink
= cifs_sb_tlink(cifs_sb
);
463 return PTR_ERR(tlink
);
464 tcon
= tlink_tcon(tlink
);
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
;
475 oparms
.reconnect
= false;
477 if (tcon
->ses
->server
->oplocks
)
481 rc
= tcon
->ses
->server
->ops
->open(xid
, &oparms
, &oplock
, NULL
);
483 cifs_dbg(FYI
, "check sfu type of %s, open rc = %d\n", path
, rc
);
484 cifs_put_tlink(tlink
);
489 io_parms
.netfid
= fid
.netfid
;
490 io_parms
.pid
= current
->tgid
;
491 io_parms
.tcon
= tcon
;
493 io_parms
.length
= 24;
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
);
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
);
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
;
527 fattr
->cf_mode
|= S_IFREG
; /* file? */
528 fattr
->cf_dtype
= DT_REG
;
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 */
537 tcon
->ses
->server
->ops
->close(xid
, tcon
, &fid
);
538 cifs_put_tlink(tlink
);
542 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
545 * Fetch mode bits as provided by SFU.
547 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
549 static int cifs_sfu_mode(struct cifs_fattr
*fattr
, const unsigned char *path
,
550 struct cifs_sb_info
*cifs_sb
, unsigned int xid
)
552 #ifdef CONFIG_CIFS_XATTR
556 struct tcon_link
*tlink
;
557 struct cifs_tcon
*tcon
;
559 tlink
= cifs_sb_tlink(cifs_sb
);
561 return PTR_ERR(tlink
);
562 tcon
= tlink_tcon(tlink
);
564 if (tcon
->ses
->server
->ops
->query_all_EAs
== NULL
) {
565 cifs_put_tlink(tlink
);
569 rc
= tcon
->ses
->server
->ops
->query_all_EAs(xid
, tcon
, path
,
570 "SETFILEBITS", ea_value
, 4 /* size of buf */,
572 cifs_put_tlink(tlink
);
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
);
590 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
592 cifs_all_info_to_fattr(struct cifs_fattr
*fattr
, FILE_ALL_INFO
*info
,
593 struct super_block
*sb
, bool adjust_tz
,
596 struct cifs_sb_info
*cifs_sb
= CIFS_SB(sb
);
597 struct cifs_tcon
*tcon
= cifs_sb_master_tcon(cifs_sb
);
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
;
604 if (info
->LastAccessTime
)
605 fattr
->cf_atime
= cifs_NTtimeToUnix(info
->LastAccessTime
);
607 ktime_get_real_ts(&fattr
->cf_atime
);
608 fattr
->cf_atime
= timespec_trunc(fattr
->cf_atime
, sb
->s_time_gran
);
611 fattr
->cf_ctime
= cifs_NTtimeToUnix(info
->ChangeTime
);
612 fattr
->cf_mtime
= cifs_NTtimeToUnix(info
->LastWriteTime
);
615 fattr
->cf_ctime
.tv_sec
+= tcon
->ses
->server
->timeAdj
;
616 fattr
->cf_mtime
.tv_sec
+= tcon
->ses
->server
->timeAdj
;
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
);
623 fattr
->cf_nlink
= le32_to_cpu(info
->NumberOfLinks
);
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
;
632 * Server can return wrong NumberOfLinks value for directories
633 * when Unix extensions are disabled - fake it.
636 fattr
->cf_flags
|= CIFS_FATTR_UNKNOWN_NLINK
;
638 fattr
->cf_mode
= S_IFREG
| cifs_sb
->mnt_file_mode
;
639 fattr
->cf_dtype
= DT_REG
;
641 /* clear write bits if ATTR_READONLY is set */
642 if (fattr
->cf_cifsattrs
& ATTR_READONLY
)
643 fattr
->cf_mode
&= ~(S_IWUGO
);
646 * Don't accept zero nlink from non-unix servers unless
647 * delete is pending. Instead mark it as unknown.
649 if ((fattr
->cf_nlink
< 1) && !tcon
->unix_ext
&&
650 !info
->DeletePending
) {
651 cifs_dbg(1, "bogus file nlink value %u\n",
653 fattr
->cf_flags
|= CIFS_FATTR_UNKNOWN_NLINK
;
657 fattr
->cf_uid
= cifs_sb
->mnt_uid
;
658 fattr
->cf_gid
= cifs_sb
->mnt_gid
;
662 cifs_get_file_info(struct file
*filp
)
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
;
673 if (!server
->ops
->query_file_info
)
677 rc
= server
->ops
->query_file_info(xid
, tcon
, &cfile
->fid
, &find_data
);
680 cifs_all_info_to_fattr(&fattr
, &find_data
, inode
->i_sb
, false,
684 cifs_create_dfs_fattr(&fattr
, inode
->i_sb
);
690 * FIXME: legacy server -- fall back to path-based call?
691 * for now, just skip revalidating and mark inode for
695 CIFS_I(inode
)->time
= 0;
701 * don't bother with SFU junk here -- just mark inode as needing
704 fattr
.cf_uniqueid
= CIFS_I(inode
)->uniqueid
;
705 fattr
.cf_flags
|= CIFS_FATTR_NEED_REVAL
;
706 cifs_fattr_to_inode(inode
, &fattr
);
712 /* Simple function to return a 64 bit hash of string. Rarely called */
713 static __u64
simple_hashstr(const char *str
)
715 const __u64 hash_mult
= 1125899906842597ULL; /* a big enough prime */
719 hash
= (hash
+ (__u64
) *str
++) * hash_mult
;
725 cifs_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
)
729 bool validinum
= false;
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
);
737 bool adjust_tz
= false;
738 struct cifs_fattr fattr
;
739 struct cifs_search_info
*srchinf
= NULL
;
740 bool symlink
= false;
742 tlink
= cifs_sb_tlink(cifs_sb
);
744 return PTR_ERR(tlink
);
745 tcon
= tlink_tcon(tlink
);
746 server
= tcon
->ses
->server
;
748 cifs_dbg(FYI
, "Getting info on %s\n", full_path
);
750 if ((data
== NULL
) && (*inode
!= NULL
)) {
751 if (CIFS_CACHE_READ(CIFS_I(*inode
))) {
752 cifs_dbg(FYI
, "No need to revalidate cached inode sizes\n");
757 /* if inode info is not passed, get it from server */
759 if (!server
->ops
->query_path_info
) {
763 buf
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
768 data
= (FILE_ALL_INFO
*)buf
;
769 rc
= server
->ops
->query_path_info(xid
, tcon
, cifs_sb
, full_path
,
770 data
, &adjust_tz
, &symlink
);
774 cifs_all_info_to_fattr(&fattr
, data
, sb
, adjust_tz
,
776 } else if (rc
== -EREMOTE
) {
777 cifs_create_dfs_fattr(&fattr
, sb
);
779 } else if ((rc
== -EACCES
) && backup_cred(cifs_sb
) &&
780 (strcmp(server
->vals
->version_string
, SMB1_VERSION_STRING
)
783 * For SMB2 and later the backup intent flag is already
784 * sent if needed on open and there is no path based
785 * FindFirst operation to use to retry with
788 srchinf
= kzalloc(sizeof(struct cifs_search_info
),
790 if (srchinf
== NULL
) {
795 srchinf
->endOfSearch
= false;
796 srchinf
->info_level
= SMB_FIND_FILE_ID_FULL_DIR_INFO
;
798 srchflgs
= CIFS_SEARCH_CLOSE_ALWAYS
|
799 CIFS_SEARCH_CLOSE_AT_END
|
800 CIFS_SEARCH_BACKUP_SEARCH
;
802 rc
= CIFSFindFirst(xid
, tcon
, full_path
,
803 cifs_sb
, NULL
, srchflgs
, srchinf
, false);
806 (FILE_ALL_INFO
*)srchinf
->srch_entries_start
;
808 cifs_dir_info_to_fattr(&fattr
,
809 (FILE_DIRECTORY_INFO
*)data
, cifs_sb
);
810 fattr
.cf_uniqueid
= le64_to_cpu(
811 ((SEARCH_ID_FULL_DIR_INFO
*)data
)->UniqueId
);
814 cifs_buf_release(srchinf
->ntwrk_buf_start
);
823 * If an inode wasn't passed in, then get the inode number
825 * Is an i_ino of zero legal? Can we use that to check if the server
826 * supports returning inode numbers? Are there other sanity checks we
827 * can use to ensure that the server is really filling in that field?
829 if (*inode
== NULL
) {
830 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SERVER_INUM
) {
831 if (validinum
== false) {
832 if (server
->ops
->get_srv_inum
)
833 tmprc
= server
->ops
->get_srv_inum(xid
,
834 tcon
, cifs_sb
, full_path
,
835 &fattr
.cf_uniqueid
, data
);
837 cifs_dbg(FYI
, "GetSrvInodeNum rc %d\n",
839 fattr
.cf_uniqueid
= iunique(sb
, ROOT_I
);
840 cifs_autodisable_serverino(cifs_sb
);
841 } else if ((fattr
.cf_uniqueid
== 0) &&
842 strlen(full_path
) == 0) {
843 /* some servers ret bad root ino ie 0 */
844 cifs_dbg(FYI
, "Invalid (0) inodenum\n");
846 CIFS_FATTR_FAKE_ROOT_INO
;
848 simple_hashstr(tcon
->treeName
);
852 fattr
.cf_uniqueid
= iunique(sb
, ROOT_I
);
854 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SERVER_INUM
) &&
855 validinum
== false && server
->ops
->get_srv_inum
) {
857 * Pass a NULL tcon to ensure we don't make a round
858 * trip to the server. This only works for SMB2+.
860 tmprc
= server
->ops
->get_srv_inum(xid
,
861 NULL
, cifs_sb
, full_path
,
862 &fattr
.cf_uniqueid
, data
);
864 fattr
.cf_uniqueid
= CIFS_I(*inode
)->uniqueid
;
865 else if ((fattr
.cf_uniqueid
== 0) &&
866 strlen(full_path
) == 0) {
868 * Reuse existing root inode num since
869 * inum zero for root causes ls of . and .. to
872 cifs_dbg(FYI
, "Srv ret 0 inode num for root\n");
873 fattr
.cf_uniqueid
= CIFS_I(*inode
)->uniqueid
;
876 fattr
.cf_uniqueid
= CIFS_I(*inode
)->uniqueid
;
879 /* query for SFU type info if supported and needed */
880 if (fattr
.cf_cifsattrs
& ATTR_SYSTEM
&&
881 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_UNX_EMUL
) {
882 tmprc
= cifs_sfu_type(&fattr
, full_path
, cifs_sb
, xid
);
884 cifs_dbg(FYI
, "cifs_sfu_type failed: %d\n", tmprc
);
887 #ifdef CONFIG_CIFS_ACL
888 /* fill in 0777 bits from ACL */
889 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_CIFS_ACL
) {
890 rc
= cifs_acl_to_fattr(cifs_sb
, &fattr
, *inode
, full_path
, fid
);
892 cifs_dbg(FYI
, "%s: Getting ACL failed with error: %d\n",
897 #endif /* CONFIG_CIFS_ACL */
899 /* fill in remaining high mode bits e.g. SUID, VTX */
900 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_UNX_EMUL
)
901 cifs_sfu_mode(&fattr
, full_path
, cifs_sb
, xid
);
903 /* check for Minshall+French symlinks */
904 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MF_SYMLINKS
) {
905 tmprc
= check_mf_symlink(xid
, tcon
, cifs_sb
, &fattr
,
908 cifs_dbg(FYI
, "check_mf_symlink: %d\n", tmprc
);
912 *inode
= cifs_iget(sb
, &fattr
);
916 /* we already have inode, update it */
918 /* if uniqueid is different, return error */
919 if (unlikely(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SERVER_INUM
&&
920 CIFS_I(*inode
)->uniqueid
!= fattr
.cf_uniqueid
)) {
925 /* if filetype is different, return error */
926 if (unlikely(((*inode
)->i_mode
& S_IFMT
) !=
927 (fattr
.cf_mode
& S_IFMT
))) {
932 cifs_fattr_to_inode(*inode
, &fattr
);
936 if ((*inode
) && ((*inode
)->i_ino
== 0))
937 cifs_dbg(FYI
, "inode number of zero returned\n");
940 cifs_put_tlink(tlink
);
944 static const struct inode_operations cifs_ipc_inode_ops
= {
945 .lookup
= cifs_lookup
,
949 cifs_find_inode(struct inode
*inode
, void *opaque
)
951 struct cifs_fattr
*fattr
= (struct cifs_fattr
*) opaque
;
953 /* don't match inode with different uniqueid */
954 if (CIFS_I(inode
)->uniqueid
!= fattr
->cf_uniqueid
)
957 /* use createtime like an i_generation field */
958 if (CIFS_I(inode
)->createtime
!= fattr
->cf_createtime
)
961 /* don't match inode of different type */
962 if ((inode
->i_mode
& S_IFMT
) != (fattr
->cf_mode
& S_IFMT
))
965 /* if it's not a directory or has no dentries, then flag it */
966 if (S_ISDIR(inode
->i_mode
) && !hlist_empty(&inode
->i_dentry
))
967 fattr
->cf_flags
|= CIFS_FATTR_INO_COLLISION
;
973 cifs_init_inode(struct inode
*inode
, void *opaque
)
975 struct cifs_fattr
*fattr
= (struct cifs_fattr
*) opaque
;
977 CIFS_I(inode
)->uniqueid
= fattr
->cf_uniqueid
;
978 CIFS_I(inode
)->createtime
= fattr
->cf_createtime
;
983 * walk dentry list for an inode and report whether it has aliases that
984 * are hashed. We use this to determine if a directory inode can actually
988 inode_has_hashed_dentries(struct inode
*inode
)
990 struct dentry
*dentry
;
992 spin_lock(&inode
->i_lock
);
993 hlist_for_each_entry(dentry
, &inode
->i_dentry
, d_u
.d_alias
) {
994 if (!d_unhashed(dentry
) || IS_ROOT(dentry
)) {
995 spin_unlock(&inode
->i_lock
);
999 spin_unlock(&inode
->i_lock
);
1003 /* Given fattrs, get a corresponding inode */
1005 cifs_iget(struct super_block
*sb
, struct cifs_fattr
*fattr
)
1008 struct inode
*inode
;
1011 cifs_dbg(FYI
, "looking for uniqueid=%llu\n", fattr
->cf_uniqueid
);
1013 /* hash down to 32-bits on 32-bit arch */
1014 hash
= cifs_uniqueid_to_ino_t(fattr
->cf_uniqueid
);
1016 inode
= iget5_locked(sb
, hash
, cifs_find_inode
, cifs_init_inode
, fattr
);
1018 /* was there a potentially problematic inode collision? */
1019 if (fattr
->cf_flags
& CIFS_FATTR_INO_COLLISION
) {
1020 fattr
->cf_flags
&= ~CIFS_FATTR_INO_COLLISION
;
1022 if (inode_has_hashed_dentries(inode
)) {
1023 cifs_autodisable_serverino(CIFS_SB(sb
));
1025 fattr
->cf_uniqueid
= iunique(sb
, ROOT_I
);
1026 goto retry_iget5_locked
;
1030 cifs_fattr_to_inode(inode
, fattr
);
1031 if (sb
->s_flags
& MS_NOATIME
)
1032 inode
->i_flags
|= S_NOATIME
| S_NOCMTIME
;
1033 if (inode
->i_state
& I_NEW
) {
1034 inode
->i_ino
= hash
;
1035 #ifdef CONFIG_CIFS_FSCACHE
1036 /* initialize per-inode cache cookie pointer */
1037 CIFS_I(inode
)->fscache
= NULL
;
1039 unlock_new_inode(inode
);
1046 /* gets root inode */
1047 struct inode
*cifs_root_iget(struct super_block
*sb
)
1050 struct cifs_sb_info
*cifs_sb
= CIFS_SB(sb
);
1051 struct inode
*inode
= NULL
;
1053 struct cifs_tcon
*tcon
= cifs_sb_master_tcon(cifs_sb
);
1057 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
)
1058 && cifs_sb
->prepath
) {
1059 len
= strlen(cifs_sb
->prepath
);
1060 path
= kzalloc(len
+ 2 /* leading sep + null */, GFP_KERNEL
);
1062 return ERR_PTR(-ENOMEM
);
1064 memcpy(path
+1, cifs_sb
->prepath
, len
);
1066 path
= kstrdup("", GFP_KERNEL
);
1068 return ERR_PTR(-ENOMEM
);
1072 if (tcon
->unix_ext
) {
1073 rc
= cifs_get_inode_info_unix(&inode
, path
, sb
, xid
);
1074 /* some servers mistakenly claim POSIX support */
1075 if (rc
!= -EOPNOTSUPP
)
1077 cifs_dbg(VFS
, "server does not support POSIX extensions");
1078 tcon
->unix_ext
= false;
1081 convert_delimiter(path
, CIFS_DIR_SEP(cifs_sb
));
1082 rc
= cifs_get_inode_info(&inode
, path
, NULL
, sb
, xid
, NULL
);
1086 inode
= ERR_PTR(rc
);
1090 #ifdef CONFIG_CIFS_FSCACHE
1091 /* populate tcon->resource_id */
1092 tcon
->resource_id
= CIFS_I(inode
)->uniqueid
;
1095 if (rc
&& tcon
->ipc
) {
1096 cifs_dbg(FYI
, "ipc connection - fake read inode\n");
1097 spin_lock(&inode
->i_lock
);
1098 inode
->i_mode
|= S_IFDIR
;
1099 set_nlink(inode
, 2);
1100 inode
->i_op
= &cifs_ipc_inode_ops
;
1101 inode
->i_fop
= &simple_dir_operations
;
1102 inode
->i_uid
= cifs_sb
->mnt_uid
;
1103 inode
->i_gid
= cifs_sb
->mnt_gid
;
1104 spin_unlock(&inode
->i_lock
);
1107 inode
= ERR_PTR(rc
);
1112 /* can not call macro free_xid here since in a void func
1113 * TODO: This is no longer true
1120 cifs_set_file_info(struct inode
*inode
, struct iattr
*attrs
, unsigned int xid
,
1121 char *full_path
, __u32 dosattr
)
1123 bool set_time
= false;
1124 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
1125 struct TCP_Server_Info
*server
;
1126 FILE_BASIC_INFO info_buf
;
1131 server
= cifs_sb_master_tcon(cifs_sb
)->ses
->server
;
1132 if (!server
->ops
->set_file_info
)
1137 if (attrs
->ia_valid
& ATTR_ATIME
) {
1139 info_buf
.LastAccessTime
=
1140 cpu_to_le64(cifs_UnixTimeToNT(attrs
->ia_atime
));
1142 info_buf
.LastAccessTime
= 0;
1144 if (attrs
->ia_valid
& ATTR_MTIME
) {
1146 info_buf
.LastWriteTime
=
1147 cpu_to_le64(cifs_UnixTimeToNT(attrs
->ia_mtime
));
1149 info_buf
.LastWriteTime
= 0;
1152 * Samba throws this field away, but windows may actually use it.
1153 * Do not set ctime unless other time stamps are changed explicitly
1154 * (i.e. by utimes()) since we would then have a mix of client and
1157 if (set_time
&& (attrs
->ia_valid
& ATTR_CTIME
)) {
1158 cifs_dbg(FYI
, "CIFS - CTIME changed\n");
1159 info_buf
.ChangeTime
=
1160 cpu_to_le64(cifs_UnixTimeToNT(attrs
->ia_ctime
));
1162 info_buf
.ChangeTime
= 0;
1164 info_buf
.CreationTime
= 0; /* don't change */
1165 info_buf
.Attributes
= cpu_to_le32(dosattr
);
1167 return server
->ops
->set_file_info(inode
, full_path
, &info_buf
, xid
);
1171 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1172 * and rename it to a random name that hopefully won't conflict with
1176 cifs_rename_pending_delete(const char *full_path
, struct dentry
*dentry
,
1177 const unsigned int xid
)
1181 struct cifs_fid fid
;
1182 struct cifs_open_parms oparms
;
1183 struct inode
*inode
= d_inode(dentry
);
1184 struct cifsInodeInfo
*cifsInode
= CIFS_I(inode
);
1185 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
1186 struct tcon_link
*tlink
;
1187 struct cifs_tcon
*tcon
;
1188 __u32 dosattr
, origattr
;
1189 FILE_BASIC_INFO
*info_buf
= NULL
;
1191 tlink
= cifs_sb_tlink(cifs_sb
);
1193 return PTR_ERR(tlink
);
1194 tcon
= tlink_tcon(tlink
);
1197 * We cannot rename the file if the server doesn't support
1198 * CAP_INFOLEVEL_PASSTHRU
1200 if (!(tcon
->ses
->capabilities
& CAP_INFOLEVEL_PASSTHRU
)) {
1206 oparms
.cifs_sb
= cifs_sb
;
1207 oparms
.desired_access
= DELETE
| FILE_WRITE_ATTRIBUTES
;
1208 oparms
.create_options
= CREATE_NOT_DIR
;
1209 oparms
.disposition
= FILE_OPEN
;
1210 oparms
.path
= full_path
;
1212 oparms
.reconnect
= false;
1214 rc
= CIFS_open(xid
, &oparms
, &oplock
, NULL
);
1218 origattr
= cifsInode
->cifsAttrs
;
1220 origattr
|= ATTR_NORMAL
;
1222 dosattr
= origattr
& ~ATTR_READONLY
;
1224 dosattr
|= ATTR_NORMAL
;
1225 dosattr
|= ATTR_HIDDEN
;
1227 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1228 if (dosattr
!= origattr
) {
1229 info_buf
= kzalloc(sizeof(*info_buf
), GFP_KERNEL
);
1230 if (info_buf
== NULL
) {
1234 info_buf
->Attributes
= cpu_to_le32(dosattr
);
1235 rc
= CIFSSMBSetFileInfo(xid
, tcon
, info_buf
, fid
.netfid
,
1237 /* although we would like to mark the file hidden
1238 if that fails we will still try to rename it */
1240 cifsInode
->cifsAttrs
= dosattr
;
1242 dosattr
= origattr
; /* since not able to change them */
1245 /* rename the file */
1246 rc
= CIFSSMBRenameOpenFile(xid
, tcon
, fid
.netfid
, NULL
,
1248 cifs_remap(cifs_sb
));
1254 /* try to set DELETE_ON_CLOSE */
1255 if (!test_bit(CIFS_INO_DELETE_PENDING
, &cifsInode
->flags
)) {
1256 rc
= CIFSSMBSetFileDisposition(xid
, tcon
, true, fid
.netfid
,
1259 * some samba versions return -ENOENT when we try to set the
1260 * file disposition here. Likely a samba bug, but work around
1261 * it for now. This means that some cifsXXX files may hang
1262 * around after they shouldn't.
1264 * BB: remove this hack after more servers have the fix
1272 set_bit(CIFS_INO_DELETE_PENDING
, &cifsInode
->flags
);
1276 CIFSSMBClose(xid
, tcon
, fid
.netfid
);
1279 cifs_put_tlink(tlink
);
1283 * reset everything back to the original state. Don't bother
1284 * dealing with errors here since we can't do anything about
1288 CIFSSMBRenameOpenFile(xid
, tcon
, fid
.netfid
, dentry
->d_name
.name
,
1289 cifs_sb
->local_nls
, cifs_remap(cifs_sb
));
1291 if (dosattr
!= origattr
) {
1292 info_buf
->Attributes
= cpu_to_le32(origattr
);
1293 if (!CIFSSMBSetFileInfo(xid
, tcon
, info_buf
, fid
.netfid
,
1295 cifsInode
->cifsAttrs
= origattr
;
1301 /* copied from fs/nfs/dir.c with small changes */
1303 cifs_drop_nlink(struct inode
*inode
)
1305 spin_lock(&inode
->i_lock
);
1306 if (inode
->i_nlink
> 0)
1308 spin_unlock(&inode
->i_lock
);
1312 * If d_inode(dentry) is null (usually meaning the cached dentry
1313 * is a negative dentry) then we would attempt a standard SMB delete, but
1314 * if that fails we can not attempt the fall back mechanisms on EACCESS
1315 * but will return the EACCESS to the caller. Note that the VFS does not call
1316 * unlink on negative dentries currently.
1318 int cifs_unlink(struct inode
*dir
, struct dentry
*dentry
)
1322 char *full_path
= NULL
;
1323 struct inode
*inode
= d_inode(dentry
);
1324 struct cifsInodeInfo
*cifs_inode
;
1325 struct super_block
*sb
= dir
->i_sb
;
1326 struct cifs_sb_info
*cifs_sb
= CIFS_SB(sb
);
1327 struct tcon_link
*tlink
;
1328 struct cifs_tcon
*tcon
;
1329 struct TCP_Server_Info
*server
;
1330 struct iattr
*attrs
= NULL
;
1331 __u32 dosattr
= 0, origattr
= 0;
1333 cifs_dbg(FYI
, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir
, dentry
);
1335 tlink
= cifs_sb_tlink(cifs_sb
);
1337 return PTR_ERR(tlink
);
1338 tcon
= tlink_tcon(tlink
);
1339 server
= tcon
->ses
->server
;
1343 /* Unlink can be called from rename so we can not take the
1344 * sb->s_vfs_rename_mutex here */
1345 full_path
= build_path_from_dentry(dentry
);
1346 if (full_path
== NULL
) {
1351 if (cap_unix(tcon
->ses
) && (CIFS_UNIX_POSIX_PATH_OPS_CAP
&
1352 le64_to_cpu(tcon
->fsUnixInfo
.Capability
))) {
1353 rc
= CIFSPOSIXDelFile(xid
, tcon
, full_path
,
1354 SMB_POSIX_UNLINK_FILE_TARGET
, cifs_sb
->local_nls
,
1355 cifs_remap(cifs_sb
));
1356 cifs_dbg(FYI
, "posix del rc %d\n", rc
);
1357 if ((rc
== 0) || (rc
== -ENOENT
))
1358 goto psx_del_no_retry
;
1362 if (!server
->ops
->unlink
) {
1364 goto psx_del_no_retry
;
1367 rc
= server
->ops
->unlink(xid
, tcon
, full_path
, cifs_sb
);
1372 cifs_drop_nlink(inode
);
1373 } else if (rc
== -ENOENT
) {
1375 } else if (rc
== -EBUSY
) {
1376 if (server
->ops
->rename_pending_delete
) {
1377 rc
= server
->ops
->rename_pending_delete(full_path
,
1380 cifs_drop_nlink(inode
);
1382 } else if ((rc
== -EACCES
) && (dosattr
== 0) && inode
) {
1383 attrs
= kzalloc(sizeof(*attrs
), GFP_KERNEL
);
1384 if (attrs
== NULL
) {
1389 /* try to reset dos attributes */
1390 cifs_inode
= CIFS_I(inode
);
1391 origattr
= cifs_inode
->cifsAttrs
;
1393 origattr
|= ATTR_NORMAL
;
1394 dosattr
= origattr
& ~ATTR_READONLY
;
1396 dosattr
|= ATTR_NORMAL
;
1397 dosattr
|= ATTR_HIDDEN
;
1399 rc
= cifs_set_file_info(inode
, attrs
, xid
, full_path
, dosattr
);
1403 goto retry_std_delete
;
1406 /* undo the setattr if we errored out and it's needed */
1407 if (rc
!= 0 && dosattr
!= 0)
1408 cifs_set_file_info(inode
, attrs
, xid
, full_path
, origattr
);
1412 cifs_inode
= CIFS_I(inode
);
1413 cifs_inode
->time
= 0; /* will force revalidate to get info
1415 inode
->i_ctime
= current_time(inode
);
1417 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
1418 cifs_inode
= CIFS_I(dir
);
1419 CIFS_I(dir
)->time
= 0; /* force revalidate of dir as well */
1424 cifs_put_tlink(tlink
);
1429 cifs_mkdir_qinfo(struct inode
*parent
, struct dentry
*dentry
, umode_t mode
,
1430 const char *full_path
, struct cifs_sb_info
*cifs_sb
,
1431 struct cifs_tcon
*tcon
, const unsigned int xid
)
1434 struct inode
*inode
= NULL
;
1437 rc
= cifs_get_inode_info_unix(&inode
, full_path
, parent
->i_sb
,
1440 rc
= cifs_get_inode_info(&inode
, full_path
, NULL
, parent
->i_sb
,
1447 * setting nlink not necessary except in cases where we failed to get it
1448 * from the server or was set bogus. Also, since this is a brand new
1449 * inode, no need to grab the i_lock before setting the i_nlink.
1451 if (inode
->i_nlink
< 2)
1452 set_nlink(inode
, 2);
1453 mode
&= ~current_umask();
1454 /* must turn on setgid bit if parent dir has it */
1455 if (parent
->i_mode
& S_ISGID
)
1458 if (tcon
->unix_ext
) {
1459 struct cifs_unix_set_info_args args
= {
1461 .ctime
= NO_CHANGE_64
,
1462 .atime
= NO_CHANGE_64
,
1463 .mtime
= NO_CHANGE_64
,
1466 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SET_UID
) {
1467 args
.uid
= current_fsuid();
1468 if (parent
->i_mode
& S_ISGID
)
1469 args
.gid
= parent
->i_gid
;
1471 args
.gid
= current_fsgid();
1473 args
.uid
= INVALID_UID
; /* no change */
1474 args
.gid
= INVALID_GID
; /* no change */
1476 CIFSSMBUnixSetPathInfo(xid
, tcon
, full_path
, &args
,
1478 cifs_remap(cifs_sb
));
1480 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
1481 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_CIFS_ACL
) &&
1482 (mode
& S_IWUGO
) == 0 && server
->ops
->mkdir_setinfo
)
1483 server
->ops
->mkdir_setinfo(inode
, full_path
, cifs_sb
,
1485 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_DYNPERM
)
1486 inode
->i_mode
= (mode
| S_IFDIR
);
1488 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SET_UID
) {
1489 inode
->i_uid
= current_fsuid();
1490 if (inode
->i_mode
& S_ISGID
)
1491 inode
->i_gid
= parent
->i_gid
;
1493 inode
->i_gid
= current_fsgid();
1496 d_instantiate(dentry
, inode
);
1501 cifs_posix_mkdir(struct inode
*inode
, struct dentry
*dentry
, umode_t mode
,
1502 const char *full_path
, struct cifs_sb_info
*cifs_sb
,
1503 struct cifs_tcon
*tcon
, const unsigned int xid
)
1507 FILE_UNIX_BASIC_INFO
*info
= NULL
;
1508 struct inode
*newinode
= NULL
;
1509 struct cifs_fattr fattr
;
1511 info
= kzalloc(sizeof(FILE_UNIX_BASIC_INFO
), GFP_KERNEL
);
1514 goto posix_mkdir_out
;
1517 mode
&= ~current_umask();
1518 rc
= CIFSPOSIXCreate(xid
, tcon
, SMB_O_DIRECTORY
| SMB_O_CREAT
, mode
,
1519 NULL
/* netfid */, info
, &oplock
, full_path
,
1520 cifs_sb
->local_nls
, cifs_remap(cifs_sb
));
1521 if (rc
== -EOPNOTSUPP
)
1522 goto posix_mkdir_out
;
1524 cifs_dbg(FYI
, "posix mkdir returned 0x%x\n", rc
);
1526 goto posix_mkdir_out
;
1529 if (info
->Type
== cpu_to_le32(-1))
1530 /* no return info, go query for it */
1531 goto posix_mkdir_get_info
;
1533 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1534 * need to set uid/gid.
1537 cifs_unix_basic_to_fattr(&fattr
, info
, cifs_sb
);
1538 cifs_fill_uniqueid(inode
->i_sb
, &fattr
);
1539 newinode
= cifs_iget(inode
->i_sb
, &fattr
);
1541 goto posix_mkdir_get_info
;
1543 d_instantiate(dentry
, newinode
);
1545 #ifdef CONFIG_CIFS_DEBUG2
1546 cifs_dbg(FYI
, "instantiated dentry %p %pd to inode %p\n",
1547 dentry
, dentry
, newinode
);
1549 if (newinode
->i_nlink
!= 2)
1550 cifs_dbg(FYI
, "unexpected number of links %d\n",
1557 posix_mkdir_get_info
:
1558 rc
= cifs_mkdir_qinfo(inode
, dentry
, mode
, full_path
, cifs_sb
, tcon
,
1560 goto posix_mkdir_out
;
1563 int cifs_mkdir(struct inode
*inode
, struct dentry
*direntry
, umode_t mode
)
1567 struct cifs_sb_info
*cifs_sb
;
1568 struct tcon_link
*tlink
;
1569 struct cifs_tcon
*tcon
;
1570 struct TCP_Server_Info
*server
;
1573 cifs_dbg(FYI
, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n",
1576 cifs_sb
= CIFS_SB(inode
->i_sb
);
1577 tlink
= cifs_sb_tlink(cifs_sb
);
1579 return PTR_ERR(tlink
);
1580 tcon
= tlink_tcon(tlink
);
1584 full_path
= build_path_from_dentry(direntry
);
1585 if (full_path
== NULL
) {
1590 if (cap_unix(tcon
->ses
) && (CIFS_UNIX_POSIX_PATH_OPS_CAP
&
1591 le64_to_cpu(tcon
->fsUnixInfo
.Capability
))) {
1592 rc
= cifs_posix_mkdir(inode
, direntry
, mode
, full_path
, cifs_sb
,
1594 if (rc
!= -EOPNOTSUPP
)
1598 server
= tcon
->ses
->server
;
1600 if (!server
->ops
->mkdir
) {
1605 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1606 rc
= server
->ops
->mkdir(xid
, tcon
, full_path
, cifs_sb
);
1608 cifs_dbg(FYI
, "cifs_mkdir returned 0x%x\n", rc
);
1613 rc
= cifs_mkdir_qinfo(inode
, direntry
, mode
, full_path
, cifs_sb
, tcon
,
1617 * Force revalidate to get parent dir info when needed since cached
1618 * attributes are invalid now.
1620 CIFS_I(inode
)->time
= 0;
1623 cifs_put_tlink(tlink
);
1627 int cifs_rmdir(struct inode
*inode
, struct dentry
*direntry
)
1631 struct cifs_sb_info
*cifs_sb
;
1632 struct tcon_link
*tlink
;
1633 struct cifs_tcon
*tcon
;
1634 struct TCP_Server_Info
*server
;
1635 char *full_path
= NULL
;
1636 struct cifsInodeInfo
*cifsInode
;
1638 cifs_dbg(FYI
, "cifs_rmdir, inode = 0x%p\n", inode
);
1642 full_path
= build_path_from_dentry(direntry
);
1643 if (full_path
== NULL
) {
1648 cifs_sb
= CIFS_SB(inode
->i_sb
);
1649 tlink
= cifs_sb_tlink(cifs_sb
);
1650 if (IS_ERR(tlink
)) {
1651 rc
= PTR_ERR(tlink
);
1654 tcon
= tlink_tcon(tlink
);
1655 server
= tcon
->ses
->server
;
1657 if (!server
->ops
->rmdir
) {
1659 cifs_put_tlink(tlink
);
1663 rc
= server
->ops
->rmdir(xid
, tcon
, full_path
, cifs_sb
);
1664 cifs_put_tlink(tlink
);
1667 spin_lock(&d_inode(direntry
)->i_lock
);
1668 i_size_write(d_inode(direntry
), 0);
1669 clear_nlink(d_inode(direntry
));
1670 spin_unlock(&d_inode(direntry
)->i_lock
);
1673 cifsInode
= CIFS_I(d_inode(direntry
));
1674 /* force revalidate to go get info when needed */
1675 cifsInode
->time
= 0;
1677 cifsInode
= CIFS_I(inode
);
1679 * Force revalidate to get parent dir info when needed since cached
1680 * attributes are invalid now.
1682 cifsInode
->time
= 0;
1684 d_inode(direntry
)->i_ctime
= inode
->i_ctime
= inode
->i_mtime
=
1685 current_time(inode
);
1694 cifs_do_rename(const unsigned int xid
, struct dentry
*from_dentry
,
1695 const char *from_path
, struct dentry
*to_dentry
,
1696 const char *to_path
)
1698 struct cifs_sb_info
*cifs_sb
= CIFS_SB(from_dentry
->d_sb
);
1699 struct tcon_link
*tlink
;
1700 struct cifs_tcon
*tcon
;
1701 struct TCP_Server_Info
*server
;
1702 struct cifs_fid fid
;
1703 struct cifs_open_parms oparms
;
1706 tlink
= cifs_sb_tlink(cifs_sb
);
1708 return PTR_ERR(tlink
);
1709 tcon
= tlink_tcon(tlink
);
1710 server
= tcon
->ses
->server
;
1712 if (!server
->ops
->rename
)
1715 /* try path-based rename first */
1716 rc
= server
->ops
->rename(xid
, tcon
, from_path
, to_path
, cifs_sb
);
1719 * Don't bother with rename by filehandle unless file is busy and
1720 * source. Note that cross directory moves do not work with
1721 * rename by filehandle to various Windows servers.
1723 if (rc
== 0 || rc
!= -EBUSY
)
1724 goto do_rename_exit
;
1726 /* open-file renames don't work across directories */
1727 if (to_dentry
->d_parent
!= from_dentry
->d_parent
)
1728 goto do_rename_exit
;
1731 oparms
.cifs_sb
= cifs_sb
;
1732 /* open the file to be renamed -- we need DELETE perms */
1733 oparms
.desired_access
= DELETE
;
1734 oparms
.create_options
= CREATE_NOT_DIR
;
1735 oparms
.disposition
= FILE_OPEN
;
1736 oparms
.path
= from_path
;
1738 oparms
.reconnect
= false;
1740 rc
= CIFS_open(xid
, &oparms
, &oplock
, NULL
);
1742 rc
= CIFSSMBRenameOpenFile(xid
, tcon
, fid
.netfid
,
1743 (const char *) to_dentry
->d_name
.name
,
1744 cifs_sb
->local_nls
, cifs_remap(cifs_sb
));
1745 CIFSSMBClose(xid
, tcon
, fid
.netfid
);
1748 cifs_put_tlink(tlink
);
1753 cifs_rename2(struct inode
*source_dir
, struct dentry
*source_dentry
,
1754 struct inode
*target_dir
, struct dentry
*target_dentry
,
1757 char *from_name
= NULL
;
1758 char *to_name
= NULL
;
1759 struct cifs_sb_info
*cifs_sb
;
1760 struct tcon_link
*tlink
;
1761 struct cifs_tcon
*tcon
;
1762 FILE_UNIX_BASIC_INFO
*info_buf_source
= NULL
;
1763 FILE_UNIX_BASIC_INFO
*info_buf_target
;
1767 if (flags
& ~RENAME_NOREPLACE
)
1770 cifs_sb
= CIFS_SB(source_dir
->i_sb
);
1771 tlink
= cifs_sb_tlink(cifs_sb
);
1773 return PTR_ERR(tlink
);
1774 tcon
= tlink_tcon(tlink
);
1779 * we already have the rename sem so we do not need to
1780 * grab it again here to protect the path integrity
1782 from_name
= build_path_from_dentry(source_dentry
);
1783 if (from_name
== NULL
) {
1785 goto cifs_rename_exit
;
1788 to_name
= build_path_from_dentry(target_dentry
);
1789 if (to_name
== NULL
) {
1791 goto cifs_rename_exit
;
1794 rc
= cifs_do_rename(xid
, source_dentry
, from_name
, target_dentry
,
1798 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
1800 if (flags
& RENAME_NOREPLACE
)
1801 goto cifs_rename_exit
;
1803 if (rc
== -EEXIST
&& tcon
->unix_ext
) {
1805 * Are src and dst hardlinks of same inode? We can only tell
1806 * with unix extensions enabled.
1809 kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO
),
1811 if (info_buf_source
== NULL
) {
1813 goto cifs_rename_exit
;
1816 info_buf_target
= info_buf_source
+ 1;
1817 tmprc
= CIFSSMBUnixQPathInfo(xid
, tcon
, from_name
,
1820 cifs_remap(cifs_sb
));
1824 tmprc
= CIFSSMBUnixQPathInfo(xid
, tcon
, to_name
,
1827 cifs_remap(cifs_sb
));
1829 if (tmprc
== 0 && (info_buf_source
->UniqueId
==
1830 info_buf_target
->UniqueId
)) {
1831 /* same file, POSIX says that this is a noop */
1833 goto cifs_rename_exit
;
1837 * else ... BB we could add the same check for Windows by
1838 * checking the UniqueId via FILE_INTERNAL_INFO
1842 /* Try unlinking the target dentry if it's not negative */
1843 if (d_really_is_positive(target_dentry
) && (rc
== -EACCES
|| rc
== -EEXIST
)) {
1844 if (d_is_dir(target_dentry
))
1845 tmprc
= cifs_rmdir(target_dir
, target_dentry
);
1847 tmprc
= cifs_unlink(target_dir
, target_dentry
);
1849 goto cifs_rename_exit
;
1850 rc
= cifs_do_rename(xid
, source_dentry
, from_name
,
1851 target_dentry
, to_name
);
1854 /* force revalidate to go get info when needed */
1855 CIFS_I(source_dir
)->time
= CIFS_I(target_dir
)->time
= 0;
1857 source_dir
->i_ctime
= source_dir
->i_mtime
= target_dir
->i_ctime
=
1858 target_dir
->i_mtime
= current_time(source_dir
);
1861 kfree(info_buf_source
);
1865 cifs_put_tlink(tlink
);
1870 cifs_inode_needs_reval(struct inode
*inode
)
1872 struct cifsInodeInfo
*cifs_i
= CIFS_I(inode
);
1873 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
1875 if (CIFS_CACHE_READ(cifs_i
))
1878 if (!lookupCacheEnabled
)
1881 if (cifs_i
->time
== 0)
1884 if (!cifs_sb
->actimeo
)
1887 if (!time_in_range(jiffies
, cifs_i
->time
,
1888 cifs_i
->time
+ cifs_sb
->actimeo
))
1891 /* hardlinked files w/ noserverino get "special" treatment */
1892 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SERVER_INUM
) &&
1893 S_ISREG(inode
->i_mode
) && inode
->i_nlink
!= 1)
1900 * Zap the cache. Called when invalid_mapping flag is set.
1903 cifs_invalidate_mapping(struct inode
*inode
)
1907 if (inode
->i_mapping
&& inode
->i_mapping
->nrpages
!= 0) {
1908 rc
= invalidate_inode_pages2(inode
->i_mapping
);
1910 cifs_dbg(VFS
, "%s: could not invalidate inode %p\n",
1914 cifs_fscache_reset_inode_cookie(inode
);
1919 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
1920 * @word: long word containing the bit lock
1923 cifs_wait_bit_killable(struct wait_bit_key
*key
, int mode
)
1925 freezable_schedule_unsafe();
1926 if (signal_pending_state(mode
, current
))
1927 return -ERESTARTSYS
;
1932 cifs_revalidate_mapping(struct inode
*inode
)
1935 unsigned long *flags
= &CIFS_I(inode
)->flags
;
1937 rc
= wait_on_bit_lock_action(flags
, CIFS_INO_LOCK
, cifs_wait_bit_killable
,
1942 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING
, flags
)) {
1943 rc
= cifs_invalidate_mapping(inode
);
1945 set_bit(CIFS_INO_INVALID_MAPPING
, flags
);
1948 clear_bit_unlock(CIFS_INO_LOCK
, flags
);
1949 smp_mb__after_atomic();
1950 wake_up_bit(flags
, CIFS_INO_LOCK
);
1956 cifs_zap_mapping(struct inode
*inode
)
1958 set_bit(CIFS_INO_INVALID_MAPPING
, &CIFS_I(inode
)->flags
);
1959 return cifs_revalidate_mapping(inode
);
1962 int cifs_revalidate_file_attr(struct file
*filp
)
1965 struct inode
*inode
= file_inode(filp
);
1966 struct cifsFileInfo
*cfile
= (struct cifsFileInfo
*) filp
->private_data
;
1968 if (!cifs_inode_needs_reval(inode
))
1971 if (tlink_tcon(cfile
->tlink
)->unix_ext
)
1972 rc
= cifs_get_file_info_unix(filp
);
1974 rc
= cifs_get_file_info(filp
);
1979 int cifs_revalidate_dentry_attr(struct dentry
*dentry
)
1983 struct inode
*inode
= d_inode(dentry
);
1984 struct super_block
*sb
= dentry
->d_sb
;
1985 char *full_path
= NULL
;
1990 if (!cifs_inode_needs_reval(inode
))
1995 /* can not safely grab the rename sem here if rename calls revalidate
1996 since that would deadlock */
1997 full_path
= build_path_from_dentry(dentry
);
1998 if (full_path
== NULL
) {
2003 cifs_dbg(FYI
, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2004 full_path
, inode
, inode
->i_count
.counter
,
2005 dentry
, cifs_get_time(dentry
), jiffies
);
2007 if (cifs_sb_master_tcon(CIFS_SB(sb
))->unix_ext
)
2008 rc
= cifs_get_inode_info_unix(&inode
, full_path
, sb
, xid
);
2010 rc
= cifs_get_inode_info(&inode
, full_path
, NULL
, sb
,
2019 int cifs_revalidate_file(struct file
*filp
)
2022 struct inode
*inode
= file_inode(filp
);
2024 rc
= cifs_revalidate_file_attr(filp
);
2028 return cifs_revalidate_mapping(inode
);
2031 /* revalidate a dentry's inode attributes */
2032 int cifs_revalidate_dentry(struct dentry
*dentry
)
2035 struct inode
*inode
= d_inode(dentry
);
2037 rc
= cifs_revalidate_dentry_attr(dentry
);
2041 return cifs_revalidate_mapping(inode
);
2044 int cifs_getattr(const struct path
*path
, struct kstat
*stat
,
2045 u32 request_mask
, unsigned int flags
)
2047 struct dentry
*dentry
= path
->dentry
;
2048 struct cifs_sb_info
*cifs_sb
= CIFS_SB(dentry
->d_sb
);
2049 struct cifs_tcon
*tcon
= cifs_sb_master_tcon(cifs_sb
);
2050 struct inode
*inode
= d_inode(dentry
);
2054 * We need to be sure that all dirty pages are written and the server
2055 * has actual ctime, mtime and file length.
2057 if (!CIFS_CACHE_READ(CIFS_I(inode
)) && inode
->i_mapping
&&
2058 inode
->i_mapping
->nrpages
!= 0) {
2059 rc
= filemap_fdatawait(inode
->i_mapping
);
2061 mapping_set_error(inode
->i_mapping
, rc
);
2066 rc
= cifs_revalidate_dentry_attr(dentry
);
2070 generic_fillattr(inode
, stat
);
2071 stat
->blksize
= CIFS_MAX_MSGSIZE
;
2072 stat
->ino
= CIFS_I(inode
)->uniqueid
;
2074 /* old CIFS Unix Extensions doesn't return create time */
2075 if (CIFS_I(inode
)->createtime
) {
2076 stat
->result_mask
|= STATX_BTIME
;
2078 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode
)->createtime
));
2081 stat
->attributes_mask
|= (STATX_ATTR_COMPRESSED
| STATX_ATTR_ENCRYPTED
);
2082 if (CIFS_I(inode
)->cifsAttrs
& FILE_ATTRIBUTE_COMPRESSED
)
2083 stat
->attributes
|= STATX_ATTR_COMPRESSED
;
2084 if (CIFS_I(inode
)->cifsAttrs
& FILE_ATTRIBUTE_ENCRYPTED
)
2085 stat
->attributes
|= STATX_ATTR_ENCRYPTED
;
2088 * If on a multiuser mount without unix extensions or cifsacl being
2089 * enabled, and the admin hasn't overridden them, set the ownership
2090 * to the fsuid/fsgid of the current process.
2092 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
) &&
2093 !(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_CIFS_ACL
) &&
2095 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_OVERR_UID
))
2096 stat
->uid
= current_fsuid();
2097 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_OVERR_GID
))
2098 stat
->gid
= current_fsgid();
2103 static int cifs_truncate_page(struct address_space
*mapping
, loff_t from
)
2105 pgoff_t index
= from
>> PAGE_SHIFT
;
2106 unsigned offset
= from
& (PAGE_SIZE
- 1);
2110 page
= grab_cache_page(mapping
, index
);
2114 zero_user_segment(page
, offset
, PAGE_SIZE
);
2120 static void cifs_setsize(struct inode
*inode
, loff_t offset
)
2122 spin_lock(&inode
->i_lock
);
2123 i_size_write(inode
, offset
);
2124 spin_unlock(&inode
->i_lock
);
2126 truncate_pagecache(inode
, offset
);
2130 cifs_set_file_size(struct inode
*inode
, struct iattr
*attrs
,
2131 unsigned int xid
, char *full_path
)
2134 struct cifsFileInfo
*open_file
;
2135 struct cifsInodeInfo
*cifsInode
= CIFS_I(inode
);
2136 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
2137 struct tcon_link
*tlink
= NULL
;
2138 struct cifs_tcon
*tcon
= NULL
;
2139 struct TCP_Server_Info
*server
;
2142 * To avoid spurious oplock breaks from server, in the case of
2143 * inodes that we already have open, avoid doing path based
2144 * setting of file size if we can do it by handle.
2145 * This keeps our caching token (oplock) and avoids timeouts
2146 * when the local oplock break takes longer to flush
2147 * writebehind data than the SMB timeout for the SetPathInfo
2148 * request would allow
2150 open_file
= find_writable_file(cifsInode
, true);
2152 tcon
= tlink_tcon(open_file
->tlink
);
2153 server
= tcon
->ses
->server
;
2154 if (server
->ops
->set_file_size
)
2155 rc
= server
->ops
->set_file_size(xid
, tcon
, open_file
,
2156 attrs
->ia_size
, false);
2159 cifsFileInfo_put(open_file
);
2160 cifs_dbg(FYI
, "SetFSize for attrs rc = %d\n", rc
);
2168 tlink
= cifs_sb_tlink(cifs_sb
);
2170 return PTR_ERR(tlink
);
2171 tcon
= tlink_tcon(tlink
);
2172 server
= tcon
->ses
->server
;
2176 * Set file size by pathname rather than by handle either because no
2177 * valid, writeable file handle for it was found or because there was
2178 * an error setting it by handle.
2180 if (server
->ops
->set_path_size
)
2181 rc
= server
->ops
->set_path_size(xid
, tcon
, full_path
,
2182 attrs
->ia_size
, cifs_sb
, false);
2185 cifs_dbg(FYI
, "SetEOF by path (setattrs) rc = %d\n", rc
);
2188 cifs_put_tlink(tlink
);
2192 cifsInode
->server_eof
= attrs
->ia_size
;
2193 cifs_setsize(inode
, attrs
->ia_size
);
2194 cifs_truncate_page(inode
->i_mapping
, inode
->i_size
);
2201 cifs_setattr_unix(struct dentry
*direntry
, struct iattr
*attrs
)
2205 char *full_path
= NULL
;
2206 struct inode
*inode
= d_inode(direntry
);
2207 struct cifsInodeInfo
*cifsInode
= CIFS_I(inode
);
2208 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
2209 struct tcon_link
*tlink
;
2210 struct cifs_tcon
*pTcon
;
2211 struct cifs_unix_set_info_args
*args
= NULL
;
2212 struct cifsFileInfo
*open_file
;
2214 cifs_dbg(FYI
, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2215 direntry
, attrs
->ia_valid
);
2219 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_PERM
)
2220 attrs
->ia_valid
|= ATTR_FORCE
;
2222 rc
= setattr_prepare(direntry
, attrs
);
2226 full_path
= build_path_from_dentry(direntry
);
2227 if (full_path
== NULL
) {
2233 * Attempt to flush data before changing attributes. We need to do
2234 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2235 * ownership or mode then we may also need to do this. Here, we take
2236 * the safe way out and just do the flush on all setattr requests. If
2237 * the flush returns error, store it to report later and continue.
2239 * BB: This should be smarter. Why bother flushing pages that
2240 * will be truncated anyway? Also, should we error out here if
2241 * the flush returns error?
2243 rc
= filemap_write_and_wait(inode
->i_mapping
);
2244 mapping_set_error(inode
->i_mapping
, rc
);
2247 if (attrs
->ia_valid
& ATTR_SIZE
) {
2248 rc
= cifs_set_file_size(inode
, attrs
, xid
, full_path
);
2253 /* skip mode change if it's just for clearing setuid/setgid */
2254 if (attrs
->ia_valid
& (ATTR_KILL_SUID
|ATTR_KILL_SGID
))
2255 attrs
->ia_valid
&= ~ATTR_MODE
;
2257 args
= kmalloc(sizeof(*args
), GFP_KERNEL
);
2263 /* set up the struct */
2264 if (attrs
->ia_valid
& ATTR_MODE
)
2265 args
->mode
= attrs
->ia_mode
;
2267 args
->mode
= NO_CHANGE_64
;
2269 if (attrs
->ia_valid
& ATTR_UID
)
2270 args
->uid
= attrs
->ia_uid
;
2272 args
->uid
= INVALID_UID
; /* no change */
2274 if (attrs
->ia_valid
& ATTR_GID
)
2275 args
->gid
= attrs
->ia_gid
;
2277 args
->gid
= INVALID_GID
; /* no change */
2279 if (attrs
->ia_valid
& ATTR_ATIME
)
2280 args
->atime
= cifs_UnixTimeToNT(attrs
->ia_atime
);
2282 args
->atime
= NO_CHANGE_64
;
2284 if (attrs
->ia_valid
& ATTR_MTIME
)
2285 args
->mtime
= cifs_UnixTimeToNT(attrs
->ia_mtime
);
2287 args
->mtime
= NO_CHANGE_64
;
2289 if (attrs
->ia_valid
& ATTR_CTIME
)
2290 args
->ctime
= cifs_UnixTimeToNT(attrs
->ia_ctime
);
2292 args
->ctime
= NO_CHANGE_64
;
2295 open_file
= find_writable_file(cifsInode
, true);
2297 u16 nfid
= open_file
->fid
.netfid
;
2298 u32 npid
= open_file
->pid
;
2299 pTcon
= tlink_tcon(open_file
->tlink
);
2300 rc
= CIFSSMBUnixSetFileInfo(xid
, pTcon
, args
, nfid
, npid
);
2301 cifsFileInfo_put(open_file
);
2303 tlink
= cifs_sb_tlink(cifs_sb
);
2304 if (IS_ERR(tlink
)) {
2305 rc
= PTR_ERR(tlink
);
2308 pTcon
= tlink_tcon(tlink
);
2309 rc
= CIFSSMBUnixSetPathInfo(xid
, pTcon
, full_path
, args
,
2311 cifs_remap(cifs_sb
));
2312 cifs_put_tlink(tlink
);
2318 if ((attrs
->ia_valid
& ATTR_SIZE
) &&
2319 attrs
->ia_size
!= i_size_read(inode
))
2320 truncate_setsize(inode
, attrs
->ia_size
);
2322 setattr_copy(inode
, attrs
);
2323 mark_inode_dirty(inode
);
2325 /* force revalidate when any of these times are set since some
2326 of the fs types (eg ext3, fat) do not have fine enough
2327 time granularity to match protocol, and we do not have a
2328 a way (yet) to query the server fs's time granularity (and
2329 whether it rounds times down).
2331 if (attrs
->ia_valid
& (ATTR_MTIME
| ATTR_CTIME
))
2332 cifsInode
->time
= 0;
2341 cifs_setattr_nounix(struct dentry
*direntry
, struct iattr
*attrs
)
2344 kuid_t uid
= INVALID_UID
;
2345 kgid_t gid
= INVALID_GID
;
2346 struct inode
*inode
= d_inode(direntry
);
2347 struct cifs_sb_info
*cifs_sb
= CIFS_SB(inode
->i_sb
);
2348 struct cifsInodeInfo
*cifsInode
= CIFS_I(inode
);
2349 char *full_path
= NULL
;
2352 __u64 mode
= NO_CHANGE_64
;
2356 cifs_dbg(FYI
, "setattr on file %pd attrs->iavalid 0x%x\n",
2357 direntry
, attrs
->ia_valid
);
2359 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_PERM
)
2360 attrs
->ia_valid
|= ATTR_FORCE
;
2362 rc
= setattr_prepare(direntry
, attrs
);
2368 full_path
= build_path_from_dentry(direntry
);
2369 if (full_path
== NULL
) {
2376 * Attempt to flush data before changing attributes. We need to do
2377 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2378 * ownership or mode then we may also need to do this. Here, we take
2379 * the safe way out and just do the flush on all setattr requests. If
2380 * the flush returns error, store it to report later and continue.
2382 * BB: This should be smarter. Why bother flushing pages that
2383 * will be truncated anyway? Also, should we error out here if
2384 * the flush returns error?
2386 rc
= filemap_write_and_wait(inode
->i_mapping
);
2387 mapping_set_error(inode
->i_mapping
, rc
);
2390 if (attrs
->ia_valid
& ATTR_SIZE
) {
2391 rc
= cifs_set_file_size(inode
, attrs
, xid
, full_path
);
2393 goto cifs_setattr_exit
;
2396 if (attrs
->ia_valid
& ATTR_UID
)
2397 uid
= attrs
->ia_uid
;
2399 if (attrs
->ia_valid
& ATTR_GID
)
2400 gid
= attrs
->ia_gid
;
2402 #ifdef CONFIG_CIFS_ACL
2403 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_CIFS_ACL
) {
2404 if (uid_valid(uid
) || gid_valid(gid
)) {
2405 rc
= id_mode_to_cifs_acl(inode
, full_path
, NO_CHANGE_64
,
2408 cifs_dbg(FYI
, "%s: Setting id failed with error: %d\n",
2410 goto cifs_setattr_exit
;
2414 #endif /* CONFIG_CIFS_ACL */
2415 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_SET_UID
))
2416 attrs
->ia_valid
&= ~(ATTR_UID
| ATTR_GID
);
2418 /* skip mode change if it's just for clearing setuid/setgid */
2419 if (attrs
->ia_valid
& (ATTR_KILL_SUID
|ATTR_KILL_SGID
))
2420 attrs
->ia_valid
&= ~ATTR_MODE
;
2422 if (attrs
->ia_valid
& ATTR_MODE
) {
2423 mode
= attrs
->ia_mode
;
2425 #ifdef CONFIG_CIFS_ACL
2426 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_CIFS_ACL
) {
2427 rc
= id_mode_to_cifs_acl(inode
, full_path
, mode
,
2428 INVALID_UID
, INVALID_GID
);
2430 cifs_dbg(FYI
, "%s: Setting ACL failed with error: %d\n",
2432 goto cifs_setattr_exit
;
2435 #endif /* CONFIG_CIFS_ACL */
2436 if (((mode
& S_IWUGO
) == 0) &&
2437 (cifsInode
->cifsAttrs
& ATTR_READONLY
) == 0) {
2439 dosattr
= cifsInode
->cifsAttrs
| ATTR_READONLY
;
2441 /* fix up mode if we're not using dynperm */
2442 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_DYNPERM
) == 0)
2443 attrs
->ia_mode
= inode
->i_mode
& ~S_IWUGO
;
2444 } else if ((mode
& S_IWUGO
) &&
2445 (cifsInode
->cifsAttrs
& ATTR_READONLY
)) {
2447 dosattr
= cifsInode
->cifsAttrs
& ~ATTR_READONLY
;
2448 /* Attributes of 0 are ignored */
2450 dosattr
|= ATTR_NORMAL
;
2452 /* reset local inode permissions to normal */
2453 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_DYNPERM
)) {
2454 attrs
->ia_mode
&= ~(S_IALLUGO
);
2455 if (S_ISDIR(inode
->i_mode
))
2457 cifs_sb
->mnt_dir_mode
;
2460 cifs_sb
->mnt_file_mode
;
2462 } else if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_DYNPERM
)) {
2463 /* ignore mode change - ATTR_READONLY hasn't changed */
2464 attrs
->ia_valid
&= ~ATTR_MODE
;
2468 if (attrs
->ia_valid
& (ATTR_MTIME
|ATTR_ATIME
|ATTR_CTIME
) ||
2469 ((attrs
->ia_valid
& ATTR_MODE
) && dosattr
)) {
2470 rc
= cifs_set_file_info(inode
, attrs
, xid
, full_path
, dosattr
);
2471 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2473 /* Even if error on time set, no sense failing the call if
2474 the server would set the time to a reasonable value anyway,
2475 and this check ensures that we are not being called from
2476 sys_utimes in which case we ought to fail the call back to
2477 the user when the server rejects the call */
2478 if ((rc
) && (attrs
->ia_valid
&
2479 (ATTR_MODE
| ATTR_GID
| ATTR_UID
| ATTR_SIZE
)))
2483 /* do not need local check to inode_check_ok since the server does
2486 goto cifs_setattr_exit
;
2488 if ((attrs
->ia_valid
& ATTR_SIZE
) &&
2489 attrs
->ia_size
!= i_size_read(inode
))
2490 truncate_setsize(inode
, attrs
->ia_size
);
2492 setattr_copy(inode
, attrs
);
2493 mark_inode_dirty(inode
);
2502 cifs_setattr(struct dentry
*direntry
, struct iattr
*attrs
)
2504 struct cifs_sb_info
*cifs_sb
= CIFS_SB(direntry
->d_sb
);
2505 struct cifs_tcon
*pTcon
= cifs_sb_master_tcon(cifs_sb
);
2507 if (pTcon
->unix_ext
)
2508 return cifs_setattr_unix(direntry
, attrs
);
2510 return cifs_setattr_nounix(direntry
, attrs
);
2512 /* BB: add cifs_setattr_legacy for really old servers */
2516 void cifs_delete_inode(struct inode
*inode
)
2518 cifs_dbg(FYI
, "In cifs_delete_inode, inode = 0x%p\n", inode
);
2519 /* may have to add back in if and when safe distributed caching of
2520 directories added e.g. via FindNotify */