1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * linux/fs/stat.c 3 * linux/fs/stat.c 4 * 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 */ 6 */ 7 7 8 #include <linux/blkdev.h> << 9 #include <linux/export.h> 8 #include <linux/export.h> 10 #include <linux/mm.h> 9 #include <linux/mm.h> 11 #include <linux/errno.h> 10 #include <linux/errno.h> 12 #include <linux/file.h> 11 #include <linux/file.h> 13 #include <linux/highuid.h> 12 #include <linux/highuid.h> 14 #include <linux/fs.h> 13 #include <linux/fs.h> 15 #include <linux/namei.h> 14 #include <linux/namei.h> 16 #include <linux/security.h> 15 #include <linux/security.h> 17 #include <linux/cred.h> 16 #include <linux/cred.h> 18 #include <linux/syscalls.h> 17 #include <linux/syscalls.h> 19 #include <linux/pagemap.h> 18 #include <linux/pagemap.h> 20 #include <linux/compat.h> 19 #include <linux/compat.h> 21 #include <linux/iversion.h> << 22 20 23 #include <linux/uaccess.h> 21 #include <linux/uaccess.h> 24 #include <asm/unistd.h> 22 #include <asm/unistd.h> 25 23 26 #include "internal.h" 24 #include "internal.h" 27 #include "mount.h" << 28 25 29 /** 26 /** 30 * generic_fillattr - Fill in the basic attrib 27 * generic_fillattr - Fill in the basic attributes from the inode struct 31 * @idmap: idmap of the mount the !! 28 * @inode: Inode to use as the source 32 * @request_mask: statx request_mask !! 29 * @stat: Where to fill in the attributes 33 * @inode: Inode to use as the so << 34 * @stat: Where to fill in the a << 35 * 30 * 36 * Fill in the basic attributes in the kstat s 31 * Fill in the basic attributes in the kstat structure from data that's to be 37 * found on the VFS inode structure. This is 32 * found on the VFS inode structure. This is the default if no getattr inode 38 * operation is supplied. 33 * operation is supplied. 39 * << 40 * If the inode has been found through an idma << 41 * the vfsmount must be passed through @idmap. << 42 * take care to map the inode according to @id << 43 * uid and gid filds. On non-idmapped mounts o << 44 * performed on the raw inode simply pass @nop << 45 */ 34 */ 46 void generic_fillattr(struct mnt_idmap *idmap, !! 35 void generic_fillattr(struct inode *inode, struct kstat *stat) 47 struct inode *inode, str << 48 { 36 { 49 vfsuid_t vfsuid = i_uid_into_vfsuid(id << 50 vfsgid_t vfsgid = i_gid_into_vfsgid(id << 51 << 52 stat->dev = inode->i_sb->s_dev; 37 stat->dev = inode->i_sb->s_dev; 53 stat->ino = inode->i_ino; 38 stat->ino = inode->i_ino; 54 stat->mode = inode->i_mode; 39 stat->mode = inode->i_mode; 55 stat->nlink = inode->i_nlink; 40 stat->nlink = inode->i_nlink; 56 stat->uid = vfsuid_into_kuid(vfsuid); !! 41 stat->uid = inode->i_uid; 57 stat->gid = vfsgid_into_kgid(vfsgid); !! 42 stat->gid = inode->i_gid; 58 stat->rdev = inode->i_rdev; 43 stat->rdev = inode->i_rdev; 59 stat->size = i_size_read(inode); 44 stat->size = i_size_read(inode); 60 stat->atime = inode_get_atime(inode); !! 45 stat->atime = inode->i_atime; 61 stat->mtime = inode_get_mtime(inode); !! 46 stat->mtime = inode->i_mtime; 62 stat->ctime = inode_get_ctime(inode); !! 47 stat->ctime = inode->i_ctime; 63 stat->blksize = i_blocksize(inode); 48 stat->blksize = i_blocksize(inode); 64 stat->blocks = inode->i_blocks; 49 stat->blocks = inode->i_blocks; 65 << 66 if ((request_mask & STATX_CHANGE_COOKI << 67 stat->result_mask |= STATX_CHA << 68 stat->change_cookie = inode_qu << 69 } << 70 << 71 } 50 } 72 EXPORT_SYMBOL(generic_fillattr); 51 EXPORT_SYMBOL(generic_fillattr); 73 52 74 /** 53 /** 75 * generic_fill_statx_attr - Fill in the statx << 76 * @inode: Inode to use as the source << 77 * @stat: Where to fill in the attribute << 78 * << 79 * Fill in the STATX_ATTR_* flags in the kstat << 80 * inode that are published on i_flags and enf << 81 */ << 82 void generic_fill_statx_attr(struct inode *ino << 83 { << 84 if (inode->i_flags & S_IMMUTABLE) << 85 stat->attributes |= STATX_ATTR << 86 if (inode->i_flags & S_APPEND) << 87 stat->attributes |= STATX_ATTR << 88 stat->attributes_mask |= KSTAT_ATTR_VF << 89 } << 90 EXPORT_SYMBOL(generic_fill_statx_attr); << 91 << 92 /** << 93 * generic_fill_statx_atomic_writes - Fill in << 94 * @stat: Where to fill in the attribute << 95 * @unit_min: Minimum supported atomic write << 96 * @unit_max: Maximum supported atomic write << 97 * << 98 * Fill in the STATX{_ATTR}_WRITE_ATOMIC flags << 99 * atomic write unit_min and unit_max values. << 100 */ << 101 void generic_fill_statx_atomic_writes(struct k << 102 unsigned << 103 unsigned << 104 { << 105 /* Confirm that the request type is kn << 106 stat->result_mask |= STATX_WRITE_ATOMI << 107 << 108 /* Confirm that the file attribute typ << 109 stat->attributes_mask |= STATX_ATTR_WR << 110 << 111 if (unit_min) { << 112 stat->atomic_write_unit_min = << 113 stat->atomic_write_unit_max = << 114 /* Initially only allow 1x seg << 115 stat->atomic_write_segments_ma << 116 << 117 /* Confirm atomic writes are a << 118 stat->attributes |= STATX_ATTR << 119 } << 120 } << 121 EXPORT_SYMBOL_GPL(generic_fill_statx_atomic_wr << 122 << 123 /** << 124 * vfs_getattr_nosec - getattr without securit 54 * vfs_getattr_nosec - getattr without security checks 125 * @path: file to get attributes from 55 * @path: file to get attributes from 126 * @stat: structure to return attributes in 56 * @stat: structure to return attributes in 127 * @request_mask: STATX_xxx flags indicating w 57 * @request_mask: STATX_xxx flags indicating what the caller wants 128 * @query_flags: Query mode (AT_STATX_SYNC_TYP !! 58 * @query_flags: Query mode (KSTAT_QUERY_FLAGS) 129 * 59 * 130 * Get attributes without calling security_ino 60 * Get attributes without calling security_inode_getattr. 131 * 61 * 132 * Currently the only caller other than vfs_ge 62 * Currently the only caller other than vfs_getattr is internal to the 133 * filehandle lookup code, which uses only the 63 * filehandle lookup code, which uses only the inode number and returns no 134 * attributes to any user. Any other code pro 64 * attributes to any user. Any other code probably wants vfs_getattr. 135 */ 65 */ 136 int vfs_getattr_nosec(const struct path *path, 66 int vfs_getattr_nosec(const struct path *path, struct kstat *stat, 137 u32 request_mask, unsign 67 u32 request_mask, unsigned int query_flags) 138 { 68 { 139 struct mnt_idmap *idmap; << 140 struct inode *inode = d_backing_inode( 69 struct inode *inode = d_backing_inode(path->dentry); 141 70 142 memset(stat, 0, sizeof(*stat)); 71 memset(stat, 0, sizeof(*stat)); 143 stat->result_mask |= STATX_BASIC_STATS 72 stat->result_mask |= STATX_BASIC_STATS; 144 query_flags &= AT_STATX_SYNC_TYPE; !! 73 request_mask &= STATX_ALL; >> 74 query_flags &= KSTAT_QUERY_FLAGS; 145 75 146 /* allow the fs to override these if i 76 /* allow the fs to override these if it really wants to */ 147 /* SB_NOATIME means filesystem supplie !! 77 if (IS_NOATIME(inode)) 148 if (inode->i_sb->s_flags & SB_NOATIME) << 149 stat->result_mask &= ~STATX_AT 78 stat->result_mask &= ~STATX_ATIME; 150 << 151 /* << 152 * Note: If you add another clause to << 153 * update attributes_mask below. << 154 */ << 155 if (IS_AUTOMOUNT(inode)) 79 if (IS_AUTOMOUNT(inode)) 156 stat->attributes |= STATX_ATTR 80 stat->attributes |= STATX_ATTR_AUTOMOUNT; 157 81 158 if (IS_DAX(inode)) << 159 stat->attributes |= STATX_ATTR << 160 << 161 stat->attributes_mask |= (STATX_ATTR_A << 162 STATX_ATTR_D << 163 << 164 idmap = mnt_idmap(path->mnt); << 165 if (inode->i_op->getattr) 82 if (inode->i_op->getattr) 166 return inode->i_op->getattr(id !! 83 return inode->i_op->getattr(path, stat, request_mask, 167 re !! 84 query_flags); 168 qu << 169 85 170 generic_fillattr(idmap, request_mask, !! 86 generic_fillattr(inode, stat); 171 return 0; 87 return 0; 172 } 88 } 173 EXPORT_SYMBOL(vfs_getattr_nosec); 89 EXPORT_SYMBOL(vfs_getattr_nosec); 174 90 175 /* 91 /* 176 * vfs_getattr - Get the enhanced basic attrib 92 * vfs_getattr - Get the enhanced basic attributes of a file 177 * @path: The file of interest 93 * @path: The file of interest 178 * @stat: Where to return the statistics 94 * @stat: Where to return the statistics 179 * @request_mask: STATX_xxx flags indicating w 95 * @request_mask: STATX_xxx flags indicating what the caller wants 180 * @query_flags: Query mode (AT_STATX_SYNC_TYP !! 96 * @query_flags: Query mode (KSTAT_QUERY_FLAGS) 181 * 97 * 182 * Ask the filesystem for a file's attributes. 98 * Ask the filesystem for a file's attributes. The caller must indicate in 183 * request_mask and query_flags to indicate wh 99 * request_mask and query_flags to indicate what they want. 184 * 100 * 185 * If the file is remote, the filesystem can b 101 * If the file is remote, the filesystem can be forced to update the attributes 186 * from the backing store by passing AT_STATX_ 102 * from the backing store by passing AT_STATX_FORCE_SYNC in query_flags or can 187 * suppress the update by passing AT_STATX_DON 103 * suppress the update by passing AT_STATX_DONT_SYNC. 188 * 104 * 189 * Bits must have been set in request_mask to 105 * Bits must have been set in request_mask to indicate which attributes the 190 * caller wants retrieving. Any such attribut 106 * caller wants retrieving. Any such attribute not requested may be returned 191 * anyway, but the value may be approximate, a 107 * anyway, but the value may be approximate, and, if remote, may not have been 192 * synchronised with the server. 108 * synchronised with the server. 193 * 109 * 194 * 0 will be returned on success, and a -ve er 110 * 0 will be returned on success, and a -ve error code if unsuccessful. 195 */ 111 */ 196 int vfs_getattr(const struct path *path, struc 112 int vfs_getattr(const struct path *path, struct kstat *stat, 197 u32 request_mask, unsigned int 113 u32 request_mask, unsigned int query_flags) 198 { 114 { 199 int retval; 115 int retval; 200 116 201 if (WARN_ON_ONCE(query_flags & AT_GETA << 202 return -EPERM; << 203 << 204 retval = security_inode_getattr(path); 117 retval = security_inode_getattr(path); 205 if (retval) 118 if (retval) 206 return retval; 119 return retval; 207 return vfs_getattr_nosec(path, stat, r 120 return vfs_getattr_nosec(path, stat, request_mask, query_flags); 208 } 121 } 209 EXPORT_SYMBOL(vfs_getattr); 122 EXPORT_SYMBOL(vfs_getattr); 210 123 211 /** 124 /** 212 * vfs_fstat - Get the basic attributes by fil !! 125 * vfs_statx_fd - Get the enhanced basic attributes by file descriptor 213 * @fd: The file descriptor referring to the f 126 * @fd: The file descriptor referring to the file of interest 214 * @stat: The result structure to fill in. 127 * @stat: The result structure to fill in. >> 128 * @request_mask: STATX_xxx flags indicating what the caller wants >> 129 * @query_flags: Query mode (KSTAT_QUERY_FLAGS) 215 * 130 * 216 * This function is a wrapper around vfs_getat 131 * This function is a wrapper around vfs_getattr(). The main difference is 217 * that it uses a file descriptor to determine 132 * that it uses a file descriptor to determine the file location. 218 * 133 * 219 * 0 will be returned on success, and a -ve er 134 * 0 will be returned on success, and a -ve error code if unsuccessful. 220 */ 135 */ 221 int vfs_fstat(int fd, struct kstat *stat) !! 136 int vfs_statx_fd(unsigned int fd, struct kstat *stat, >> 137 u32 request_mask, unsigned int query_flags) 222 { 138 { 223 struct fd f; 139 struct fd f; 224 int error; !! 140 int error = -EBADF; >> 141 >> 142 if (query_flags & ~KSTAT_QUERY_FLAGS) >> 143 return -EINVAL; 225 144 226 f = fdget_raw(fd); 145 f = fdget_raw(fd); 227 if (!f.file) !! 146 if (f.file) { 228 return -EBADF; !! 147 error = vfs_getattr(&f.file->f_path, stat, 229 error = vfs_getattr(&f.file->f_path, s !! 148 request_mask, query_flags); 230 fdput(f); !! 149 fdput(f); >> 150 } 231 return error; 151 return error; 232 } 152 } >> 153 EXPORT_SYMBOL(vfs_statx_fd); 233 154 234 int getname_statx_lookup_flags(int flags) !! 155 inline unsigned vfs_stat_set_lookup_flags(unsigned *lookup_flags, int flags) 235 { 156 { 236 int lookup_flags = 0; !! 157 if ((flags & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT | >> 158 AT_EMPTY_PATH | KSTAT_QUERY_FLAGS)) != 0) >> 159 return -EINVAL; 237 160 238 if (!(flags & AT_SYMLINK_NOFOLLOW)) !! 161 *lookup_flags = LOOKUP_FOLLOW | LOOKUP_AUTOMOUNT; 239 lookup_flags |= LOOKUP_FOLLOW; !! 162 if (flags & AT_SYMLINK_NOFOLLOW) 240 if (!(flags & AT_NO_AUTOMOUNT)) !! 163 *lookup_flags &= ~LOOKUP_FOLLOW; 241 lookup_flags |= LOOKUP_AUTOMOU !! 164 if (flags & AT_NO_AUTOMOUNT) >> 165 *lookup_flags &= ~LOOKUP_AUTOMOUNT; 242 if (flags & AT_EMPTY_PATH) 166 if (flags & AT_EMPTY_PATH) 243 lookup_flags |= LOOKUP_EMPTY; !! 167 *lookup_flags |= LOOKUP_EMPTY; 244 168 245 return lookup_flags; !! 169 return 0; 246 } << 247 << 248 static int vfs_statx_path(struct path *path, i << 249 u32 request_mask) << 250 { << 251 int error = vfs_getattr(path, stat, re << 252 << 253 if (request_mask & STATX_MNT_ID_UNIQUE << 254 stat->mnt_id = real_mount(path << 255 stat->result_mask |= STATX_MNT << 256 } else { << 257 stat->mnt_id = real_mount(path << 258 stat->result_mask |= STATX_MNT << 259 } << 260 << 261 if (path_mounted(path)) << 262 stat->attributes |= STATX_ATTR << 263 stat->attributes_mask |= STATX_ATTR_MO << 264 << 265 /* << 266 * If this is a block device inode, ov << 267 * attributes with the block device sp << 268 * obtained from the bdev backing inod << 269 */ << 270 if (S_ISBLK(stat->mode)) << 271 bdev_statx(path, stat, request << 272 << 273 return error; << 274 } << 275 << 276 static int vfs_statx_fd(int fd, int flags, str << 277 u32 request_mask) << 278 { << 279 CLASS(fd_raw, f)(fd); << 280 if (!f.file) << 281 return -EBADF; << 282 return vfs_statx_path(&f.file->f_path, << 283 } 170 } 284 171 285 /** 172 /** 286 * vfs_statx - Get basic and extra attributes 173 * vfs_statx - Get basic and extra attributes by filename 287 * @dfd: A file descriptor representing the ba 174 * @dfd: A file descriptor representing the base dir for a relative filename 288 * @filename: The name of the file of interest 175 * @filename: The name of the file of interest 289 * @flags: Flags to control the query 176 * @flags: Flags to control the query 290 * @stat: The result structure to fill in. 177 * @stat: The result structure to fill in. 291 * @request_mask: STATX_xxx flags indicating w 178 * @request_mask: STATX_xxx flags indicating what the caller wants 292 * 179 * 293 * This function is a wrapper around vfs_getat 180 * This function is a wrapper around vfs_getattr(). The main difference is 294 * that it uses a filename and base directory 181 * that it uses a filename and base directory to determine the file location. 295 * Additionally, the use of AT_SYMLINK_NOFOLLO 182 * Additionally, the use of AT_SYMLINK_NOFOLLOW in flags will prevent a symlink 296 * at the given name from being referenced. 183 * at the given name from being referenced. 297 * 184 * 298 * 0 will be returned on success, and a -ve er 185 * 0 will be returned on success, and a -ve error code if unsuccessful. 299 */ 186 */ 300 static int vfs_statx(int dfd, struct filename !! 187 int vfs_statx(int dfd, const char __user *filename, int flags, 301 struct kstat *stat, u32 request_ 188 struct kstat *stat, u32 request_mask) 302 { 189 { 303 struct path path; 190 struct path path; 304 unsigned int lookup_flags = getname_st !! 191 int error = -EINVAL; 305 int error; !! 192 unsigned lookup_flags; 306 193 307 if (flags & ~(AT_SYMLINK_NOFOLLOW | AT !! 194 if (vfs_stat_set_lookup_flags(&lookup_flags, flags)) 308 AT_STATX_SYNC_TYPE)) << 309 return -EINVAL; 195 return -EINVAL; 310 << 311 retry: 196 retry: 312 error = filename_lookup(dfd, filename, !! 197 error = user_path_at(dfd, filename, lookup_flags, &path); 313 if (error) 198 if (error) 314 return error; !! 199 goto out; 315 error = vfs_statx_path(&path, flags, s !! 200 >> 201 error = vfs_getattr(&path, stat, request_mask, flags); 316 path_put(&path); 202 path_put(&path); 317 if (retry_estale(error, lookup_flags)) 203 if (retry_estale(error, lookup_flags)) { 318 lookup_flags |= LOOKUP_REVAL; 204 lookup_flags |= LOOKUP_REVAL; 319 goto retry; 205 goto retry; 320 } 206 } >> 207 out: 321 return error; 208 return error; 322 } 209 } >> 210 EXPORT_SYMBOL(vfs_statx); 323 211 324 int vfs_fstatat(int dfd, const char __user *fi << 325 struct kstat *st << 326 { << 327 int ret; << 328 int statx_flags = flags | AT_NO_AUTOMO << 329 struct filename *name; << 330 << 331 /* << 332 * Work around glibc turning fstat() i << 333 * << 334 * If AT_EMPTY_PATH is set, we expect << 335 * empty path, and avoid doing all the << 336 */ << 337 if (flags == AT_EMPTY_PATH && vfs_empt << 338 return vfs_fstat(dfd, stat); << 339 << 340 name = getname_flags(filename, getname << 341 ret = vfs_statx(dfd, name, statx_flags << 342 putname(name); << 343 << 344 return ret; << 345 } << 346 212 347 #ifdef __ARCH_WANT_OLD_STAT 213 #ifdef __ARCH_WANT_OLD_STAT 348 214 349 /* 215 /* 350 * For backward compatibility? Maybe this sho 216 * For backward compatibility? Maybe this should be moved 351 * into arch/i386 instead? 217 * into arch/i386 instead? 352 */ 218 */ 353 static int cp_old_stat(struct kstat *stat, str 219 static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * statbuf) 354 { 220 { 355 static int warncount = 5; 221 static int warncount = 5; 356 struct __old_kernel_stat tmp; 222 struct __old_kernel_stat tmp; 357 223 358 if (warncount > 0) { 224 if (warncount > 0) { 359 warncount--; 225 warncount--; 360 printk(KERN_WARNING "VFS: Warn 226 printk(KERN_WARNING "VFS: Warning: %s using old stat() call. Recompile your binary.\n", 361 current->comm); 227 current->comm); 362 } else if (warncount < 0) { 228 } else if (warncount < 0) { 363 /* it's laughable, but... */ 229 /* it's laughable, but... */ 364 warncount = 0; 230 warncount = 0; 365 } 231 } 366 232 367 memset(&tmp, 0, sizeof(struct __old_ke 233 memset(&tmp, 0, sizeof(struct __old_kernel_stat)); 368 tmp.st_dev = old_encode_dev(stat->dev) 234 tmp.st_dev = old_encode_dev(stat->dev); 369 tmp.st_ino = stat->ino; 235 tmp.st_ino = stat->ino; 370 if (sizeof(tmp.st_ino) < sizeof(stat-> 236 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 371 return -EOVERFLOW; 237 return -EOVERFLOW; 372 tmp.st_mode = stat->mode; 238 tmp.st_mode = stat->mode; 373 tmp.st_nlink = stat->nlink; 239 tmp.st_nlink = stat->nlink; 374 if (tmp.st_nlink != stat->nlink) 240 if (tmp.st_nlink != stat->nlink) 375 return -EOVERFLOW; 241 return -EOVERFLOW; 376 SET_UID(tmp.st_uid, from_kuid_munged(c 242 SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); 377 SET_GID(tmp.st_gid, from_kgid_munged(c 243 SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); 378 tmp.st_rdev = old_encode_dev(stat->rde 244 tmp.st_rdev = old_encode_dev(stat->rdev); 379 #if BITS_PER_LONG == 32 245 #if BITS_PER_LONG == 32 380 if (stat->size > MAX_NON_LFS) 246 if (stat->size > MAX_NON_LFS) 381 return -EOVERFLOW; 247 return -EOVERFLOW; 382 #endif 248 #endif 383 tmp.st_size = stat->size; 249 tmp.st_size = stat->size; 384 tmp.st_atime = stat->atime.tv_sec; 250 tmp.st_atime = stat->atime.tv_sec; 385 tmp.st_mtime = stat->mtime.tv_sec; 251 tmp.st_mtime = stat->mtime.tv_sec; 386 tmp.st_ctime = stat->ctime.tv_sec; 252 tmp.st_ctime = stat->ctime.tv_sec; 387 return copy_to_user(statbuf,&tmp,sizeo 253 return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 388 } 254 } 389 255 390 SYSCALL_DEFINE2(stat, const char __user *, fil 256 SYSCALL_DEFINE2(stat, const char __user *, filename, 391 struct __old_kernel_stat __use 257 struct __old_kernel_stat __user *, statbuf) 392 { 258 { 393 struct kstat stat; 259 struct kstat stat; 394 int error; 260 int error; 395 261 396 error = vfs_stat(filename, &stat); 262 error = vfs_stat(filename, &stat); 397 if (error) 263 if (error) 398 return error; 264 return error; 399 265 400 return cp_old_stat(&stat, statbuf); 266 return cp_old_stat(&stat, statbuf); 401 } 267 } 402 268 403 SYSCALL_DEFINE2(lstat, const char __user *, fi 269 SYSCALL_DEFINE2(lstat, const char __user *, filename, 404 struct __old_kernel_stat __use 270 struct __old_kernel_stat __user *, statbuf) 405 { 271 { 406 struct kstat stat; 272 struct kstat stat; 407 int error; 273 int error; 408 274 409 error = vfs_lstat(filename, &stat); 275 error = vfs_lstat(filename, &stat); 410 if (error) 276 if (error) 411 return error; 277 return error; 412 278 413 return cp_old_stat(&stat, statbuf); 279 return cp_old_stat(&stat, statbuf); 414 } 280 } 415 281 416 SYSCALL_DEFINE2(fstat, unsigned int, fd, struc 282 SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, statbuf) 417 { 283 { 418 struct kstat stat; 284 struct kstat stat; 419 int error = vfs_fstat(fd, &stat); 285 int error = vfs_fstat(fd, &stat); 420 286 421 if (!error) 287 if (!error) 422 error = cp_old_stat(&stat, sta 288 error = cp_old_stat(&stat, statbuf); 423 289 424 return error; 290 return error; 425 } 291 } 426 292 427 #endif /* __ARCH_WANT_OLD_STAT */ 293 #endif /* __ARCH_WANT_OLD_STAT */ 428 294 429 #ifdef __ARCH_WANT_NEW_STAT 295 #ifdef __ARCH_WANT_NEW_STAT 430 296 >> 297 #if BITS_PER_LONG == 32 >> 298 # define choose_32_64(a,b) a >> 299 #else >> 300 # define choose_32_64(a,b) b >> 301 #endif >> 302 >> 303 #define valid_dev(x) choose_32_64(old_valid_dev(x),true) >> 304 #define encode_dev(x) choose_32_64(old_encode_dev,new_encode_dev)(x) >> 305 431 #ifndef INIT_STRUCT_STAT_PADDING 306 #ifndef INIT_STRUCT_STAT_PADDING 432 # define INIT_STRUCT_STAT_PADDING(st) memset( 307 # define INIT_STRUCT_STAT_PADDING(st) memset(&st, 0, sizeof(st)) 433 #endif 308 #endif 434 309 435 static int cp_new_stat(struct kstat *stat, str 310 static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) 436 { 311 { 437 struct stat tmp; 312 struct stat tmp; 438 313 439 if (sizeof(tmp.st_dev) < 4 && !old_val !! 314 if (!valid_dev(stat->dev) || !valid_dev(stat->rdev)) 440 return -EOVERFLOW; << 441 if (sizeof(tmp.st_rdev) < 4 && !old_va << 442 return -EOVERFLOW; 315 return -EOVERFLOW; 443 #if BITS_PER_LONG == 32 316 #if BITS_PER_LONG == 32 444 if (stat->size > MAX_NON_LFS) 317 if (stat->size > MAX_NON_LFS) 445 return -EOVERFLOW; 318 return -EOVERFLOW; 446 #endif 319 #endif 447 320 448 INIT_STRUCT_STAT_PADDING(tmp); 321 INIT_STRUCT_STAT_PADDING(tmp); 449 tmp.st_dev = new_encode_dev(stat->dev) !! 322 tmp.st_dev = encode_dev(stat->dev); 450 tmp.st_ino = stat->ino; 323 tmp.st_ino = stat->ino; 451 if (sizeof(tmp.st_ino) < sizeof(stat-> 324 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 452 return -EOVERFLOW; 325 return -EOVERFLOW; 453 tmp.st_mode = stat->mode; 326 tmp.st_mode = stat->mode; 454 tmp.st_nlink = stat->nlink; 327 tmp.st_nlink = stat->nlink; 455 if (tmp.st_nlink != stat->nlink) 328 if (tmp.st_nlink != stat->nlink) 456 return -EOVERFLOW; 329 return -EOVERFLOW; 457 SET_UID(tmp.st_uid, from_kuid_munged(c 330 SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); 458 SET_GID(tmp.st_gid, from_kgid_munged(c 331 SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); 459 tmp.st_rdev = new_encode_dev(stat->rde !! 332 tmp.st_rdev = encode_dev(stat->rdev); 460 tmp.st_size = stat->size; 333 tmp.st_size = stat->size; 461 tmp.st_atime = stat->atime.tv_sec; 334 tmp.st_atime = stat->atime.tv_sec; 462 tmp.st_mtime = stat->mtime.tv_sec; 335 tmp.st_mtime = stat->mtime.tv_sec; 463 tmp.st_ctime = stat->ctime.tv_sec; 336 tmp.st_ctime = stat->ctime.tv_sec; 464 #ifdef STAT_HAVE_NSEC 337 #ifdef STAT_HAVE_NSEC 465 tmp.st_atime_nsec = stat->atime.tv_nse 338 tmp.st_atime_nsec = stat->atime.tv_nsec; 466 tmp.st_mtime_nsec = stat->mtime.tv_nse 339 tmp.st_mtime_nsec = stat->mtime.tv_nsec; 467 tmp.st_ctime_nsec = stat->ctime.tv_nse 340 tmp.st_ctime_nsec = stat->ctime.tv_nsec; 468 #endif 341 #endif 469 tmp.st_blocks = stat->blocks; 342 tmp.st_blocks = stat->blocks; 470 tmp.st_blksize = stat->blksize; 343 tmp.st_blksize = stat->blksize; 471 return copy_to_user(statbuf,&tmp,sizeo 344 return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 472 } 345 } 473 346 474 SYSCALL_DEFINE2(newstat, const char __user *, 347 SYSCALL_DEFINE2(newstat, const char __user *, filename, 475 struct stat __user *, statbuf) 348 struct stat __user *, statbuf) 476 { 349 { 477 struct kstat stat; 350 struct kstat stat; 478 int error = vfs_stat(filename, &stat); 351 int error = vfs_stat(filename, &stat); 479 352 480 if (error) 353 if (error) 481 return error; 354 return error; 482 return cp_new_stat(&stat, statbuf); 355 return cp_new_stat(&stat, statbuf); 483 } 356 } 484 357 485 SYSCALL_DEFINE2(newlstat, const char __user *, 358 SYSCALL_DEFINE2(newlstat, const char __user *, filename, 486 struct stat __user *, statbuf) 359 struct stat __user *, statbuf) 487 { 360 { 488 struct kstat stat; 361 struct kstat stat; 489 int error; 362 int error; 490 363 491 error = vfs_lstat(filename, &stat); 364 error = vfs_lstat(filename, &stat); 492 if (error) 365 if (error) 493 return error; 366 return error; 494 367 495 return cp_new_stat(&stat, statbuf); 368 return cp_new_stat(&stat, statbuf); 496 } 369 } 497 370 498 #if !defined(__ARCH_WANT_STAT64) || defined(__ 371 #if !defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_SYS_NEWFSTATAT) 499 SYSCALL_DEFINE4(newfstatat, int, dfd, const ch 372 SYSCALL_DEFINE4(newfstatat, int, dfd, const char __user *, filename, 500 struct stat __user *, statbuf, 373 struct stat __user *, statbuf, int, flag) 501 { 374 { 502 struct kstat stat; 375 struct kstat stat; 503 int error; 376 int error; 504 377 505 error = vfs_fstatat(dfd, filename, &st 378 error = vfs_fstatat(dfd, filename, &stat, flag); 506 if (error) 379 if (error) 507 return error; 380 return error; 508 return cp_new_stat(&stat, statbuf); 381 return cp_new_stat(&stat, statbuf); 509 } 382 } 510 #endif 383 #endif 511 384 512 SYSCALL_DEFINE2(newfstat, unsigned int, fd, st 385 SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf) 513 { 386 { 514 struct kstat stat; 387 struct kstat stat; 515 int error = vfs_fstat(fd, &stat); 388 int error = vfs_fstat(fd, &stat); 516 389 517 if (!error) 390 if (!error) 518 error = cp_new_stat(&stat, sta 391 error = cp_new_stat(&stat, statbuf); 519 392 520 return error; 393 return error; 521 } 394 } 522 #endif 395 #endif 523 396 524 static int do_readlinkat(int dfd, const char _ 397 static int do_readlinkat(int dfd, const char __user *pathname, 525 char __user *buf, int 398 char __user *buf, int bufsiz) 526 { 399 { 527 struct path path; 400 struct path path; 528 struct filename *name; << 529 int error; 401 int error; >> 402 int empty = 0; 530 unsigned int lookup_flags = LOOKUP_EMP 403 unsigned int lookup_flags = LOOKUP_EMPTY; 531 404 532 if (bufsiz <= 0) 405 if (bufsiz <= 0) 533 return -EINVAL; 406 return -EINVAL; 534 407 535 retry: 408 retry: 536 name = getname_flags(pathname, lookup_ !! 409 error = user_path_at_empty(dfd, pathname, lookup_flags, &path, &empty); 537 error = filename_lookup(dfd, name, loo !! 410 if (!error) { 538 if (unlikely(error)) { !! 411 struct inode *inode = d_backing_inode(path.dentry); 539 putname(name); !! 412 540 return error; !! 413 error = empty ? -ENOENT : -EINVAL; 541 } !! 414 /* 542 !! 415 * AFS mountpoints allow readlink(2) but are not symlinks 543 /* !! 416 */ 544 * AFS mountpoints allow readlink(2) b !! 417 if (d_is_symlink(path.dentry) || inode->i_op->readlink) { 545 */ !! 418 error = security_inode_readlink(path.dentry); 546 if (d_is_symlink(path.dentry) || !! 419 if (!error) { 547 d_backing_inode(path.dentry)->i_op !! 420 touch_atime(&path); 548 error = security_inode_readlin !! 421 error = vfs_readlink(path.dentry, buf, bufsiz); 549 if (!error) { !! 422 } 550 touch_atime(&path); !! 423 } 551 error = vfs_readlink(p !! 424 path_put(&path); >> 425 if (retry_estale(error, lookup_flags)) { >> 426 lookup_flags |= LOOKUP_REVAL; >> 427 goto retry; 552 } 428 } 553 } else { << 554 error = (name->name[0] == '\0' << 555 } << 556 path_put(&path); << 557 putname(name); << 558 if (retry_estale(error, lookup_flags)) << 559 lookup_flags |= LOOKUP_REVAL; << 560 goto retry; << 561 } 429 } 562 return error; 430 return error; 563 } 431 } 564 432 565 SYSCALL_DEFINE4(readlinkat, int, dfd, const ch 433 SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname, 566 char __user *, buf, int, bufsi 434 char __user *, buf, int, bufsiz) 567 { 435 { 568 return do_readlinkat(dfd, pathname, bu 436 return do_readlinkat(dfd, pathname, buf, bufsiz); 569 } 437 } 570 438 571 SYSCALL_DEFINE3(readlink, const char __user *, 439 SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf, 572 int, bufsiz) 440 int, bufsiz) 573 { 441 { 574 return do_readlinkat(AT_FDCWD, path, b 442 return do_readlinkat(AT_FDCWD, path, buf, bufsiz); 575 } 443 } 576 444 577 445 578 /* ---------- LFS-64 ----------- */ 446 /* ---------- LFS-64 ----------- */ 579 #if defined(__ARCH_WANT_STAT64) || defined(__A 447 #if defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_COMPAT_STAT64) 580 448 581 #ifndef INIT_STRUCT_STAT64_PADDING 449 #ifndef INIT_STRUCT_STAT64_PADDING 582 # define INIT_STRUCT_STAT64_PADDING(st) memse 450 # define INIT_STRUCT_STAT64_PADDING(st) memset(&st, 0, sizeof(st)) 583 #endif 451 #endif 584 452 585 static long cp_new_stat64(struct kstat *stat, 453 static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf) 586 { 454 { 587 struct stat64 tmp; 455 struct stat64 tmp; 588 456 589 INIT_STRUCT_STAT64_PADDING(tmp); 457 INIT_STRUCT_STAT64_PADDING(tmp); 590 #ifdef CONFIG_MIPS 458 #ifdef CONFIG_MIPS 591 /* mips has weird padding, so we don't 459 /* mips has weird padding, so we don't get 64 bits there */ 592 tmp.st_dev = new_encode_dev(stat->dev) 460 tmp.st_dev = new_encode_dev(stat->dev); 593 tmp.st_rdev = new_encode_dev(stat->rde 461 tmp.st_rdev = new_encode_dev(stat->rdev); 594 #else 462 #else 595 tmp.st_dev = huge_encode_dev(stat->dev 463 tmp.st_dev = huge_encode_dev(stat->dev); 596 tmp.st_rdev = huge_encode_dev(stat->rd 464 tmp.st_rdev = huge_encode_dev(stat->rdev); 597 #endif 465 #endif 598 tmp.st_ino = stat->ino; 466 tmp.st_ino = stat->ino; 599 if (sizeof(tmp.st_ino) < sizeof(stat-> 467 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 600 return -EOVERFLOW; 468 return -EOVERFLOW; 601 #ifdef STAT64_HAS_BROKEN_ST_INO 469 #ifdef STAT64_HAS_BROKEN_ST_INO 602 tmp.__st_ino = stat->ino; 470 tmp.__st_ino = stat->ino; 603 #endif 471 #endif 604 tmp.st_mode = stat->mode; 472 tmp.st_mode = stat->mode; 605 tmp.st_nlink = stat->nlink; 473 tmp.st_nlink = stat->nlink; 606 tmp.st_uid = from_kuid_munged(current_ 474 tmp.st_uid = from_kuid_munged(current_user_ns(), stat->uid); 607 tmp.st_gid = from_kgid_munged(current_ 475 tmp.st_gid = from_kgid_munged(current_user_ns(), stat->gid); 608 tmp.st_atime = stat->atime.tv_sec; 476 tmp.st_atime = stat->atime.tv_sec; 609 tmp.st_atime_nsec = stat->atime.tv_nse 477 tmp.st_atime_nsec = stat->atime.tv_nsec; 610 tmp.st_mtime = stat->mtime.tv_sec; 478 tmp.st_mtime = stat->mtime.tv_sec; 611 tmp.st_mtime_nsec = stat->mtime.tv_nse 479 tmp.st_mtime_nsec = stat->mtime.tv_nsec; 612 tmp.st_ctime = stat->ctime.tv_sec; 480 tmp.st_ctime = stat->ctime.tv_sec; 613 tmp.st_ctime_nsec = stat->ctime.tv_nse 481 tmp.st_ctime_nsec = stat->ctime.tv_nsec; 614 tmp.st_size = stat->size; 482 tmp.st_size = stat->size; 615 tmp.st_blocks = stat->blocks; 483 tmp.st_blocks = stat->blocks; 616 tmp.st_blksize = stat->blksize; 484 tmp.st_blksize = stat->blksize; 617 return copy_to_user(statbuf,&tmp,sizeo 485 return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 618 } 486 } 619 487 620 SYSCALL_DEFINE2(stat64, const char __user *, f 488 SYSCALL_DEFINE2(stat64, const char __user *, filename, 621 struct stat64 __user *, statbu 489 struct stat64 __user *, statbuf) 622 { 490 { 623 struct kstat stat; 491 struct kstat stat; 624 int error = vfs_stat(filename, &stat); 492 int error = vfs_stat(filename, &stat); 625 493 626 if (!error) 494 if (!error) 627 error = cp_new_stat64(&stat, s 495 error = cp_new_stat64(&stat, statbuf); 628 496 629 return error; 497 return error; 630 } 498 } 631 499 632 SYSCALL_DEFINE2(lstat64, const char __user *, 500 SYSCALL_DEFINE2(lstat64, const char __user *, filename, 633 struct stat64 __user *, statbu 501 struct stat64 __user *, statbuf) 634 { 502 { 635 struct kstat stat; 503 struct kstat stat; 636 int error = vfs_lstat(filename, &stat) 504 int error = vfs_lstat(filename, &stat); 637 505 638 if (!error) 506 if (!error) 639 error = cp_new_stat64(&stat, s 507 error = cp_new_stat64(&stat, statbuf); 640 508 641 return error; 509 return error; 642 } 510 } 643 511 644 SYSCALL_DEFINE2(fstat64, unsigned long, fd, st 512 SYSCALL_DEFINE2(fstat64, unsigned long, fd, struct stat64 __user *, statbuf) 645 { 513 { 646 struct kstat stat; 514 struct kstat stat; 647 int error = vfs_fstat(fd, &stat); 515 int error = vfs_fstat(fd, &stat); 648 516 649 if (!error) 517 if (!error) 650 error = cp_new_stat64(&stat, s 518 error = cp_new_stat64(&stat, statbuf); 651 519 652 return error; 520 return error; 653 } 521 } 654 522 655 SYSCALL_DEFINE4(fstatat64, int, dfd, const cha 523 SYSCALL_DEFINE4(fstatat64, int, dfd, const char __user *, filename, 656 struct stat64 __user *, statbu 524 struct stat64 __user *, statbuf, int, flag) 657 { 525 { 658 struct kstat stat; 526 struct kstat stat; 659 int error; 527 int error; 660 528 661 error = vfs_fstatat(dfd, filename, &st 529 error = vfs_fstatat(dfd, filename, &stat, flag); 662 if (error) 530 if (error) 663 return error; 531 return error; 664 return cp_new_stat64(&stat, statbuf); 532 return cp_new_stat64(&stat, statbuf); 665 } 533 } 666 #endif /* __ARCH_WANT_STAT64 || __ARCH_WANT_CO 534 #endif /* __ARCH_WANT_STAT64 || __ARCH_WANT_COMPAT_STAT64 */ 667 535 668 static noinline_for_stack int !! 536 noinline_for_stack int 669 cp_statx(const struct kstat *stat, struct stat 537 cp_statx(const struct kstat *stat, struct statx __user *buffer) 670 { 538 { 671 struct statx tmp; 539 struct statx tmp; 672 540 673 memset(&tmp, 0, sizeof(tmp)); 541 memset(&tmp, 0, sizeof(tmp)); 674 542 675 /* STATX_CHANGE_COOKIE is kernel-only !! 543 tmp.stx_mask = stat->result_mask; 676 tmp.stx_mask = stat->result_mask & ~ST << 677 tmp.stx_blksize = stat->blksize; 544 tmp.stx_blksize = stat->blksize; 678 /* STATX_ATTR_CHANGE_MONOTONIC is kern !! 545 tmp.stx_attributes = stat->attributes; 679 tmp.stx_attributes = stat->attributes << 680 tmp.stx_nlink = stat->nlink; 546 tmp.stx_nlink = stat->nlink; 681 tmp.stx_uid = from_kuid_munged(current 547 tmp.stx_uid = from_kuid_munged(current_user_ns(), stat->uid); 682 tmp.stx_gid = from_kgid_munged(current 548 tmp.stx_gid = from_kgid_munged(current_user_ns(), stat->gid); 683 tmp.stx_mode = stat->mode; 549 tmp.stx_mode = stat->mode; 684 tmp.stx_ino = stat->ino; 550 tmp.stx_ino = stat->ino; 685 tmp.stx_size = stat->size; 551 tmp.stx_size = stat->size; 686 tmp.stx_blocks = stat->blocks; 552 tmp.stx_blocks = stat->blocks; 687 tmp.stx_attributes_mask = stat->attrib 553 tmp.stx_attributes_mask = stat->attributes_mask; 688 tmp.stx_atime.tv_sec = stat->atime.tv_ 554 tmp.stx_atime.tv_sec = stat->atime.tv_sec; 689 tmp.stx_atime.tv_nsec = stat->atime.tv 555 tmp.stx_atime.tv_nsec = stat->atime.tv_nsec; 690 tmp.stx_btime.tv_sec = stat->btime.tv_ 556 tmp.stx_btime.tv_sec = stat->btime.tv_sec; 691 tmp.stx_btime.tv_nsec = stat->btime.tv 557 tmp.stx_btime.tv_nsec = stat->btime.tv_nsec; 692 tmp.stx_ctime.tv_sec = stat->ctime.tv_ 558 tmp.stx_ctime.tv_sec = stat->ctime.tv_sec; 693 tmp.stx_ctime.tv_nsec = stat->ctime.tv 559 tmp.stx_ctime.tv_nsec = stat->ctime.tv_nsec; 694 tmp.stx_mtime.tv_sec = stat->mtime.tv_ 560 tmp.stx_mtime.tv_sec = stat->mtime.tv_sec; 695 tmp.stx_mtime.tv_nsec = stat->mtime.tv 561 tmp.stx_mtime.tv_nsec = stat->mtime.tv_nsec; 696 tmp.stx_rdev_major = MAJOR(stat->rdev) 562 tmp.stx_rdev_major = MAJOR(stat->rdev); 697 tmp.stx_rdev_minor = MINOR(stat->rdev) 563 tmp.stx_rdev_minor = MINOR(stat->rdev); 698 tmp.stx_dev_major = MAJOR(stat->dev); 564 tmp.stx_dev_major = MAJOR(stat->dev); 699 tmp.stx_dev_minor = MINOR(stat->dev); 565 tmp.stx_dev_minor = MINOR(stat->dev); 700 tmp.stx_mnt_id = stat->mnt_id; << 701 tmp.stx_dio_mem_align = stat->dio_mem_ << 702 tmp.stx_dio_offset_align = stat->dio_o << 703 tmp.stx_subvol = stat->subvol; << 704 tmp.stx_atomic_write_unit_min = stat-> << 705 tmp.stx_atomic_write_unit_max = stat-> << 706 tmp.stx_atomic_write_segments_max = st << 707 566 708 return copy_to_user(buffer, &tmp, size 567 return copy_to_user(buffer, &tmp, sizeof(tmp)) ? -EFAULT : 0; 709 } 568 } 710 569 711 int do_statx(int dfd, struct filename *filenam << 712 unsigned int mask, struct statx _ << 713 { << 714 struct kstat stat; << 715 int error; << 716 << 717 if (mask & STATX__RESERVED) << 718 return -EINVAL; << 719 if ((flags & AT_STATX_SYNC_TYPE) == AT << 720 return -EINVAL; << 721 << 722 /* << 723 * STATX_CHANGE_COOKIE is kernel-only << 724 * from userland. << 725 */ << 726 mask &= ~STATX_CHANGE_COOKIE; << 727 << 728 error = vfs_statx(dfd, filename, flags << 729 if (error) << 730 return error; << 731 << 732 return cp_statx(&stat, buffer); << 733 } << 734 << 735 int do_statx_fd(int fd, unsigned int flags, un << 736 struct statx __user *buffer) << 737 { << 738 struct kstat stat; << 739 int error; << 740 << 741 if (mask & STATX__RESERVED) << 742 return -EINVAL; << 743 if ((flags & AT_STATX_SYNC_TYPE) == AT << 744 return -EINVAL; << 745 << 746 /* << 747 * STATX_CHANGE_COOKIE is kernel-only << 748 * from userland. << 749 */ << 750 mask &= ~STATX_CHANGE_COOKIE; << 751 << 752 error = vfs_statx_fd(fd, flags, &stat, << 753 if (error) << 754 return error; << 755 << 756 return cp_statx(&stat, buffer); << 757 } << 758 << 759 /** 570 /** 760 * sys_statx - System call to get enhanced sta 571 * sys_statx - System call to get enhanced stats 761 * @dfd: Base directory to pathwalk from *or* 572 * @dfd: Base directory to pathwalk from *or* fd to stat. 762 * @filename: File to stat or either NULL or " !! 573 * @filename: File to stat or "" with AT_EMPTY_PATH 763 * @flags: AT_* flags to control pathwalk. 574 * @flags: AT_* flags to control pathwalk. 764 * @mask: Parts of statx struct actually requi 575 * @mask: Parts of statx struct actually required. 765 * @buffer: Result buffer. 576 * @buffer: Result buffer. 766 * 577 * 767 * Note that fstat() can be emulated by settin 578 * Note that fstat() can be emulated by setting dfd to the fd of interest, 768 * supplying "" (or preferably NULL) as the fi !! 579 * supplying "" as the filename and setting AT_EMPTY_PATH in the flags. 769 * in the flags. << 770 */ 580 */ 771 SYSCALL_DEFINE5(statx, 581 SYSCALL_DEFINE5(statx, 772 int, dfd, const char __user *, 582 int, dfd, const char __user *, filename, unsigned, flags, 773 unsigned int, mask, 583 unsigned int, mask, 774 struct statx __user *, buffer) 584 struct statx __user *, buffer) 775 { 585 { 776 int ret; !! 586 struct kstat stat; 777 unsigned lflags; !! 587 int error; 778 struct filename *name; !! 588 779 !! 589 if (mask & STATX__RESERVED) 780 /* !! 590 return -EINVAL; 781 * Short-circuit handling of NULL and !! 591 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) 782 * !! 592 return -EINVAL; 783 * For a NULL path we require and acce !! 593 784 * (possibly |'d with AT_STATX flags). !! 594 error = vfs_statx(dfd, filename, flags, &stat, mask); 785 * !! 595 if (error) 786 * However, glibc on 32-bit architectu !! 596 return error; 787 * with the "" pathname and AT_NO_AUTO << 788 * Supporting this results in the ugli << 789 */ << 790 lflags = flags & ~(AT_NO_AUTOMOUNT | A << 791 if (lflags == AT_EMPTY_PATH && vfs_emp << 792 return do_statx_fd(dfd, flags << 793 << 794 name = getname_flags(filename, getname << 795 ret = do_statx(dfd, name, flags, mask, << 796 putname(name); << 797 597 798 return ret; !! 598 return cp_statx(&stat, buffer); 799 } 599 } 800 600 801 #if defined(CONFIG_COMPAT) && defined(__ARCH_W !! 601 #ifdef CONFIG_COMPAT 802 static int cp_compat_stat(struct kstat *stat, 602 static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) 803 { 603 { 804 struct compat_stat tmp; 604 struct compat_stat tmp; 805 605 806 if (sizeof(tmp.st_dev) < 4 && !old_val !! 606 if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) 807 return -EOVERFLOW; << 808 if (sizeof(tmp.st_rdev) < 4 && !old_va << 809 return -EOVERFLOW; 607 return -EOVERFLOW; 810 608 811 memset(&tmp, 0, sizeof(tmp)); 609 memset(&tmp, 0, sizeof(tmp)); 812 tmp.st_dev = new_encode_dev(stat->dev) !! 610 tmp.st_dev = old_encode_dev(stat->dev); 813 tmp.st_ino = stat->ino; 611 tmp.st_ino = stat->ino; 814 if (sizeof(tmp.st_ino) < sizeof(stat-> 612 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 815 return -EOVERFLOW; 613 return -EOVERFLOW; 816 tmp.st_mode = stat->mode; 614 tmp.st_mode = stat->mode; 817 tmp.st_nlink = stat->nlink; 615 tmp.st_nlink = stat->nlink; 818 if (tmp.st_nlink != stat->nlink) 616 if (tmp.st_nlink != stat->nlink) 819 return -EOVERFLOW; 617 return -EOVERFLOW; 820 SET_UID(tmp.st_uid, from_kuid_munged(c 618 SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); 821 SET_GID(tmp.st_gid, from_kgid_munged(c 619 SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); 822 tmp.st_rdev = new_encode_dev(stat->rde !! 620 tmp.st_rdev = old_encode_dev(stat->rdev); 823 if ((u64) stat->size > MAX_NON_LFS) 621 if ((u64) stat->size > MAX_NON_LFS) 824 return -EOVERFLOW; 622 return -EOVERFLOW; 825 tmp.st_size = stat->size; 623 tmp.st_size = stat->size; 826 tmp.st_atime = stat->atime.tv_sec; 624 tmp.st_atime = stat->atime.tv_sec; 827 tmp.st_atime_nsec = stat->atime.tv_nse 625 tmp.st_atime_nsec = stat->atime.tv_nsec; 828 tmp.st_mtime = stat->mtime.tv_sec; 626 tmp.st_mtime = stat->mtime.tv_sec; 829 tmp.st_mtime_nsec = stat->mtime.tv_nse 627 tmp.st_mtime_nsec = stat->mtime.tv_nsec; 830 tmp.st_ctime = stat->ctime.tv_sec; 628 tmp.st_ctime = stat->ctime.tv_sec; 831 tmp.st_ctime_nsec = stat->ctime.tv_nse 629 tmp.st_ctime_nsec = stat->ctime.tv_nsec; 832 tmp.st_blocks = stat->blocks; 630 tmp.st_blocks = stat->blocks; 833 tmp.st_blksize = stat->blksize; 631 tmp.st_blksize = stat->blksize; 834 return copy_to_user(ubuf, &tmp, sizeof 632 return copy_to_user(ubuf, &tmp, sizeof(tmp)) ? -EFAULT : 0; 835 } 633 } 836 634 837 COMPAT_SYSCALL_DEFINE2(newstat, const char __u 635 COMPAT_SYSCALL_DEFINE2(newstat, const char __user *, filename, 838 struct compat_stat __us 636 struct compat_stat __user *, statbuf) 839 { 637 { 840 struct kstat stat; 638 struct kstat stat; 841 int error; 639 int error; 842 640 843 error = vfs_stat(filename, &stat); 641 error = vfs_stat(filename, &stat); 844 if (error) 642 if (error) 845 return error; 643 return error; 846 return cp_compat_stat(&stat, statbuf); 644 return cp_compat_stat(&stat, statbuf); 847 } 645 } 848 646 849 COMPAT_SYSCALL_DEFINE2(newlstat, const char __ 647 COMPAT_SYSCALL_DEFINE2(newlstat, const char __user *, filename, 850 struct compat_stat __us 648 struct compat_stat __user *, statbuf) 851 { 649 { 852 struct kstat stat; 650 struct kstat stat; 853 int error; 651 int error; 854 652 855 error = vfs_lstat(filename, &stat); 653 error = vfs_lstat(filename, &stat); 856 if (error) 654 if (error) 857 return error; 655 return error; 858 return cp_compat_stat(&stat, statbuf); 656 return cp_compat_stat(&stat, statbuf); 859 } 657 } 860 658 861 #ifndef __ARCH_WANT_STAT64 659 #ifndef __ARCH_WANT_STAT64 862 COMPAT_SYSCALL_DEFINE4(newfstatat, unsigned in 660 COMPAT_SYSCALL_DEFINE4(newfstatat, unsigned int, dfd, 863 const char __user *, fi 661 const char __user *, filename, 864 struct compat_stat __us 662 struct compat_stat __user *, statbuf, int, flag) 865 { 663 { 866 struct kstat stat; 664 struct kstat stat; 867 int error; 665 int error; 868 666 869 error = vfs_fstatat(dfd, filename, &st 667 error = vfs_fstatat(dfd, filename, &stat, flag); 870 if (error) 668 if (error) 871 return error; 669 return error; 872 return cp_compat_stat(&stat, statbuf); 670 return cp_compat_stat(&stat, statbuf); 873 } 671 } 874 #endif 672 #endif 875 673 876 COMPAT_SYSCALL_DEFINE2(newfstat, unsigned int, 674 COMPAT_SYSCALL_DEFINE2(newfstat, unsigned int, fd, 877 struct compat_stat __us 675 struct compat_stat __user *, statbuf) 878 { 676 { 879 struct kstat stat; 677 struct kstat stat; 880 int error = vfs_fstat(fd, &stat); 678 int error = vfs_fstat(fd, &stat); 881 679 882 if (!error) 680 if (!error) 883 error = cp_compat_stat(&stat, 681 error = cp_compat_stat(&stat, statbuf); 884 return error; 682 return error; 885 } 683 } 886 #endif 684 #endif 887 685 888 /* Caller is here responsible for sufficient l 686 /* Caller is here responsible for sufficient locking (ie. inode->i_lock) */ 889 void __inode_add_bytes(struct inode *inode, lo 687 void __inode_add_bytes(struct inode *inode, loff_t bytes) 890 { 688 { 891 inode->i_blocks += bytes >> 9; 689 inode->i_blocks += bytes >> 9; 892 bytes &= 511; 690 bytes &= 511; 893 inode->i_bytes += bytes; 691 inode->i_bytes += bytes; 894 if (inode->i_bytes >= 512) { 692 if (inode->i_bytes >= 512) { 895 inode->i_blocks++; 693 inode->i_blocks++; 896 inode->i_bytes -= 512; 694 inode->i_bytes -= 512; 897 } 695 } 898 } 696 } 899 EXPORT_SYMBOL(__inode_add_bytes); 697 EXPORT_SYMBOL(__inode_add_bytes); 900 698 901 void inode_add_bytes(struct inode *inode, loff 699 void inode_add_bytes(struct inode *inode, loff_t bytes) 902 { 700 { 903 spin_lock(&inode->i_lock); 701 spin_lock(&inode->i_lock); 904 __inode_add_bytes(inode, bytes); 702 __inode_add_bytes(inode, bytes); 905 spin_unlock(&inode->i_lock); 703 spin_unlock(&inode->i_lock); 906 } 704 } 907 705 908 EXPORT_SYMBOL(inode_add_bytes); 706 EXPORT_SYMBOL(inode_add_bytes); 909 707 910 void __inode_sub_bytes(struct inode *inode, lo 708 void __inode_sub_bytes(struct inode *inode, loff_t bytes) 911 { 709 { 912 inode->i_blocks -= bytes >> 9; 710 inode->i_blocks -= bytes >> 9; 913 bytes &= 511; 711 bytes &= 511; 914 if (inode->i_bytes < bytes) { 712 if (inode->i_bytes < bytes) { 915 inode->i_blocks--; 713 inode->i_blocks--; 916 inode->i_bytes += 512; 714 inode->i_bytes += 512; 917 } 715 } 918 inode->i_bytes -= bytes; 716 inode->i_bytes -= bytes; 919 } 717 } 920 718 921 EXPORT_SYMBOL(__inode_sub_bytes); 719 EXPORT_SYMBOL(__inode_sub_bytes); 922 720 923 void inode_sub_bytes(struct inode *inode, loff 721 void inode_sub_bytes(struct inode *inode, loff_t bytes) 924 { 722 { 925 spin_lock(&inode->i_lock); 723 spin_lock(&inode->i_lock); 926 __inode_sub_bytes(inode, bytes); 724 __inode_sub_bytes(inode, bytes); 927 spin_unlock(&inode->i_lock); 725 spin_unlock(&inode->i_lock); 928 } 726 } 929 727 930 EXPORT_SYMBOL(inode_sub_bytes); 728 EXPORT_SYMBOL(inode_sub_bytes); 931 729 932 loff_t inode_get_bytes(struct inode *inode) 730 loff_t inode_get_bytes(struct inode *inode) 933 { 731 { 934 loff_t ret; 732 loff_t ret; 935 733 936 spin_lock(&inode->i_lock); 734 spin_lock(&inode->i_lock); 937 ret = __inode_get_bytes(inode); 735 ret = __inode_get_bytes(inode); 938 spin_unlock(&inode->i_lock); 736 spin_unlock(&inode->i_lock); 939 return ret; 737 return ret; 940 } 738 } 941 739 942 EXPORT_SYMBOL(inode_get_bytes); 740 EXPORT_SYMBOL(inode_get_bytes); 943 741 944 void inode_set_bytes(struct inode *inode, loff 742 void inode_set_bytes(struct inode *inode, loff_t bytes) 945 { 743 { 946 /* Caller is here responsible for suff 744 /* Caller is here responsible for sufficient locking 947 * (ie. inode->i_lock) */ 745 * (ie. inode->i_lock) */ 948 inode->i_blocks = bytes >> 9; 746 inode->i_blocks = bytes >> 9; 949 inode->i_bytes = bytes & 511; 747 inode->i_bytes = bytes & 511; 950 } 748 } 951 749 952 EXPORT_SYMBOL(inode_set_bytes); 750 EXPORT_SYMBOL(inode_set_bytes); 953 751
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.