diff mbox

[2/3] btrfs-progs: libify some parts of btrfs-progs

Message ID 1357681304-2978-3-git-send-email-mfasheh@suse.de (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Mark Fasheh Jan. 8, 2013, 9:41 p.m. UTC
External software wanting to use the functionality provided by the btrfs
send ioctl has a hard time doing so without replicating tons of work. Of
particular interest are functions like btrfs_read_and_process_send_stream()
and subvol_uuid_search(). As that functionality requires a bit more than
just send-stream.c and send-utils.c we have to pull in some other parts of
the progs package.

This patch adds code to the Makefile and headers to create a library,
libbtrfs which the btrfs command now links to.

Signed-off-by: Mark Fasheh <mfasheh@suse.de>
---
 Makefile       |   38 ++++++++++++++++++++++++++++----------
 btrfs-list.h   |    4 ++++
 crc32c.h       |    4 ++++
 ctree.h        |    9 +++++++++
 extent-cache.h |    6 ++++++
 extent_io.h    |    7 +++++++
 radix-tree.h   |    4 ++++
 rbtree.h       |    4 ++++
 send-utils.h   |    5 +++++
 9 files changed, 71 insertions(+), 10 deletions(-)

Comments

Anand Jain Jan. 11, 2013, 9:31 a.m. UTC | #1
Mark,

test case :
  make (Do not run make all)
  make install

generates the following error..

install -m755 -d /usr/local/lib
install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so /usr/local/lib
install: cannot stat `libbtrfs.so.1.0': No such file or directory
install: cannot stat `libbtrfs.so.1': No such file or directory
install: cannot stat `libbtrfs.so': No such file or directory
make: *** [install] Error 1


Thanks, Anand


On 01/09/2013 05:41 AM, Mark Fasheh wrote:
> External software wanting to use the functionality provided by the btrfs
> send ioctl has a hard time doing so without replicating tons of work. Of
> particular interest are functions like btrfs_read_and_process_send_stream()
> and subvol_uuid_search(). As that functionality requires a bit more than
> just send-stream.c and send-utils.c we have to pull in some other parts of
> the progs package.
>
> This patch adds code to the Makefile and headers to create a library,
> libbtrfs which the btrfs command now links to.
>
> Signed-off-by: Mark Fasheh <mfasheh@suse.de>
> ---
>   Makefile       |   38 ++++++++++++++++++++++++++++----------
>   btrfs-list.h   |    4 ++++
>   crc32c.h       |    4 ++++
>   ctree.h        |    9 +++++++++
>   extent-cache.h |    6 ++++++
>   extent_io.h    |    7 +++++++
>   radix-tree.h   |    4 ++++
>   rbtree.h       |    4 ++++
>   send-utils.h   |    5 +++++
>   9 files changed, 71 insertions(+), 10 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 4894903..29c63b1 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,14 +1,17 @@
>   CC = gcc
> -AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
> -CFLAGS = -g -O1
> +AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -DBTRFS_FLAT_INCLUDES
> +CFLAGS = -g -O1 -fPIC
>   objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
> -	  root-tree.o dir-item.o file-item.o inode-item.o \
> -	  inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
> -	  volumes.o utils.o btrfs-list.o btrfslabel.o repair.o \
> -	  send-stream.o send-utils.o qgroup.o
> +	  root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \
> +	  extent-cache.o extent_io.o volumes.o utils.o btrfslabel.o repair.o \
> +	  qgroup.o
>   cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \
>   	       cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \
>   	       cmds-quota.o cmds-qgroup.o
> +libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o
> +libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \
> +	       crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \
> +	       extent_io.h ioctl.h ctree.h
>
>   CHECKFLAGS= -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
>   	    -Wuninitialized -Wshadow -Wundef
> @@ -17,13 +20,18 @@ DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
>   INSTALL = install
>   prefix ?= /usr/local
>   bindir = $(prefix)/bin
> -LIBS=-luuid -lm
> +libdir = $(prefix)/lib
> +incdir = $(prefix)/include/btrfs
> +LIBS=-luuid -lm -L. -lbtrfs
>   RESTORE_LIBS=-lz
>
>   progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
>   	btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \
>   	btrfs-find-root btrfs-restore btrfstune
>
> +libs = libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so
> +headers = $(libbtrfs_headers)
> +
>   # make C=1 to enable sparse
>   ifdef C
>   	check = sparse $(CHECKFLAGS)
> @@ -36,11 +44,16 @@ endif
>   	$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
>
>
> -all: version $(progs) manpages
> +all: version $(libs) $(progs) manpages
>
>   version:
>   	bash version.sh
>
> +$(libs): $(libbtrfs_objects) send.h
> +	$(CC) $(CFLAGS) $(libbtrfs_objects) -shared -Wl,-soname,libbtrfs.so.1 -o libbtrfs.so.1.0
> +	ln -sf libbtrfs.so.1.0 libbtrfs.so.1
> +	ln -sf libbtrfs.so.1.0 libbtrfs.so
> +
>   btrfs: $(objects) btrfs.o help.o common.o $(cmds_objects)
>   	$(CC) $(CFLAGS) -o btrfs btrfs.o help.o common.o $(cmds_objects) \
>   		$(objects) $(LDFLAGS) $(LIBS) -lpthread
> @@ -109,12 +122,17 @@ install-man:
>   	cd man; $(MAKE) install
>
>   clean :
> -	rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image btrfs-select-super \
> -	      btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h
> +	rm -f $(progs) $(libs) cscope.out *.o .*.d btrfs-convert btrfs-image \
> +	      btrfs-select-super btrfs-zero-log btrfstune dir-test ioctl-test \
> +	      quick-test version.h
>   	cd man; $(MAKE) clean
>
>   install: $(progs) install-man
>   	$(INSTALL) -m755 -d $(DESTDIR)$(bindir)
>   	$(INSTALL) $(progs) $(DESTDIR)$(bindir)
> +	$(INSTALL) -m755 -d $(DESTDIR)$(libdir)
> +	$(INSTALL) $(libs) $(DESTDIR)$(libdir)
> +	$(INSTALL) -m755 -d $(DESTDIR)$(incdir)
> +	$(INSTALL) $(headers) $(DESTDIR)$(incdir)
>
>   -include .*.d
> diff --git a/btrfs-list.h b/btrfs-list.h
> index cde4b3c..da6bf1c 100644
> --- a/btrfs-list.h
> +++ b/btrfs-list.h
> @@ -16,7 +16,11 @@
>    * Boston, MA 021110-1307, USA.
>    */
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct root_info;
>
> diff --git a/crc32c.h b/crc32c.h
> index 7f12e77..c552ef6 100644
> --- a/crc32c.h
> +++ b/crc32c.h
> @@ -19,7 +19,11 @@
>   #ifndef __CRC32C__
>   #define __CRC32C__
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   u32 crc32c_le(u32 seed, unsigned char const *data, size_t length);
>   void crc32c_optimization_init(void);
> diff --git a/ctree.h b/ctree.h
> index 293b24f..7a1ffce 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -19,12 +19,21 @@
>   #ifndef __BTRFS__
>   #define __BTRFS__
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "list.h"
>   #include "kerncompat.h"
>   #include "radix-tree.h"
>   #include "extent-cache.h"
>   #include "extent_io.h"
>   #include "ioctl.h"
> +#else
> +#include <btrfs/list.h>
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/radix-tree.h>
> +#include <btrfs/extent-cache.h>
> +#include <btrfs/extent_io.h>
> +#include <btrfs/ioctl.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct btrfs_root;
>   struct btrfs_trans_handle;
> diff --git a/extent-cache.h b/extent-cache.h
> index 7f2f2a6..4cd0f79 100644
> --- a/extent-cache.h
> +++ b/extent-cache.h
> @@ -18,8 +18,14 @@
>
>   #ifndef __PENDING_EXTENT__
>   #define __PENDING_EXTENT__
> +
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
>   #include "rbtree.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/rbtree.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct cache_tree {
>   	struct rb_root root;
> diff --git a/extent_io.h b/extent_io.h
> index a5d6bf0..4553859 100644
> --- a/extent_io.h
> +++ b/extent_io.h
> @@ -18,9 +18,16 @@
>
>   #ifndef __EXTENTMAP__
>   #define __EXTENTMAP__
> +
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
>   #include "extent-cache.h"
>   #include "list.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/extent-cache.h>
> +#include <btrfs/list.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   #define EXTENT_DIRTY 1
>   #define EXTENT_WRITEBACK (1 << 1)
> diff --git a/radix-tree.h b/radix-tree.h
> index d99ea7e..bf96d83 100644
> --- a/radix-tree.h
> +++ b/radix-tree.h
> @@ -37,7 +37,11 @@
>   #ifndef _LINUX_RADIX_TREE_H
>   #define _LINUX_RADIX_TREE_H
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   #define RADIX_TREE_MAX_TAGS 2
>
> diff --git a/rbtree.h b/rbtree.h
> index bed054d..b636ddd 100644
> --- a/rbtree.h
> +++ b/rbtree.h
> @@ -93,7 +93,11 @@ static inline struct page * rb_insert_page_cache(struct inode * inode,
>
>   #ifndef	_LINUX_RBTREE_H
>   #define	_LINUX_RBTREE_H
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>   struct rb_node
>   {
>   	unsigned long  rb_parent_color;
> diff --git a/send-utils.h b/send-utils.h
> index da407eb..8040c50 100644
> --- a/send-utils.h
> +++ b/send-utils.h
> @@ -18,8 +18,13 @@
>   #ifndef SEND_UTILS_H_
>   #define SEND_UTILS_H_
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "ctree.h"
>   #include "rbtree.h"
> +#else
> +#include <btrfs/ctree.h>
> +#include <btrfs/rbtree.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   enum subvol_search_type {
>   	subvol_search_by_root_id,
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Fasheh Jan. 11, 2013, 11 p.m. UTC | #2
On Fri, Jan 11, 2013 at 05:31:09PM +0800, Anand Jain wrote:
>
> Mark,
>
> test case :
>  make (Do not run make all)
>  make install
Thanks for testing!

> generates the following error..
>
> install -m755 -d /usr/local/lib
> install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so /usr/local/lib
> install: cannot stat `libbtrfs.so.1.0': No such file or directory
> install: cannot stat `libbtrfs.so.1': No such file or directory
> install: cannot stat `libbtrfs.so': No such file or directory
> make: *** [install] Error 1

Ok, that's weird because this works fine for me. Just in case, I tried
against a clean checkout of btrfs-progs and with the patches taken from the
mailing list:

mfasheh@eris:/build/mfasheh/tmp> git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
Cloning into btrfs-progs...
<snip>
mfasheh@eris:/build/mfasheh/tmp> cd btrfs-progs/
mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> git am ../to-apply
Applying: btrfs-progs: Add support for BTRFS_SEND_FLAG_NO_FILE_DATA
Applying: btrfs-progs: libify some parts of btrfs-progs
Applying: btrfs-progs: add send-test
/build/mfasheh/tmp/btrfs-progs/.git/rebase-apply/patch:39: trailing
whitespace.
 * This code is adapted from cmds-send.c and cmds-receive.c,
warning: 1 line adds whitespace errors.
mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> make
<snip, but suffice to say it builds>
mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> mkdir tmpinst
mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> make prefix=tmpinst install
cd man; make install
make[1]: Entering directory `/build/mfasheh/tmp/btrfs-progs/man'
install -m755 -d tmpinst/man/man8
install -m 644 mkfs.btrfs.8.gz btrfsctl.8.gz btrfsck.8.gz btrfs-image.8.gz
btrfs-show.8.gz btrfs.8.gz tmpinst/man/man8
make[1]: Leaving directory `/build/mfasheh/tmp/btrfs-progs/man'
install -m755 -d tmpinst/bin
install btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck
btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert
btrfs-find-root btrfs-restor
install -m755 -d tmpinst/lib
install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so tmpinst/lib
install -m755 -d tmpinst/include/btrfs
install send-stream.h send-utils.h send.h rbtree.h btrfs-list.h crc32c.h
list.h kerncompat.h radix-tree.h extent-cache.h extent_io.h ioctl.h ctree.h
tmpinst/include/btrfs


Can you take a log of the build process and send that to me. If libbtrfs
isn't building on your end for some reason than that would be why it won't
install.

Thanks again for testing this Anand!
	--Mark

--
Mark Fasheh
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Anand Jain Jan. 14, 2013, 3:42 a.m. UTC | #3
Mark,

  Its bit strange, the steps given before can reproduce
  the problem still on my older workspace. However when
  I try with the fresh clone, it can reproduce the issue
  (4 times, consistently) only with the following (new)
  steps..

-----------------
# git clone 
git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git

# cd btrfs-progs/
# make version; make install
::
# git am ../../../patch/libbtrfs/*
Applying: btrfs-progs: Add support for BTRFS_SEND_FLAG_NO_FILE_DATA
Applying: btrfs-progs: libify some parts of btrfs-progs
Applying: btrfs-progs: add send-test
/usr/src/cli/tmp/tmp7/btrfs-progs/.git/rebase-apply/patch:39: trailing 
whitespace.
  * This code is adapted from cmds-send.c and cmds-receive.c,
warning: 1 line adds whitespace errors.

# make install  (the problem does not happen for: 'make; make install')
::
install -m755 -d /usr/local/bin
install btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol 
btrfsck btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert 
btrfs-find-root btrfs-restore btrfstune /usr/local/bin
install -m755 -d /usr/local/lib
install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so /usr/local/lib
install: cannot stat `libbtrfs.so.1.0': No such file or directory
install: cannot stat `libbtrfs.so.1': No such file or directory
install: cannot stat `libbtrfs.so': No such file or directory
make: *** [install] Error 1
#
----------------


Thanks, Anand


On 01/12/2013 07:00 AM, Mark Fasheh wrote:
> On Fri, Jan 11, 2013 at 05:31:09PM +0800, Anand Jain wrote:
>>
>> Mark,
>>
>> test case :
>>   make (Do not run make all)
>>   make install
> Thanks for testing!
>
>> generates the following error..
>>
>> install -m755 -d /usr/local/lib
>> install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so /usr/local/lib
>> install: cannot stat `libbtrfs.so.1.0': No such file or directory
>> install: cannot stat `libbtrfs.so.1': No such file or directory
>> install: cannot stat `libbtrfs.so': No such file or directory
>> make: *** [install] Error 1
>
> Ok, that's weird because this works fine for me. Just in case, I tried
> against a clean checkout of btrfs-progs and with the patches taken from the
> mailing list:
>
> mfasheh@eris:/build/mfasheh/tmp> git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
> Cloning into btrfs-progs...
> <snip>
> mfasheh@eris:/build/mfasheh/tmp> cd btrfs-progs/
> mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> git am ../to-apply
> Applying: btrfs-progs: Add support for BTRFS_SEND_FLAG_NO_FILE_DATA
> Applying: btrfs-progs: libify some parts of btrfs-progs
> Applying: btrfs-progs: add send-test
> /build/mfasheh/tmp/btrfs-progs/.git/rebase-apply/patch:39: trailing
> whitespace.
>   * This code is adapted from cmds-send.c and cmds-receive.c,
> warning: 1 line adds whitespace errors.
> mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> make
> <snip, but suffice to say it builds>
> mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> mkdir tmpinst
> mfasheh@eris:/build/mfasheh/tmp/btrfs-progs> make prefix=tmpinst install
> cd man; make install
> make[1]: Entering directory `/build/mfasheh/tmp/btrfs-progs/man'
> install -m755 -d tmpinst/man/man8
> install -m 644 mkfs.btrfs.8.gz btrfsctl.8.gz btrfsck.8.gz btrfs-image.8.gz
> btrfs-show.8.gz btrfs.8.gz tmpinst/man/man8
> make[1]: Leaving directory `/build/mfasheh/tmp/btrfs-progs/man'
> install -m755 -d tmpinst/bin
> install btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck
> btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert
> btrfs-find-root btrfs-restor
> install -m755 -d tmpinst/lib
> install libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so tmpinst/lib
> install -m755 -d tmpinst/include/btrfs
> install send-stream.h send-utils.h send.h rbtree.h btrfs-list.h crc32c.h
> list.h kerncompat.h radix-tree.h extent-cache.h extent_io.h ioctl.h ctree.h
> tmpinst/include/btrfs
>
>
> Can you take a log of the build process and send that to me. If libbtrfs
> isn't building on your end for some reason than that would be why it won't
> install.
>
> Thanks again for testing this Anand!
> 	--Mark
>
> --
> Mark Fasheh
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Anand Jain Jan. 14, 2013, 3:43 a.m. UTC | #4
Mark,

  Good to create man libbtrfs ?

Thanks, Anand


On 01/09/2013 05:41 AM, Mark Fasheh wrote:
> External software wanting to use the functionality provided by the btrfs
> send ioctl has a hard time doing so without replicating tons of work. Of
> particular interest are functions like btrfs_read_and_process_send_stream()
> and subvol_uuid_search(). As that functionality requires a bit more than
> just send-stream.c and send-utils.c we have to pull in some other parts of
> the progs package.
>
> This patch adds code to the Makefile and headers to create a library,
> libbtrfs which the btrfs command now links to.
>
> Signed-off-by: Mark Fasheh <mfasheh@suse.de>
> ---
>   Makefile       |   38 ++++++++++++++++++++++++++++----------
>   btrfs-list.h   |    4 ++++
>   crc32c.h       |    4 ++++
>   ctree.h        |    9 +++++++++
>   extent-cache.h |    6 ++++++
>   extent_io.h    |    7 +++++++
>   radix-tree.h   |    4 ++++
>   rbtree.h       |    4 ++++
>   send-utils.h   |    5 +++++
>   9 files changed, 71 insertions(+), 10 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 4894903..29c63b1 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,14 +1,17 @@
>   CC = gcc
> -AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
> -CFLAGS = -g -O1
> +AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -DBTRFS_FLAT_INCLUDES
> +CFLAGS = -g -O1 -fPIC
>   objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
> -	  root-tree.o dir-item.o file-item.o inode-item.o \
> -	  inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
> -	  volumes.o utils.o btrfs-list.o btrfslabel.o repair.o \
> -	  send-stream.o send-utils.o qgroup.o
> +	  root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \
> +	  extent-cache.o extent_io.o volumes.o utils.o btrfslabel.o repair.o \
> +	  qgroup.o
>   cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \
>   	       cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \
>   	       cmds-quota.o cmds-qgroup.o
> +libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o
> +libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \
> +	       crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \
> +	       extent_io.h ioctl.h ctree.h
>
>   CHECKFLAGS= -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
>   	    -Wuninitialized -Wshadow -Wundef
> @@ -17,13 +20,18 @@ DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
>   INSTALL = install
>   prefix ?= /usr/local
>   bindir = $(prefix)/bin
> -LIBS=-luuid -lm
> +libdir = $(prefix)/lib
> +incdir = $(prefix)/include/btrfs
> +LIBS=-luuid -lm -L. -lbtrfs
>   RESTORE_LIBS=-lz
>
>   progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
>   	btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \
>   	btrfs-find-root btrfs-restore btrfstune
>
> +libs = libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so
> +headers = $(libbtrfs_headers)
> +
>   # make C=1 to enable sparse
>   ifdef C
>   	check = sparse $(CHECKFLAGS)
> @@ -36,11 +44,16 @@ endif
>   	$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
>
>
> -all: version $(progs) manpages
> +all: version $(libs) $(progs) manpages
>
>   version:
>   	bash version.sh
>
> +$(libs): $(libbtrfs_objects) send.h
> +	$(CC) $(CFLAGS) $(libbtrfs_objects) -shared -Wl,-soname,libbtrfs.so.1 -o libbtrfs.so.1.0
> +	ln -sf libbtrfs.so.1.0 libbtrfs.so.1
> +	ln -sf libbtrfs.so.1.0 libbtrfs.so
> +
>   btrfs: $(objects) btrfs.o help.o common.o $(cmds_objects)
>   	$(CC) $(CFLAGS) -o btrfs btrfs.o help.o common.o $(cmds_objects) \
>   		$(objects) $(LDFLAGS) $(LIBS) -lpthread
> @@ -109,12 +122,17 @@ install-man:
>   	cd man; $(MAKE) install
>
>   clean :
> -	rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image btrfs-select-super \
> -	      btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h
> +	rm -f $(progs) $(libs) cscope.out *.o .*.d btrfs-convert btrfs-image \
> +	      btrfs-select-super btrfs-zero-log btrfstune dir-test ioctl-test \
> +	      quick-test version.h
>   	cd man; $(MAKE) clean
>
>   install: $(progs) install-man
>   	$(INSTALL) -m755 -d $(DESTDIR)$(bindir)
>   	$(INSTALL) $(progs) $(DESTDIR)$(bindir)
> +	$(INSTALL) -m755 -d $(DESTDIR)$(libdir)
> +	$(INSTALL) $(libs) $(DESTDIR)$(libdir)
> +	$(INSTALL) -m755 -d $(DESTDIR)$(incdir)
> +	$(INSTALL) $(headers) $(DESTDIR)$(incdir)
>
>   -include .*.d
> diff --git a/btrfs-list.h b/btrfs-list.h
> index cde4b3c..da6bf1c 100644
> --- a/btrfs-list.h
> +++ b/btrfs-list.h
> @@ -16,7 +16,11 @@
>    * Boston, MA 021110-1307, USA.
>    */
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct root_info;
>
> diff --git a/crc32c.h b/crc32c.h
> index 7f12e77..c552ef6 100644
> --- a/crc32c.h
> +++ b/crc32c.h
> @@ -19,7 +19,11 @@
>   #ifndef __CRC32C__
>   #define __CRC32C__
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   u32 crc32c_le(u32 seed, unsigned char const *data, size_t length);
>   void crc32c_optimization_init(void);
> diff --git a/ctree.h b/ctree.h
> index 293b24f..7a1ffce 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -19,12 +19,21 @@
>   #ifndef __BTRFS__
>   #define __BTRFS__
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "list.h"
>   #include "kerncompat.h"
>   #include "radix-tree.h"
>   #include "extent-cache.h"
>   #include "extent_io.h"
>   #include "ioctl.h"
> +#else
> +#include <btrfs/list.h>
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/radix-tree.h>
> +#include <btrfs/extent-cache.h>
> +#include <btrfs/extent_io.h>
> +#include <btrfs/ioctl.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct btrfs_root;
>   struct btrfs_trans_handle;
> diff --git a/extent-cache.h b/extent-cache.h
> index 7f2f2a6..4cd0f79 100644
> --- a/extent-cache.h
> +++ b/extent-cache.h
> @@ -18,8 +18,14 @@
>
>   #ifndef __PENDING_EXTENT__
>   #define __PENDING_EXTENT__
> +
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
>   #include "rbtree.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/rbtree.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   struct cache_tree {
>   	struct rb_root root;
> diff --git a/extent_io.h b/extent_io.h
> index a5d6bf0..4553859 100644
> --- a/extent_io.h
> +++ b/extent_io.h
> @@ -18,9 +18,16 @@
>
>   #ifndef __EXTENTMAP__
>   #define __EXTENTMAP__
> +
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
>   #include "extent-cache.h"
>   #include "list.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#include <btrfs/extent-cache.h>
> +#include <btrfs/list.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   #define EXTENT_DIRTY 1
>   #define EXTENT_WRITEBACK (1 << 1)
> diff --git a/radix-tree.h b/radix-tree.h
> index d99ea7e..bf96d83 100644
> --- a/radix-tree.h
> +++ b/radix-tree.h
> @@ -37,7 +37,11 @@
>   #ifndef _LINUX_RADIX_TREE_H
>   #define _LINUX_RADIX_TREE_H
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   #define RADIX_TREE_MAX_TAGS 2
>
> diff --git a/rbtree.h b/rbtree.h
> index bed054d..b636ddd 100644
> --- a/rbtree.h
> +++ b/rbtree.h
> @@ -93,7 +93,11 @@ static inline struct page * rb_insert_page_cache(struct inode * inode,
>
>   #ifndef	_LINUX_RBTREE_H
>   #define	_LINUX_RBTREE_H
> +#if BTRFS_FLAT_INCLUDES
>   #include "kerncompat.h"
> +#else
> +#include <btrfs/kerncompat.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>   struct rb_node
>   {
>   	unsigned long  rb_parent_color;
> diff --git a/send-utils.h b/send-utils.h
> index da407eb..8040c50 100644
> --- a/send-utils.h
> +++ b/send-utils.h
> @@ -18,8 +18,13 @@
>   #ifndef SEND_UTILS_H_
>   #define SEND_UTILS_H_
>
> +#if BTRFS_FLAT_INCLUDES
>   #include "ctree.h"
>   #include "rbtree.h"
> +#else
> +#include <btrfs/ctree.h>
> +#include <btrfs/rbtree.h>
> +#endif /* BTRFS_FLAT_INCLUDES */
>
>   enum subvol_search_type {
>   	subvol_search_by_root_id,
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Fasheh Jan. 14, 2013, 6:10 p.m. UTC | #5
On Mon, Jan 14, 2013 at 11:43:44AM +0800, Anand Jain wrote:
>
> Mark,
>
>  Good to create man libbtrfs ?

Are you asking if you should do this? If so yeah for sure, I won't complain
about sharing the work!

If you're asking whether I should, I'm not sure. I suppose it's probably a
good idea :) I'll have to look at other libfs manpages first to get an idea
of what goes in there.

At any rate, thanks :)
	--Mark

--
Mark Fasheh
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Fasheh Jan. 14, 2013, 6:16 p.m. UTC | #6
On Mon, Jan 14, 2013 at 11:42:05AM +0800, Anand Jain wrote:
>
>
> Mark,
>
>  Its bit strange, the steps given before can reproduce
>  the problem still on my older workspace. However when
>  I try with the fresh clone, it can reproduce the issue
>  (4 times, consistently) only with the following (new)
>  steps..

Ok.


> # git clone 
> git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
>
> # cd btrfs-progs/
> # make version; make install

Ahh, this *does* reproduce for me. I think we just need to add libbtrfs as a
target somewhere. I'll fix it up. Thanks so much for drilling down to a test
case!
	--Mark

--
Mark Fasheh
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Fasheh Jan. 14, 2013, 10:27 p.m. UTC | #7
On Mon, Jan 14, 2013 at 11:42:05AM +0800, Anand Jain wrote:
>  Its bit strange, the steps given before can reproduce
>  the problem still on my older workspace. However when
>  I try with the fresh clone, it can reproduce the issue
>  (4 times, consistently) only with the following (new)
>  steps..
>
> -----------------
> # git clone 
> git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
>
> # cd btrfs-progs/
> # make version; make install

Ok, I was able to fix this by adding the libs target to the various other
targets.

A series of patches with all the fixes (build and whitespace) and Arvin's
patch can be found at:

https://github.com/markfasheh/btrfs-progs-patches/tree/no-data-and-libify

If nothing else comes up, I will send them out tommorrow. Thanks again to
you all for looking at this.
	--Mark

--
Mark Fasheh
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Anand Jain Jan. 15, 2013, 8:06 a.m. UTC | #8
better if its there (man libbtrfs).  pls create if you could.

Thanks, Anand

On 01/15/2013 02:10 AM, Mark Fasheh wrote:
> On Mon, Jan 14, 2013 at 11:43:44AM +0800, Anand Jain wrote:
>>
>> Mark,
>>
>>   Good to create man libbtrfs ?
>
> Are you asking if you should do this? If so yeah for sure, I won't complain
> about sharing the work!
>
> If you're asking whether I should, I'm not sure. I suppose it's probably a
> good idea :) I'll have to look at other libfs manpages first to get an idea
> of what goes in there.
>
> At any rate, thanks :)
> 	--Mark
>
> --
> Mark Fasheh
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Fasheh Jan. 16, 2013, 10:11 p.m. UTC | #9
On Tue, Jan 15, 2013 at 04:06:42PM +0800, Anand Jain wrote:
>  better if its there (man libbtrfs).  pls create if you could.

Hmm, I'm confused though - what exactly goes into a file system library man
page? Could you point me to an example one?
	--Mark

--
Mark Fasheh
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 4894903..29c63b1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,17 @@ 
 CC = gcc
-AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
-CFLAGS = -g -O1
+AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -DBTRFS_FLAT_INCLUDES
+CFLAGS = -g -O1 -fPIC
 objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \
-	  root-tree.o dir-item.o file-item.o inode-item.o \
-	  inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \
-	  volumes.o utils.o btrfs-list.o btrfslabel.o repair.o \
-	  send-stream.o send-utils.o qgroup.o
+	  root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \
+	  extent-cache.o extent_io.o volumes.o utils.o btrfslabel.o repair.o \
+	  qgroup.o
 cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \
 	       cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \
 	       cmds-quota.o cmds-qgroup.o
+libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o
+libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \
+	       crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \
+	       extent_io.h ioctl.h ctree.h
 
 CHECKFLAGS= -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \
 	    -Wuninitialized -Wshadow -Wundef
@@ -17,13 +20,18 @@  DEPFLAGS = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
 INSTALL = install
 prefix ?= /usr/local
 bindir = $(prefix)/bin
-LIBS=-luuid -lm
+libdir = $(prefix)/lib
+incdir = $(prefix)/include/btrfs
+LIBS=-luuid -lm -L. -lbtrfs
 RESTORE_LIBS=-lz
 
 progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \
 	btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \
 	btrfs-find-root btrfs-restore btrfstune
 
+libs = libbtrfs.so.1.0 libbtrfs.so.1 libbtrfs.so
+headers = $(libbtrfs_headers)
+
 # make C=1 to enable sparse
 ifdef C
 	check = sparse $(CHECKFLAGS)
@@ -36,11 +44,16 @@  endif
 	$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
 
 
-all: version $(progs) manpages
+all: version $(libs) $(progs) manpages
 
 version:
 	bash version.sh
 
+$(libs): $(libbtrfs_objects) send.h
+	$(CC) $(CFLAGS) $(libbtrfs_objects) -shared -Wl,-soname,libbtrfs.so.1 -o libbtrfs.so.1.0
+	ln -sf libbtrfs.so.1.0 libbtrfs.so.1
+	ln -sf libbtrfs.so.1.0 libbtrfs.so
+
 btrfs: $(objects) btrfs.o help.o common.o $(cmds_objects)
 	$(CC) $(CFLAGS) -o btrfs btrfs.o help.o common.o $(cmds_objects) \
 		$(objects) $(LDFLAGS) $(LIBS) -lpthread
@@ -109,12 +122,17 @@  install-man:
 	cd man; $(MAKE) install
 
 clean :
-	rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image btrfs-select-super \
-	      btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h
+	rm -f $(progs) $(libs) cscope.out *.o .*.d btrfs-convert btrfs-image \
+	      btrfs-select-super btrfs-zero-log btrfstune dir-test ioctl-test \
+	      quick-test version.h
 	cd man; $(MAKE) clean
 
 install: $(progs) install-man
 	$(INSTALL) -m755 -d $(DESTDIR)$(bindir)
 	$(INSTALL) $(progs) $(DESTDIR)$(bindir)
+	$(INSTALL) -m755 -d $(DESTDIR)$(libdir)
+	$(INSTALL) $(libs) $(DESTDIR)$(libdir)
+	$(INSTALL) -m755 -d $(DESTDIR)$(incdir)
+	$(INSTALL) $(headers) $(DESTDIR)$(incdir)
 
 -include .*.d
diff --git a/btrfs-list.h b/btrfs-list.h
index cde4b3c..da6bf1c 100644
--- a/btrfs-list.h
+++ b/btrfs-list.h
@@ -16,7 +16,11 @@ 
  * Boston, MA 021110-1307, USA.
  */
 
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
+#else
+#include <btrfs/kerncompat.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 struct root_info;
 
diff --git a/crc32c.h b/crc32c.h
index 7f12e77..c552ef6 100644
--- a/crc32c.h
+++ b/crc32c.h
@@ -19,7 +19,11 @@ 
 #ifndef __CRC32C__
 #define __CRC32C__
 
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
+#else
+#include <btrfs/kerncompat.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 u32 crc32c_le(u32 seed, unsigned char const *data, size_t length);
 void crc32c_optimization_init(void);
diff --git a/ctree.h b/ctree.h
index 293b24f..7a1ffce 100644
--- a/ctree.h
+++ b/ctree.h
@@ -19,12 +19,21 @@ 
 #ifndef __BTRFS__
 #define __BTRFS__
 
+#if BTRFS_FLAT_INCLUDES
 #include "list.h"
 #include "kerncompat.h"
 #include "radix-tree.h"
 #include "extent-cache.h"
 #include "extent_io.h"
 #include "ioctl.h"
+#else
+#include <btrfs/list.h>
+#include <btrfs/kerncompat.h>
+#include <btrfs/radix-tree.h>
+#include <btrfs/extent-cache.h>
+#include <btrfs/extent_io.h>
+#include <btrfs/ioctl.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 struct btrfs_root;
 struct btrfs_trans_handle;
diff --git a/extent-cache.h b/extent-cache.h
index 7f2f2a6..4cd0f79 100644
--- a/extent-cache.h
+++ b/extent-cache.h
@@ -18,8 +18,14 @@ 
 
 #ifndef __PENDING_EXTENT__
 #define __PENDING_EXTENT__
+
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
 #include "rbtree.h"
+#else
+#include <btrfs/kerncompat.h>
+#include <btrfs/rbtree.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 struct cache_tree {
 	struct rb_root root;
diff --git a/extent_io.h b/extent_io.h
index a5d6bf0..4553859 100644
--- a/extent_io.h
+++ b/extent_io.h
@@ -18,9 +18,16 @@ 
 
 #ifndef __EXTENTMAP__
 #define __EXTENTMAP__
+
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
 #include "extent-cache.h"
 #include "list.h"
+#else
+#include <btrfs/kerncompat.h>
+#include <btrfs/extent-cache.h>
+#include <btrfs/list.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 #define EXTENT_DIRTY 1
 #define EXTENT_WRITEBACK (1 << 1)
diff --git a/radix-tree.h b/radix-tree.h
index d99ea7e..bf96d83 100644
--- a/radix-tree.h
+++ b/radix-tree.h
@@ -37,7 +37,11 @@ 
 #ifndef _LINUX_RADIX_TREE_H
 #define _LINUX_RADIX_TREE_H
 
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
+#else
+#include <btrfs/kerncompat.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 #define RADIX_TREE_MAX_TAGS 2
 
diff --git a/rbtree.h b/rbtree.h
index bed054d..b636ddd 100644
--- a/rbtree.h
+++ b/rbtree.h
@@ -93,7 +93,11 @@  static inline struct page * rb_insert_page_cache(struct inode * inode,
 
 #ifndef	_LINUX_RBTREE_H
 #define	_LINUX_RBTREE_H
+#if BTRFS_FLAT_INCLUDES
 #include "kerncompat.h"
+#else
+#include <btrfs/kerncompat.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 struct rb_node
 {
 	unsigned long  rb_parent_color;
diff --git a/send-utils.h b/send-utils.h
index da407eb..8040c50 100644
--- a/send-utils.h
+++ b/send-utils.h
@@ -18,8 +18,13 @@ 
 #ifndef SEND_UTILS_H_
 #define SEND_UTILS_H_
 
+#if BTRFS_FLAT_INCLUDES
 #include "ctree.h"
 #include "rbtree.h"
+#else
+#include <btrfs/ctree.h>
+#include <btrfs/rbtree.h>
+#endif /* BTRFS_FLAT_INCLUDES */
 
 enum subvol_search_type {
 	subvol_search_by_root_id,