From: Mark Tinguely <tinguely@sgi.com>
To: xfs@oss.sgi.com
Subject: [RFC 16/17] xfsprogs: add parent pointer support to xfs_io
Date: Wed, 15 Jan 2014 16:00:28 -0600 [thread overview]
Message-ID: <20140116000852.575807572@sgi.com> (raw)
In-Reply-To: 20140115220012.624438534@sgi.com
[-- Attachment #1: 04-xfsprogs-pptr-xfs_io-getparentpaths_by_handle.c --]
[-- Type: text/plain, Size: 12816 bytes --]
xfs_io parent -p display parent pointer information for file.
xfs_io parent -c check parent pointer consistency for filesystem.
---
include/handle.h | 6 ++--
include/jdm.h | 14 +++------
include/parent.h | 13 ++++----
include/xfs_fs.h | 11 +++++++
io/parent.c | 56 +++++++++++++++++++++++---------------
libhandle/handle.c | 78 +++++++++++++++++++++++++++++++++++++++++++----------
libhandle/jdm.c | 48 ++++++++++++++++++++++----------
7 files changed, 158 insertions(+), 68 deletions(-)
Index: b/include/handle.h
===================================================================
--- a/include/handle.h
+++ b/include/handle.h
@@ -24,7 +24,7 @@ extern "C" {
struct fsdmidata;
struct attrlist_cursor;
-struct parent;
+struct xfs_parent;
extern int path_to_handle (char *__path, void **__hanp, size_t *__hlen);
extern int path_to_fshandle (char *__path, void **__fshanp, size_t *__fshlen);
@@ -41,10 +41,10 @@ extern int attr_list_by_handle (void *_
size_t __bufsize, int __flags,
struct attrlist_cursor *__cursor);
extern int parents_by_handle(void *__hanp, size_t __hlen,
- struct parent *__buf, size_t __bufsize,
+ struct xfs_parent *__buf, size_t __bufsize,
unsigned int *__count);
extern int parentpaths_by_handle(void *__hanp, size_t __hlen,
- struct parent *__buf, size_t __bufsize,
+ struct xfs_parent *__buf, size_t __bufsize,
unsigned int *__count);
extern int fssetdm_by_handle (void *__hanp, size_t __hlen,
struct fsdmidata *__fsdmi);
Index: b/include/jdm.h
===================================================================
--- a/include/jdm.h
+++ b/include/jdm.h
@@ -24,7 +24,7 @@ typedef void jdm_filehandle_t; /* fileha
struct xfs_bstat;
struct attrlist_cursor;
-struct parent;
+struct xfs_parent;
extern jdm_fshandle_t *
jdm_getfshandle( char *mntpnt);
@@ -62,16 +62,12 @@ jdm_attr_list( jdm_fshandle_t *fshp,
struct attrlist_cursor *cursor);
extern int
-jdm_parents( jdm_fshandle_t *fshp,
- xfs_bstat_t *statp,
- struct parent *bufp, size_t bufsz,
- unsigned int *count);
+jdm_parents( jdm_fshandle_t *fshp, struct xfs_bstat *statp,
+ struct xfs_parent *bufp, size_t bufsz, unsigned int *count);
extern int
-jdm_parentpaths( jdm_fshandle_t *fshp,
- xfs_bstat_t *statp,
- struct parent *bufp, size_t bufsz,
- unsigned int *count);
+jdm_parentpaths( jdm_fshandle_t *fshp, struct xfs_bstat *statp,
+ struct xfs_parent *bufp, size_t bufsz, unsigned int *count);
/* macro for determining the size of a structure member */
#define sizeofmember( t, m ) sizeof( ( ( t * )0 )->m )
Index: b/include/parent.h
===================================================================
--- a/include/parent.h
+++ b/include/parent.h
@@ -18,12 +18,13 @@
#ifndef __PARENT_H__
#define __PARENT_H__
-typedef struct parent {
- __u64 p_ino;
- __u32 p_gen;
- __u16 p_reclen;
- char p_name[1];
-} parent_t;
+struct xfs_parent {
+ uint64_t p_ino; /*parent inode number */
+ uint32_t p_offset; /* entry offset in parent inode */
+ uint16_t p_reclen; /* name length */
+ uint16_t p_spare; /* padding for future */
+ char p_name[1]; /* name */
+};
typedef struct parent_cursor {
__u32 opaque[4]; /* an opaque cookie */
Index: b/include/xfs_fs.h
===================================================================
--- a/include/xfs_fs.h
+++ b/include/xfs_fs.h
@@ -438,6 +438,15 @@ typedef struct xfs_fsop_attrmulti_handle
struct xfs_attr_multiop __user *ops; /* attr_multi data */
} xfs_fsop_attrmulti_handlereq_t;
+
+typedef struct xfs_fsop_parentlist_handlereq {
+ struct xfs_fsop_handlereq hreq; /* handle interface structure */
+ __u32 flags; /* which namespace to use */
+ __u32 buflen; /* length of buffer supplied */
+ __u32 __user *ocount; /* output count ptr */
+ void __user *buffer; /* returned names */
+} xfs_fsop_parentlist_handlereq_t;
+
/*
* per machine unique filesystem identifier types.
*/
@@ -553,6 +562,8 @@ typedef struct xfs_swapext
#define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq)
#define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom)
#define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t)
+#define XFS_IOC_GETPARENTS_BY_HANDLE _IOWR('X', 126, struct xfs_fsop_parentlist_handlereq)
+#define XFS_IOC_GETPARENTPATHS_BY_HANDLE _IOWR('X', 127, struct xfs_fsop_parentlist_handlereq)
/* XFS_IOC_GETFSUUID ---------- deprecated 140 */
Index: b/io/parent.c
===================================================================
--- a/io/parent.c
+++ b/io/parent.c
@@ -39,14 +39,16 @@ static char *mntpt;
* check out a parent entry to see if the values seem valid
*/
static void
-check_parent_entry(xfs_bstat_t *bstatp, parent_t *parent)
+check_parent_entry(
+ struct xfs_bstat *bstatp,
+ struct xfs_parent *parent)
{
int sts;
char fullpath[PATH_MAX];
struct stat statbuf;
char *str;
- sprintf(fullpath, _("%s%s"), mntpt, parent->p_name);
+ sprintf(fullpath, _("%s/%s"), mntpt, parent->p_name);
sts = lstat(fullpath, &statbuf);
if (sts != 0) {
@@ -121,19 +123,23 @@ check_parent_entry(xfs_bstat_t *bstatp,
}
static void
-check_parents(parent_t *parentbuf, size_t *parentbuf_size,
- jdm_fshandle_t *fshandlep, xfs_bstat_t *statp)
+check_parents(
+ struct xfs_parent *parentbuf,
+ size_t *parentbuf_size,
+ jdm_fshandle_t *fshandlep,
+ struct xfs_bstat *statp)
{
- int error, i;
- __u32 count;
- parent_t *entryp;
+ int error, i;
+ __u32 count = 0;
+ struct xfs_parent *entryp;
do {
error = jdm_parentpaths(fshandlep, statp, parentbuf, *parentbuf_size, &count);
if (error == ERANGE) {
*parentbuf_size *= 2;
- parentbuf = (parent_t *)realloc(parentbuf, *parentbuf_size);
+ parentbuf = (struct xfs_parent *)realloc(parentbuf,
+ *parentbuf_size);
} else if (error) {
fprintf(stderr, _("parentpaths failed for ino %llu: %s\n"),
(unsigned long long) statp->bs_ino,
@@ -154,13 +160,18 @@ check_parents(parent_t *parentbuf, size_
entryp = parentbuf;
for (i = 0; i < count; i++) {
check_parent_entry(statp, entryp);
- entryp = (parent_t*) (((char*)entryp) + entryp->p_reclen);
+ entryp = (struct xfs_parent*) (((char*)entryp) +
+ entryp->p_reclen);
}
}
static int
-do_bulkstat(parent_t *parentbuf, size_t *parentbuf_size, xfs_bstat_t *bstatbuf,
- int fsfd, jdm_fshandle_t *fshandlep)
+do_bulkstat(
+ struct xfs_parent *parentbuf,
+ size_t *parentbuf_size,
+ struct xfs_bstat *bstatbuf,
+ int fsfd,
+ jdm_fshandle_t *fshandlep)
{
__s32 buflenout;
__u64 lastino = 0;
@@ -233,7 +244,7 @@ parent_check(void)
{
int fsfd;
jdm_fshandle_t *fshandlep;
- parent_t *parentbuf;
+ struct xfs_parent *parentbuf;
size_t parentbuf_size = PARENTBUF_SZ;
xfs_bstat_t *bstatbuf;
@@ -254,7 +265,7 @@ parent_check(void)
/* allocate buffers */
bstatbuf = (xfs_bstat_t *)calloc(BSTATBUF_SZ, sizeof(xfs_bstat_t));
- parentbuf = (parent_t *)malloc(parentbuf_size);
+ parentbuf = (struct xfs_parent *)malloc(parentbuf_size);
if (!bstatbuf || !parentbuf) {
fprintf(stderr, _("unable to allocate buffers: %s\n"),
strerror(errno));
@@ -276,13 +287,15 @@ parent_check(void)
}
static void
-print_parent_entry(parent_t *parent, int fullpath)
+print_parent_entry(
+ struct xfs_parent *parent,
+ int fullpath)
{
- printf(_("p_ino = %llu\n"), (unsigned long long) parent->p_ino);
- printf(_("p_gen = %u\n"), parent->p_gen);
+ printf(_("p_ino = %llu\n"), (unsigned long long) parent->p_ino);
+ printf(_("p_offset = %u\n"), parent->p_offset);
printf(_("p_reclen = %u\n"), parent->p_reclen);
if (fullpath)
- printf(_("p_name = \"%s%s\"\n"), mntpt, parent->p_name);
+ printf(_("p_name = \"%s/%s\"\n"), mntpt, parent->p_name);
else
printf(_("p_name = \"%s\"\n"), parent->p_name);
}
@@ -295,8 +308,8 @@ parent_list(int fullpath)
int error, i;
int retval = 1;
__u32 count;
- parent_t *entryp;
- parent_t *parentbuf = NULL;
+ struct xfs_parent *entryp;
+ struct xfs_parent *parentbuf = NULL;
char *path = file->name;
int pb_size = PARENTBUF_SZ;
@@ -318,7 +331,7 @@ parent_list(int fullpath)
}
do {
- parentbuf = (parent_t *)realloc(parentbuf, pb_size);
+ parentbuf = (struct xfs_parent *)realloc(parentbuf, pb_size);
if (!parentbuf) {
fprintf(stderr, _("%s: unable to allocate parent buffer: %s\n"),
progname, strerror(errno));
@@ -357,7 +370,8 @@ parent_list(int fullpath)
entryp = parentbuf;
for (i = 0; i < count; i++) {
print_parent_entry(entryp, fullpath);
- entryp = (parent_t*) (((char*)entryp) + entryp->p_reclen);
+ entryp = (struct xfs_parent *) (((char*)entryp) +
+ entryp->p_reclen);
}
retval = 0;
Index: b/libhandle/handle.c
===================================================================
--- a/libhandle/handle.c
+++ b/libhandle/handle.c
@@ -405,27 +405,77 @@ attr_list_by_handle(
int
parents_by_handle(
- void *hanp,
- size_t hlen,
- parent_t *buf,
- size_t bufsiz,
- unsigned int *count)
+ void *hanp,
+ size_t hlen,
+ struct xfs_parent *buf,
+ size_t bufsiz,
+ unsigned int *count)
{
- errno = EOPNOTSUPP;
- return -1;
+ int error, fd;
+ char *path;
+ char buffer[MAXPATHLEN+1];
+ unsigned int buflen = MAXPATHLEN;
+ struct xfs_fsop_parentlist_handlereq plheq;
+
+ if ((fd = handle_to_fsfd(hanp, &path)) < 0)
+ return -1;
+
+ plheq.hreq.fd = 0;
+ plheq.hreq.path = NULL;
+ plheq.hreq.oflags = O_LARGEFILE;
+ plheq.hreq.ihandle = hanp;
+ plheq.hreq.ihandlen = hlen;
+ plheq.hreq.ohandle = buffer;
+ plheq.hreq.ohandlen = &buflen;
+ plheq.flags = 0x0040;
+ plheq.buffer = buf;
+ plheq.buflen = bufsiz;
+ plheq.ocount = count;
+
+ /* prevent needless EINVAL from the kernel */
+ if (plheq.buflen > XATTR_LIST_MAX)
+ plheq.buflen = XATTR_LIST_MAX;
+
+ error = xfsctl(path, fd, XFS_IOC_GETPARENTS_BY_HANDLE, &plheq);
+ return error;
}
int
parentpaths_by_handle(
- void *hanp,
- size_t hlen,
- parent_t *buf,
- size_t bufsiz,
- unsigned int *count)
+ void *hanp,
+ size_t hlen,
+ struct xfs_parent *buf,
+ size_t bufsiz,
+ unsigned int *count)
{
- errno = EOPNOTSUPP;
- return -1;
+ int error, fd;
+ char *path;
+ char buffer[MAXPATHLEN+1];
+ unsigned int buflen = MAXPATHLEN;
+ struct xfs_fsop_parentlist_handlereq plheq;
+
+ if ((fd = handle_to_fsfd(hanp, &path)) < 0)
+ return -1;
+
+ plheq.hreq.fd = 0;
+ plheq.hreq.path = NULL;
+ plheq.hreq.oflags = O_LARGEFILE;
+ plheq.hreq.ihandle = hanp;
+ plheq.hreq.ihandlen = hlen;
+ plheq.hreq.ohandle = buffer;
+ plheq.hreq.ohandlen = &buflen;
+ plheq.flags = 0x0040;
+ plheq.buffer = buf;
+ plheq.buflen = bufsiz;
+ plheq.ocount = count;
+
+ /* prevent needless EINVAL from the kernel */
+ if (plheq.buflen > XATTR_LIST_MAX)
+ plheq.buflen = XATTR_LIST_MAX;
+
+ error = xfsctl(path, fd, XFS_IOC_GETPARENTPATHS_BY_HANDLE, &plheq);
+ return error;
}
int
Index: b/libhandle/jdm.c
===================================================================
--- a/libhandle/jdm.c
+++ b/libhandle/jdm.c
@@ -18,8 +18,8 @@
#include <xfs/xfs.h>
#include <xfs/handle.h>
-#include <xfs/jdm.h>
#include <xfs/parent.h>
+#include <xfs/jdm.h>
/* internal fshandle - typecast to a void for external use */
#define FSHANDLE_SZ 8
@@ -178,21 +178,39 @@ jdm_attr_list( jdm_fshandle_t *fshp,
}
int
-jdm_parents( jdm_fshandle_t *fshp,
- xfs_bstat_t *statp,
- parent_t *bufp, size_t bufsz,
- unsigned int *count)
-{
- errno = EOPNOTSUPP;
- return -1;
+jdm_parents(
+ jdm_fshandle_t *fshp,
+ struct xfs_bstat *statp,
+ struct xfs_parent *bufp,
+ size_t bufsz,
+ unsigned int *count)
+{
+ struct xfs_handle *handle = (struct xfs_handle *) fshp;
+
+ handle->ha_fid.fid_ino = statp->bs_ino;
+ handle->ha_fid.fid_gen = statp->bs_gen;
+ handle->ha_fid.fid_len =
+ sizeof(handle->ha_fid) - sizeof(handle->ha_fid.fid_len);
+
+ return parents_by_handle(handle, sizeof(struct xfs_handle), bufp,
+ bufsz, count);
}
int
-jdm_parentpaths( jdm_fshandle_t *fshp,
- xfs_bstat_t *statp,
- parent_t *bufp, size_t bufsz,
- unsigned int *count)
-{
- errno = EOPNOTSUPP;
- return -1;
+jdm_parentpaths(
+ jdm_fshandle_t *fshp,
+ struct xfs_bstat *statp,
+ struct xfs_parent *bufp,
+ size_t bufsz,
+ unsigned int *count)
+{
+ struct xfs_handle *handle = (struct xfs_handle *) fshp;
+
+ handle->ha_fid.fid_ino = statp->bs_ino;
+ handle->ha_fid.fid_gen = statp->bs_gen;
+ handle->ha_fid.fid_len =
+ sizeof(handle->ha_fid) - sizeof(handle->ha_fid.fid_len);
+
+ return parentpaths_by_handle(handle, sizeof(struct xfs_handle), bufp,
+ bufsz, count);
}
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2014-01-16 0:30 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-15 22:00 [RFC 00/17] RFC parent inode pointers Mark Tinguely
2014-01-15 22:00 ` [RFC 01/17] xfs: (parent ptr) get offset when adding directory name Mark Tinguely
2014-01-15 22:00 ` [RFC 02/17] xfs: (parent ptr) get offset when removing " Mark Tinguely
2014-01-15 22:00 ` [RFC 03/17] xfs: (parent ptr) get offset when replacing a " Mark Tinguely
2014-01-15 22:00 ` [RFC 04/17] xfs: (parent ptr) add parent pointer support to xfs_sb.h Mark Tinguely
2014-01-15 22:00 ` [RFC 05/17] xfs: (parent ptr) add parent pointer support to attribute code Mark Tinguely
2014-01-15 22:00 ` [RFC 06/17] xfs: (parent ptr) add parent pointer support to inode v5 Mark Tinguely
2014-01-15 22:00 ` [RFC 07/17] xfs: (parent ptr) add parent pointer support to xfs_create Mark Tinguely
2014-01-15 22:00 ` [RFC 08/17] xfs: (parent ptr) add parent pointer support to xfs_symlink Mark Tinguely
2014-01-15 22:00 ` [RFC 09/17] xfs: (parent ptr) add parent pointer support to xfs_link Mark Tinguely
2014-01-15 22:00 ` [RFC 10/17] xfs: (parent ptr) add parent pointer support to xfs_remove Mark Tinguely
2014-01-15 22:00 ` [RFC 11/17] xfs: (parent ptr) add parent pointer support to xfs_rename Mark Tinguely
2014-01-15 22:00 ` [RFC 12/17] xfs: (parent ptr) add parent pointer support for user space Mark Tinguely
2014-01-15 22:00 ` [RFC 13/17] xfsprogs: add parent pointer support into Linux 3.10 inode 3 Mark Tinguely
2014-01-15 22:00 ` [RFC 14/17] xfsprogs: add parent pointer values to headers and fix repair Mark Tinguely
2014-01-15 22:00 ` [RFC 15/17] xfsprogs: add basic parent pointer support to xfs_db Mark Tinguely
2014-01-15 22:00 ` Mark Tinguely [this message]
2014-01-15 22:00 ` [RFC 17/17] xfsprogs: add parent GEOM information Mark Tinguely
2014-01-16 5:56 ` [RFC 00/17] RFC parent inode pointers Dave Chinner
2014-01-17 21:25 ` Mark Tinguely
2014-01-18 3:12 ` Dave Chinner
2014-01-27 19:41 ` Mark Tinguely
2014-01-28 3:00 ` Dave Chinner
2014-01-28 22:02 ` Geoffrey Wehrman
2014-02-04 0:09 ` Dave Chinner
2014-02-04 5:37 ` Geoffrey Wehrman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140116000852.575807572@sgi.com \
--to=tinguely@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).