@@ -752,8 +752,6 @@ struct xfs_scrub_metadata {
XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED)
#define XFS_SCRUB_FLAGS_ALL (XFS_SCRUB_FLAGS_IN | XFS_SCRUB_FLAGS_OUT)
-#define XFS_GETPARENTS_MAXNAMELEN 256
-
/* return parents of the handle, not the open fd */
#define XFS_GETPARENTS_IFLAG_HANDLE (1U << 0)
@@ -769,11 +767,11 @@ struct xfs_scrub_metadata {
/* Get an inode parent pointer through ioctl */
struct xfs_getparents_rec {
- __u64 gpr_ino; /* Inode */
- __u32 gpr_gen; /* Inode generation */
- __u32 gpr_diroffset; /* Directory offset */
- __u64 gpr_rsvd; /* Reserved */
- __u8 gpr_name[]; /* File name */
+ __u64 gpr_ino; /* Inode number */
+ __u32 gpr_gen; /* Inode generation */
+ __u32 gpr_diroffset; /* Directory offset */
+ __u64 gpr_rsvd; /* Reserved */
+ __u8 gpr_name[]; /* File name and null terminator */
};
/* Iterate through an inodes parent pointers */
@@ -794,8 +792,8 @@ struct xfs_getparents {
/* Must be set to zero */
__u32 gp_reserved;
- /* size of the trailing buffer in bytes */
- __u32 gp_ptrs_size;
+ /* Size of the buffer in bytes, including this header */
+ __u32 gp_bufsize;
/* # of entries filled in (output) */
__u32 gp_count;
@@ -807,19 +805,13 @@ struct xfs_getparents {
__u32 gp_offsets[];
};
-static inline size_t
-xfs_getparents_sizeof(int nr_ptrs)
-{
- return sizeof(struct xfs_getparents) +
- (nr_ptrs * sizeof(struct xfs_getparents_rec));
-}
-
static inline struct xfs_getparents_rec*
xfs_getparents_rec(
struct xfs_getparents *info,
- int idx)
+ unsigned int idx)
{
- return (struct xfs_getparents_rec *)((char *)info + info->gp_offsets[idx]);
+ return (struct xfs_getparents_rec *)((char *)info +
+ info->gp_offsets[idx]);
}
/*
@@ -867,7 +859,7 @@ xfs_getparents_rec(
/* XFS_IOC_GETFSMAP ------ hoisted 59 */
#define XFS_IOC_SCRUB_METADATA _IOWR('X', 60, struct xfs_scrub_metadata)
#define XFS_IOC_AG_GEOMETRY _IOWR('X', 61, struct xfs_ag_geometry)
-#define XFS_IOC_GETPARENTS _IOWR('X', 62, struct xfs_getparents_rec)
+#define XFS_IOC_GETPARENTS _IOWR('X', 62, struct xfs_getparents)
/*
* ioctl commands that replace IRIX syssgi()'s
@@ -1681,10 +1681,10 @@ xfs_ioc_scrub_metadata(
* IOCTL routine to get the parent pointers of an inode and return it to user
* space. Caller must pass a buffer space containing a struct xfs_getparents,
* followed by a region large enough to contain an array of struct
- * xfs_getparents_rec of a size specified in gp_ptrs_size. If the inode contains
+ * xfs_getparents_rec of a size specified in gp_bufsize. If the inode contains
* more parent pointers than can fit in the buffer space, caller may re-call
* the function using the returned gp_cursor to resume iteration. The
- * number of xfs_getparents_rec returned will be stored in gp_ptrs_count.
+ * number of xfs_getparents_rec returned will be stored in gp_count.
*
* Returns 0 on success or non-zero on failure
*/
@@ -1699,7 +1699,7 @@ xfs_ioc_get_parent_pointer(
struct xfs_inode *call_ip = file_ip;
struct xfs_mount *mp = file_ip->i_mount;
void __user *o_pptr;
- struct xfs_getparents_rec *i_pptr;
+ struct xfs_getparents_rec *i_pptr;
unsigned int bytes;
if (!capable(CAP_SYS_ADMIN))
@@ -1718,11 +1718,11 @@ xfs_ioc_get_parent_pointer(
}
/* Check size of buffer requested by user */
- if (ppi->gp_ptrs_size > XFS_XATTR_LIST_MAX) {
+ if (ppi->gp_bufsize > XFS_XATTR_LIST_MAX) {
error = -ENOMEM;
goto out;
}
- if (ppi->gp_ptrs_size < sizeof(struct xfs_getparents)) {
+ if (ppi->gp_bufsize < sizeof(struct xfs_getparents)) {
error = -EINVAL;
goto out;
}
@@ -1737,8 +1737,7 @@ xfs_ioc_get_parent_pointer(
* Now that we know how big the trailing buffer is, expand
* our kernel xfs_getparents to be the same size
*/
- ppi = kvrealloc(ppi, sizeof(struct xfs_getparents),
- xfs_getparents_sizeof(ppi->gp_ptrs_size),
+ ppi = kvrealloc(ppi, sizeof(struct xfs_getparents), ppi->gp_bufsize,
GFP_KERNEL | __GFP_ZERO);
if (!ppi)
return -ENOMEM;
@@ -1794,7 +1793,7 @@ xfs_ioc_get_parent_pointer(
/* Copy the parent pointer records back to the user. */
o_pptr = (__user char*)arg + ppi->gp_offsets[ppi->gp_count - 1];
i_pptr = xfs_getparents_rec(ppi, ppi->gp_count - 1);
- bytes = ((char *)ppi + ppi->gp_ptrs_size) - (char *)i_pptr;
+ bytes = ((char *)ppi + ppi->gp_bufsize) - (char *)i_pptr;
error = copy_to_user(o_pptr, i_pptr, bytes);
if (error) {
error = -EFAULT;
@@ -115,7 +115,7 @@ xfs_getparent_pointers(
gp->context.dp = ip;
gp->context.resynch = 1;
gp->context.put_listent = xfs_getparent_listent;
- gp->context.bufsize = round_down(ppi->gp_ptrs_size, sizeof(uint32_t));
+ gp->context.bufsize = round_down(ppi->gp_bufsize, sizeof(uint32_t));
gp->context.firstu = gp->context.bufsize;
/* Copy the cursor provided by caller */
@@ -149,4 +149,3 @@ xfs_getparent_pointers(
kfree(gp);
return error;
}
-