Lines Matching refs:fattr

93 /* check inode attributes against fattr. If they don't match, tag the
97 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
118 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
119 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
120 cifs_i->server_eof == fattr->cf_eof) {
136 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
143 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
146 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
155 set_nlink(inode, fattr->cf_nlink);
160 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
165 cifs_revalidate_cache(inode, fattr);
168 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
169 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
170 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
172 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
173 inode->i_atime = fattr->cf_mtime;
175 inode->i_atime = fattr->cf_atime;
176 inode->i_mtime = fattr->cf_mtime;
177 inode->i_ctime = fattr->cf_ctime;
178 inode->i_rdev = fattr->cf_rdev;
179 cifs_nlink_fattr_to_inode(inode, fattr);
180 inode->i_uid = fattr->cf_uid;
181 inode->i_gid = fattr->cf_gid;
186 inode->i_mode = fattr->cf_mode;
188 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
190 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
195 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
200 cifs_i->server_eof = fattr->cf_eof;
205 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
206 i_size_write(inode, fattr->cf_eof);
213 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
217 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
224 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
231 fattr->cf_uniqueid = iunique(sb, ROOT_I);
236 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
239 memset(fattr, 0, sizeof(*fattr));
240 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
241 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
242 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
244 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
245 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
246 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
249 fattr->cf_mode = le64_to_cpu(info->Permissions);
255 fattr->cf_mode &= ~S_IFMT;
258 fattr->cf_mode |= S_IFREG;
259 fattr->cf_dtype = DT_REG;
262 fattr->cf_mode |= S_IFLNK;
263 fattr->cf_dtype = DT_LNK;
266 fattr->cf_mode |= S_IFDIR;
267 fattr->cf_dtype = DT_DIR;
270 fattr->cf_mode |= S_IFCHR;
271 fattr->cf_dtype = DT_CHR;
272 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
276 fattr->cf_mode |= S_IFBLK;
277 fattr->cf_dtype = DT_BLK;
278 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
282 fattr->cf_mode |= S_IFIFO;
283 fattr->cf_dtype = DT_FIFO;
286 fattr->cf_mode |= S_IFSOCK;
287 fattr->cf_dtype = DT_SOCK;
291 fattr->cf_mode |= S_IFREG;
292 fattr->cf_dtype = DT_REG;
297 fattr->cf_uid = cifs_sb->mnt_uid;
303 fattr->cf_uid = uid;
307 fattr->cf_gid = cifs_sb->mnt_gid;
313 fattr->cf_gid = gid;
317 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
328 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
332 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
334 memset(fattr, 0, sizeof(*fattr));
335 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
336 fattr->cf_uid = cifs_sb->mnt_uid;
337 fattr->cf_gid = cifs_sb->mnt_gid;
338 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
339 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
340 fattr->cf_nlink = 2;
341 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
350 struct cifs_fattr fattr;
359 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
361 cifs_create_dfs_fattr(&fattr, inode->i_sb);
365 cifs_fattr_to_inode(inode, &fattr);
376 struct cifs_fattr fattr;
394 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
396 cifs_create_dfs_fattr(&fattr, sb);
404 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
412 cifs_fill_uniqueid(sb, &fattr);
413 *pinode = cifs_iget(sb, &fattr);
421 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
428 if (unlikely(inode_wrong_type(*pinode, fattr.cf_mode))) {
434 cifs_fattr_to_inode(*pinode, &fattr);
442 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
459 fattr->cf_mode &= ~S_IFMT;
461 if (fattr->cf_eof == 0) {
462 fattr->cf_mode |= S_IFIFO;
463 fattr->cf_dtype = DT_FIFO;
465 } else if (fattr->cf_eof < 8) {
466 fattr->cf_mode |= S_IFREG;
467 fattr->cf_dtype = DT_REG;
508 fattr->cf_mode |= S_IFBLK;
509 fattr->cf_dtype = DT_BLK;
516 fattr->cf_rdev = MKDEV(mjr, mnr);
520 fattr->cf_mode |= S_IFCHR;
521 fattr->cf_dtype = DT_CHR;
528 fattr->cf_rdev = MKDEV(mjr, mnr);
532 fattr->cf_mode |= S_IFLNK;
533 fattr->cf_dtype = DT_LNK;
535 fattr->cf_mode |= S_IFREG; /* file? */
536 fattr->cf_dtype = DT_REG;
540 fattr->cf_mode |= S_IFREG; /* then it is a file */
541 fattr->cf_dtype = DT_REG;
557 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
585 fattr->cf_mode &= ~SFBITS_MASK;
587 mode, fattr->cf_mode);
588 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
600 smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct smb311_posix_qinfo *info,
606 memset(fattr, 0, sizeof(*fattr));
608 /* no fattr->flags to set */
609 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
610 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
613 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
615 ktime_get_coarse_real_ts64(&fattr->cf_atime);
617 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
618 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
621 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
622 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
625 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
626 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
627 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
629 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
630 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
632 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
635 fattr->cf_mode |= S_IFLNK;
636 fattr->cf_dtype = DT_LNK;
637 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
638 fattr->cf_mode |= S_IFDIR;
639 fattr->cf_dtype = DT_DIR;
641 fattr->cf_mode |= S_IFREG;
642 fattr->cf_dtype = DT_REG;
646 fattr->cf_uid = cifs_sb->mnt_uid; /* TODO: map uid and gid from SID */
647 fattr->cf_gid = cifs_sb->mnt_gid;
650 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
656 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
663 memset(fattr, 0, sizeof(*fattr));
664 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
666 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
669 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
671 ktime_get_coarse_real_ts64(&fattr->cf_atime);
673 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
674 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
677 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
678 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
681 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
682 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
683 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
685 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
687 fattr->cf_mode |= S_IFLNK | cifs_sb->mnt_file_mode;
688 fattr->cf_dtype = DT_LNK;
690 fattr->cf_mode |= S_IFIFO | cifs_sb->mnt_file_mode;
691 fattr->cf_dtype = DT_FIFO;
693 fattr->cf_mode |= S_IFSOCK | cifs_sb->mnt_file_mode;
694 fattr->cf_dtype = DT_SOCK;
696 fattr->cf_mode |= S_IFCHR | cifs_sb->mnt_file_mode;
697 fattr->cf_dtype = DT_CHR;
699 fattr->cf_mode |= S_IFBLK | cifs_sb->mnt_file_mode;
700 fattr->cf_dtype = DT_BLK;
702 fattr->cf_mode = S_IFLNK;
703 fattr->cf_dtype = DT_LNK;
704 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
705 fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
706 fattr->cf_dtype = DT_DIR;
712 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
714 fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
715 fattr->cf_dtype = DT_REG;
718 if (fattr->cf_cifsattrs & ATTR_READONLY)
719 fattr->cf_mode &= ~(S_IWUGO);
725 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
728 fattr->cf_nlink);
729 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
733 fattr->cf_uid = cifs_sb->mnt_uid;
734 fattr->cf_gid = cifs_sb->mnt_gid;
743 struct cifs_fattr fattr;
757 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
761 cifs_create_dfs_fattr(&fattr, inode->i_sb);
781 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
782 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
783 cifs_fattr_to_inode(inode, &fattr);
857 struct cifs_fattr *fattr)
865 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
867 fattr->cf_uniqueid = iunique(sb, ROOT_I);
878 &fattr->cf_uniqueid,
886 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
888 fattr->cf_uniqueid = iunique(sb, ROOT_I);
895 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
899 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
902 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
903 fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
926 struct cifs_fattr fattr = {0};
962 * 2. Convert it to internal cifs metadata (fattr)
978 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
983 cifs_create_dfs_fattr(&fattr, sb);
1010 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1011 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1025 * 3. Get or update inode number (fattr.cf_uniqueid)
1028 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1031 * 4. Tweak fattr based on mount options
1036 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1038 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1045 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1055 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1068 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1072 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1079 * 5. Update inode with final fattr data
1083 *inode = cifs_iget(sb, &fattr);
1091 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1099 (fattr.cf_mode & S_IFMT))) {
1105 cifs_fattr_to_inode(*inode, &fattr);
1123 struct cifs_fattr fattr = {0};
1153 * 2. Convert it to internal cifs metadata (fattr)
1158 smb311_posix_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
1162 cifs_create_dfs_fattr(&fattr, sb);
1180 * 3. Tweak fattr based on mount options
1185 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1192 * 4. Update inode with final fattr data
1196 *inode = cifs_iget(sb, &fattr);
1204 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1212 (fattr.cf_mode & S_IFMT))) {
1218 cifs_fattr_to_inode(*inode, &fattr);
1234 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1237 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1241 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1245 if (inode_wrong_type(inode, fattr->cf_mode))
1250 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1258 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1260 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1261 CIFS_I(inode)->createtime = fattr->cf_createtime;
1288 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1294 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1297 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1299 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1302 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1303 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1308 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1313 cifs_fattr_to_inode(inode, fattr);
1799 struct cifs_fattr fattr;
1827 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1828 cifs_fill_uniqueid(inode->i_sb, &fattr);
1829 newinode = cifs_iget(inode->i_sb, &fattr);