]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Add kmem_asprintf(), strfree(), strdup(), and minor cleanup.
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 11 Jun 2010 21:48:18 +0000 (14:48 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 11 Jun 2010 22:57:25 +0000 (15:57 -0700)
This patch adds three missing Solaris functions: kmem_asprintf(), strfree(),
and strdup().  They are all implemented as a thin layer which just calls
their Linux counterparts.  As part of this an autoconf check for kvasprintf
was added because it does not appear in older kernels.  If the kernel does
not provide it then spl-generic implements it.

Additionally the dead DEBUG_KMEM_UNIMPLEMENTED code was removed to clean
things up and make the kmem.h a little more readable.

config/spl-build.m4
configure
include/sys/kmem.h
module/spl/spl-kmem.c
spl_config.h.in

index a0fdb3e822849f7385983c56ab4b4acb819d5929..6f312e25a7a34de7596adfb7548530a3003274bf 100644 (file)
@@ -75,6 +75,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_GROUPS_SEARCH
        SPL_AC_PUT_TASK_STRUCT
        SPL_AC_5ARGS_PROC_HANDLER
+       SPL_AC_KVASPRINTF
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -1399,3 +1400,16 @@ AC_DEFUN([SPL_AC_5ARGS_PROC_HANDLER], [
                AC_MSG_RESULT(no)
        ])
 ])
+
+dnl #
+dnl # 2.6.x API change,
+dnl # kvasprintf() function added.
+dnl #
+AC_DEFUN([SPL_AC_KVASPRINTF], [
+       SPL_CHECK_SYMBOL_EXPORT(
+               [kvasprintf],
+               [],
+               [AC_DEFINE(HAVE_KVASPRINTF, 1,
+               [kvasprintf() is available])],
+               [])
+])
index cbdca77593e6906a9c7a1655f8f21dcedf63ad86..cd227c18abe5cd78749ee8c3e1071af707c26b4d 100755 (executable)
--- a/configure
+++ b/configure
 
 
 
+
+       { $as_echo "$as_me:$LINENO: checking whether symbol kvasprintf is exported" >&5
+$as_echo_n "checking whether symbol kvasprintf is exported... " >&6; }
+       grep -q -E '[[:space:]]kvasprintf[[:space:]]' \
+               $LINUX_OBJ/Module*.symvers 2>/dev/null
+       rc=$?
+       if test $rc -ne 0; then
+               export=0
+               for file in ; do
+                       grep -q -E "EXPORT_SYMBOL.*(kvasprintf)" \
+                               "$LINUX_OBJ/$file" 2>/dev/null
+                       rc=$?
+                       if test $rc -eq 0; then
+                               export=1
+                               break;
+                       fi
+               done
+               if test $export -eq 0; then
+                       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+               else
+                       { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KVASPRINTF 1
+_ACEOF
+
+               fi
+       else
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KVASPRINTF 1
+_ACEOF
+
+       fi
+
+
  ;;
                 user)      ;;
                 all)
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether symbol kvasprintf is exported" >&5
+$as_echo_n "checking whether symbol kvasprintf is exported... " >&6; }
+       grep -q -E '[[:space:]]kvasprintf[[:space:]]' \
+               $LINUX_OBJ/Module*.symvers 2>/dev/null
+       rc=$?
+       if test $rc -ne 0; then
+               export=0
+               for file in ; do
+                       grep -q -E "EXPORT_SYMBOL.*(kvasprintf)" \
+                               "$LINUX_OBJ/$file" 2>/dev/null
+                       rc=$?
+                       if test $rc -eq 0; then
+                               export=1
+                               break;
+                       fi
+               done
+               if test $export -eq 0; then
+                       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+               else
+                       { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KVASPRINTF 1
+_ACEOF
+
+               fi
+       else
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KVASPRINTF 1
+_ACEOF
+
+       fi
+
+
+
                            ;;
                srpm)                        ;;
                 *)
index 2dd73a8e512c2ada450e61f61c70262123ec25c2..b6da6d0ac2446e1238a99cef30cbe46b810c7518 100644 (file)
@@ -25,8 +25,6 @@
 #ifndef _SPL_KMEM_H
 #define        _SPL_KMEM_H
 
-#undef DEBUG_KMEM_UNIMPLEMENTED
-
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
@@ -218,14 +216,6 @@ extern void vmem_free_debug(void *ptr, size_t size);
 
 #endif /* DEBUG_KMEM */
 
-#ifdef DEBUG_KMEM_UNIMPLEMENTED
-static __inline__ void *
-kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags)
-{
-#error "kmem_alloc_tryhard() not implemented"
-}
-#endif /* DEBUG_KMEM_UNIMPLEMENTED */
-
 /*
  * Slab allocation interfaces
  */
@@ -256,47 +246,10 @@ enum {
 #define KMC_REAP_CHUNK                 INT_MAX
 #define KMC_DEFAULT_SEEKS              1
 
-#ifdef DEBUG_KMEM_UNIMPLEMENTED
-static __inline__ void kmem_init(void) {
-#error "kmem_init() not implemented"
-}
-
-static __inline__ void kmem_thread_init(void) {
-#error "kmem_thread_init() not implemented"
-}
-
-static __inline__ void kmem_mp_init(void) {
-#error "kmem_mp_init() not implemented"
-}
-
-static __inline__ void kmem_reap_idspace(void) {
-#error "kmem_reap_idspace() not implemented"
-}
-
-static __inline__ size_t kmem_avail(void) {
-#error "kmem_avail() not implemented"
-}
-
-static __inline__ size_t kmem_maxavail(void) {
-#error "kmem_maxavail() not implemented"
-}
-
-static __inline__ uint64_t kmem_cache_stat(spl_kmem_cache_t *cache) {
-#error "kmem_cache_stat() not implemented"
-}
-#endif /* DEBUG_KMEM_UNIMPLEMENTED */
-
-/* XXX - Used by arc.c to adjust its memory footprint. We may want
- *       to use this hook in the future to adjust behavior based on
- *       debug levels.  For now it's safe to always return 0.
- */
-static __inline__ int
-kmem_debugging(void)
-{
-        return 0;
-}
-
-extern int kmem_set_warning(int flag);
+extern int kmem_debugging(void);
+extern char *kmem_asprintf(const char *fmt, ...);
+#define strfree(str)           kfree(str)
+#define strdup(str)            kstrdup(str, GFP_KERNEL)
 
 extern struct list_head spl_kmem_cache_list;
 extern struct rw_semaphore spl_kmem_cache_sem;
index 5a421d40e7b1aaed9459f1d659a0abc7b9c620e7..11795954654d72d8e82a3252caa38faefa87f7a5 100644 (file)
@@ -208,6 +208,52 @@ vmem_size(vmem_t *vmp, int typemask)
 }
 EXPORT_SYMBOL(vmem_size);
 
+int
+kmem_debugging(void)
+{
+       return 0;
+}
+EXPORT_SYMBOL(kmem_debugging);
+
+#ifndef HAVE_KVASPRINTF
+/* Simplified asprintf. */
+char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
+{
+       unsigned int len;
+       char *p;
+       va_list aq;
+
+       va_copy(aq, ap);
+       len = vsnprintf(NULL, 0, fmt, aq);
+       va_end(aq);
+
+       p = kmalloc(len+1, gfp);
+       if (!p)
+               return NULL;
+
+       vsnprintf(p, len+1, fmt, ap);
+
+       return p;
+}
+EXPORT_SYMBOL(kvasprintf);
+#endif /* HAVE_KVASPRINTF */
+
+char *
+kmem_asprintf(const char *fmt, ...)
+{
+       va_list args;
+       char *ptr;
+
+       va_start(args, fmt);
+       do {
+               ptr = kvasprintf(GFP_KERNEL, fmt, args);
+       } while (ptr == NULL);
+       va_end(args);
+
+       return ptr;
+}
+EXPORT_SYMBOL(kmem_asprintf);
+
 /*
  * Memory allocation interfaces and debugging for basic kmem_*
  * and vmem_* style memory allocation.  When DEBUG_KMEM is enabled
index ac608d44fa6b654909689a13cf1d6b83684ba5d4..fdef876b3760d45d6ec1b46c7fc7d8e77d8c2138 100644 (file)
 /* kmalloc_node() is available */
 #undef HAVE_KMALLOC_NODE
 
+/* kvasprintf() is available */
+#undef HAVE_KVASPRINTF
+
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H