From: Dave Chinner Date: Wed, 4 Sep 2013 22:05:34 +0000 (+0000) Subject: xfs: split out the remote symlink handling X-Git-Tag: v3.2.0-alpha1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=270b1db1da073c7fb8d0c5a9ffa70f148887dd3c;p=thirdparty%2Fxfsprogs-dev.git xfs: split out the remote symlink handling The remote symlink format definition and manipulation needs to be shared with userspace, but the in-kernel interfaces do not. Split the remote symlink format handling out into xfs_symlink_remote.[ch] fo it can easily be shared with userspace. Signed-off-by: Dave Chinner Review-by: Mark Tinguely Signed-off-by: Rich Johnston --- diff --git a/include/Makefile b/include/Makefile index c86d2ce72..6a4e521f2 100644 --- a/include/Makefile +++ b/include/Makefile @@ -39,7 +39,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_mount.h \ xfs_quota_defs.h \ xfs_sb.h \ - xfs_symlink.h \ xfs_trace.h \ xfs_trans_resv.h \ xfs_trans_space.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 8ab832d11..51a244286 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -61,7 +61,6 @@ #include #include #include -#include #ifndef ARRAY_SIZE diff --git a/include/xfs_format.h b/include/xfs_format.h index 62053744a..35c08ff54 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -27,6 +27,12 @@ * xfs_log_format.h. Everything else goes here. */ +struct xfs_mount; +struct xfs_trans; +struct xfs_inode; +struct xfs_buf; +struct xfs_ifork; + /* * RealTime Device format definitions */ @@ -123,5 +129,41 @@ typedef struct xfs_dqblk { #define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc) +/* + * Remote symlink format and access functions. + */ +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. + */ +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); +int xfs_symlink_hdr_set(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, + uint32_t size, struct xfs_buf *bp); +bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, + uint32_t size, struct xfs_buf *bp); +void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_inode *ip, struct xfs_ifork *ifp); + +extern const struct xfs_buf_ops xfs_symlink_buf_ops; #endif /* __XFS_FORMAT_H__ */ diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h deleted file mode 100644 index e85dfd194..000000000 --- a/include/xfs_symlink.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2012 Red Hat, Inc. All rights reserved. - */ -#ifndef __XFS_SYMLINK_H -#define __XFS_SYMLINK_H 1 - -#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ - -struct xfs_dsymlink_hdr { - __be32 sl_magic; - __be32 sl_offset; - __be32 sl_bytes; - __be32 sl_crc; - uuid_t sl_uuid; - __be64 sl_owner; - __be64 sl_blkno; - __be64 sl_lsn; -}; - -/* - * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 3 extents back from - * bmapi when crc headers are taken into account. - */ -#define XFS_SYMLINK_MAPS 3 - -#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ - ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ - sizeof(struct xfs_dsymlink_hdr) : 0)) - -int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); -bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, - uint32_t size, struct xfs_buf *bp); -void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_inode *ip, struct xfs_ifork *ifp); - -extern const struct xfs_buf_ops xfs_symlink_buf_ops; - -#ifdef __KERNEL__ - -int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, - const char *target_path, umode_t mode, struct xfs_inode **ipp); -int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); - -#endif /* __KERNEL__ */ -#endif /* __XFS_SYMLINK_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index b7df144eb..6ba38f969 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -23,7 +23,7 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ crc32.c \ - xfs_symlink.c \ + xfs_symlink_remote.c \ xfs_trans_resv.c CFILES += $(PKG_PLATFORM).c diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink_remote.c similarity index 83% rename from libxfs/xfs_symlink.c rename to libxfs/xfs_symlink_remote.c index f2e69f93a..539db0cb9 100644 --- a/libxfs/xfs_symlink.c +++ b/libxfs/xfs_symlink_remote.c @@ -1,9 +1,22 @@ /* - * Copyright 2013 Red Hat, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2012-2013 Red Hat, Inc. * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "xfs.h" +#include /* * Each contiguous block has a header, so it is not just a simple pathlen @@ -19,9 +32,6 @@ xfs_symlink_blocks( return (pathlen + buflen - 1) / buflen; } -/* - * This is used by mkfs/proto.c to create symlinks. - */ int xfs_symlink_hdr_set( struct xfs_mount *mp, @@ -70,7 +80,6 @@ xfs_symlink_hdr_ok( /* ok */ return true; - } static bool