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