Lines Matching refs:fattr

77 /* check inode attributes against fattr. If they don't match, tag the
81 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
104 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
106 if (timespec64_equal(&mtime, &fattr->cf_mtime) &&
107 cifs_i->server_eof == fattr->cf_eof) {
126 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
133 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
136 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
145 set_nlink(inode, fattr->cf_nlink);
150 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr,
157 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
162 cifs_revalidate_cache(inode, fattr);
165 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
166 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
167 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
169 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
170 inode_set_atime_to_ts(inode, fattr->cf_mtime);
172 inode_set_atime_to_ts(inode, fattr->cf_atime);
173 inode_set_mtime_to_ts(inode, fattr->cf_mtime);
174 inode_set_ctime_to_ts(inode, fattr->cf_ctime);
175 inode->i_rdev = fattr->cf_rdev;
176 cifs_nlink_fattr_to_inode(inode, fattr);
177 inode->i_uid = fattr->cf_uid;
178 inode->i_gid = fattr->cf_gid;
183 inode->i_mode = fattr->cf_mode;
185 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
186 cifs_i->reparse_tag = fattr->cf_cifstag;
188 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
193 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
198 cifs_i->server_eof = fattr->cf_eof;
203 if (is_size_safe_to_change(cifs_i, fattr->cf_eof, from_readdir)) {
204 i_size_write(inode, fattr->cf_eof);
211 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
214 if (S_ISLNK(fattr->cf_mode) && fattr->cf_symlink_target) {
216 cifs_i->symlink_target = fattr->cf_symlink_target;
217 fattr->cf_symlink_target = NULL;
221 if (fattr->cf_flags & CIFS_FATTR_JUNCTION)
229 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
236 fattr->cf_uniqueid = iunique(sb, ROOT_I);
241 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
244 memset(fattr, 0, sizeof(*fattr));
245 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
246 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
247 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
249 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
250 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
251 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
254 fattr->cf_mode = le64_to_cpu(info->Permissions);
260 fattr->cf_mode &= ~S_IFMT;
263 fattr->cf_mode |= S_IFREG;
264 fattr->cf_dtype = DT_REG;
267 fattr->cf_mode |= S_IFLNK;
268 fattr->cf_dtype = DT_LNK;
271 fattr->cf_mode |= S_IFDIR;
272 fattr->cf_dtype = DT_DIR;
275 fattr->cf_mode |= S_IFCHR;
276 fattr->cf_dtype = DT_CHR;
277 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
281 fattr->cf_mode |= S_IFBLK;
282 fattr->cf_dtype = DT_BLK;
283 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
287 fattr->cf_mode |= S_IFIFO;
288 fattr->cf_dtype = DT_FIFO;
291 fattr->cf_mode |= S_IFSOCK;
292 fattr->cf_dtype = DT_SOCK;
296 fattr->cf_mode |= S_IFREG;
297 fattr->cf_dtype = DT_REG;
302 fattr->cf_uid = cifs_sb->ctx->linux_uid;
308 fattr->cf_uid = uid;
312 fattr->cf_gid = cifs_sb->ctx->linux_gid;
318 fattr->cf_gid = gid;
322 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
332 static void cifs_create_junction_fattr(struct cifs_fattr *fattr,
337 cifs_dbg(FYI, "%s: creating fake fattr\n", __func__);
339 memset(fattr, 0, sizeof(*fattr));
340 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
341 fattr->cf_uid = cifs_sb->ctx->linux_uid;
342 fattr->cf_gid = cifs_sb->ctx->linux_gid;
343 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
344 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
345 fattr->cf_nlink = 2;
346 fattr->cf_flags = CIFS_FATTR_JUNCTION;
349 /* Update inode with final fattr data */
351 struct cifs_fattr *fattr,
358 *inode = cifs_iget(sb, fattr);
368 CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) {
372 return cifs_fattr_to_inode(*inode, fattr, false);
382 struct cifs_fattr fattr = {};
391 fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
392 if (!fattr.cf_symlink_target) {
400 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
402 cifs_create_junction_fattr(&fattr, inode->i_sb);
407 rc = cifs_fattr_to_inode(inode, &fattr, false);
416 struct cifs_fattr *fattr,
442 cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb);
444 cifs_create_junction_fattr(fattr, sb);
451 cifs_fill_uniqueid(sb, fattr);
455 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
459 if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) {
464 &fattr->cf_symlink_target);
474 struct cifs_fattr fattr = {};
477 rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid);
481 rc = update_inode_info(sb, &fattr, pinode);
483 kfree(fattr.cf_symlink_target);
489 struct cifs_fattr *fattr,
505 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
522 fattr->cf_mode &= ~S_IFMT;
524 if (fattr->cf_eof == 0) {
525 fattr->cf_mode |= S_IFIFO;
526 fattr->cf_dtype = DT_FIFO;
528 } else if (fattr->cf_eof < 8) {
529 fattr->cf_mode |= S_IFREG;
530 fattr->cf_dtype = DT_REG;
572 fattr->cf_mode |= S_IFBLK;
573 fattr->cf_dtype = DT_BLK;
580 fattr->cf_rdev = MKDEV(mjr, mnr);
584 fattr->cf_mode |= S_IFCHR;
585 fattr->cf_dtype = DT_CHR;
592 fattr->cf_rdev = MKDEV(mjr, mnr);
596 fattr->cf_mode |= S_IFLNK;
597 fattr->cf_dtype = DT_LNK;
600 fattr->cf_mode |= S_IFIFO;
601 fattr->cf_dtype = DT_FIFO;
603 fattr->cf_mode |= S_IFREG; /* file? */
604 fattr->cf_dtype = DT_REG;
608 fattr->cf_mode |= S_IFREG; /* then it is a file */
609 fattr->cf_dtype = DT_REG;
625 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
653 fattr->cf_mode &= ~SFBITS_MASK;
655 mode, fattr->cf_mode);
656 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
667 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
677 memset(fattr, 0, sizeof(*fattr));
679 /* no fattr->flags to set */
680 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
681 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
684 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
686 ktime_get_coarse_real_ts64(&fattr->cf_atime);
688 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
689 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
692 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
693 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
696 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
697 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
698 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
700 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
701 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
703 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
706 fattr->cf_mode |= S_IFLNK;
707 fattr->cf_dtype = DT_LNK;
708 fattr->cf_symlink_target = data->symlink_target;
710 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
711 fattr->cf_mode |= S_IFDIR;
712 fattr->cf_dtype = DT_DIR;
714 fattr->cf_mode |= S_IFREG;
715 fattr->cf_dtype = DT_REG;
719 sid_to_id(cifs_sb, owner, fattr, SIDOWNER);
720 sid_to_id(cifs_sb, group, fattr, SIDGROUP);
723 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
734 struct cifs_fattr *fattr,
743 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
744 fattr->cf_dtype = DT_CHR;
745 fattr->cf_rdev = nfs_mkdev(buf);
748 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
749 fattr->cf_dtype = DT_BLK;
750 fattr->cf_rdev = nfs_mkdev(buf);
753 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
754 fattr->cf_dtype = DT_FIFO;
757 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
758 fattr->cf_dtype = DT_SOCK;
761 fattr->cf_mode = S_IFLNK | cifs_sb->ctx->file_mode;
762 fattr->cf_dtype = DT_LNK;
773 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
774 fattr->cf_dtype = DT_LNK;
777 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
778 fattr->cf_dtype = DT_FIFO;
781 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
782 fattr->cf_dtype = DT_SOCK;
785 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
786 fattr->cf_dtype = DT_CHR;
789 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
790 fattr->cf_dtype = DT_BLK;
795 fattr->cf_mode = S_IFLNK | cifs_sb->ctx->file_mode;
796 fattr->cf_dtype = DT_LNK;
804 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
812 memset(fattr, 0, sizeof(*fattr));
813 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
815 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
818 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
820 ktime_get_coarse_real_ts64(&fattr->cf_atime);
822 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
823 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
826 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
827 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
830 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
831 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
832 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
833 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
836 cifs_reparse_point_to_fattr(cifs_sb, fattr, data))
839 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
840 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
841 fattr->cf_dtype = DT_DIR;
847 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
849 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
850 fattr->cf_dtype = DT_REG;
853 if (fattr->cf_cifsattrs & ATTR_READONLY)
854 fattr->cf_mode &= ~(S_IWUGO);
860 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
863 fattr->cf_nlink);
864 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
869 if (S_ISLNK(fattr->cf_mode)) {
871 fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
872 fattr->cf_symlink_target = data->symlink_target;
876 fattr->cf_uid = cifs_sb->ctx->linux_uid;
877 fattr->cf_gid = cifs_sb->ctx->linux_gid;
886 struct cifs_fattr fattr;
905 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
908 cifs_create_junction_fattr(&fattr, inode->i_sb);
929 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
930 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
932 rc = cifs_fattr_to_inode(inode, &fattr, false);
1008 struct cifs_open_info_data *data, struct cifs_fattr *fattr)
1016 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1018 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1027 &fattr->cf_uniqueid, data);
1034 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1036 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1043 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
1047 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1050 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1051 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1066 struct cifs_fattr *fattr)
1093 cifs_create_junction_fattr(fattr, sb);
1106 cifs_open_info_to_fattr(fattr, data, sb);
1108 fattr->cf_cifstag = data->reparse.tag;
1116 struct cifs_fattr *fattr,
1146 * 2. Convert it to internal cifs metadata (fattr)
1158 full_path, fattr);
1160 cifs_open_info_to_fattr(fattr, data, sb);
1165 cifs_create_junction_fattr(fattr, sb);
1195 cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1196 fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1213 * 3. Get or update inode number (fattr->cf_uniqueid)
1216 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1219 * 4. Tweak fattr based on mount options
1225 if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1227 tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1234 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1244 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1257 cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1261 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1278 struct cifs_fattr fattr = {};
1286 rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1290 rc = update_inode_info(sb, &fattr, inode);
1292 kfree(fattr.cf_symlink_target);
1296 static int smb311_posix_get_fattr(struct cifs_fattr *fattr,
1323 * 2. Convert it to internal cifs metadata (fattr)
1328 smb311_posix_info_to_fattr(fattr, &data, &owner, &group, sb);
1332 cifs_create_junction_fattr(fattr, sb);
1349 * 3. Tweak fattr based on mount options
1353 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1366 struct cifs_fattr fattr = {};
1374 rc = smb311_posix_get_fattr(&fattr, full_path, sb, xid);
1378 rc = update_inode_info(sb, &fattr, inode);
1380 kfree(fattr.cf_symlink_target);
1391 struct cifs_fattr *fattr = opaque;
1394 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1398 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1402 if (inode_wrong_type(inode, fattr->cf_mode))
1407 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1415 struct cifs_fattr *fattr = opaque;
1417 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1418 CIFS_I(inode)->createtime = fattr->cf_createtime;
1445 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1451 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1454 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1456 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1459 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1460 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1465 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1471 cifs_fattr_to_inode(inode, fattr, false);
1488 struct cifs_fattr fattr = {};
1512 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1522 rc = smb311_posix_get_fattr(&fattr, path, sb, xid);
1524 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1528 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1529 fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1532 inode = cifs_iget(sb, &fattr);
1558 kfree(fattr.cf_symlink_target);
1987 struct cifs_fattr fattr;
2015 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
2016 cifs_fill_uniqueid(inode->i_sb, &fattr);
2017 newinode = cifs_iget(inode->i_sb, &fattr);