aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/uclibc/uclibc-0.9.33/posix_fallocate.patch
blob: b55fbbd6e0db85a2edcf137ecb06cd320405c8ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
Delivered-To: raj.khem@gmail.com
Received: by 10.152.129.134 with SMTP id nw6csp47712lab;
        Tue, 17 Apr 2012 00:30:48 -0700 (PDT)
Received: by 10.68.216.167 with SMTP id or7mr34112133pbc.140.1334647840512;
        Tue, 17 Apr 2012 00:30:40 -0700 (PDT)
Return-Path: <uclibc-bounces@uclibc.org>
Received: from hemlock.osuosl.org (hemlock.osuosl.org. [140.211.166.133])
        by mx.google.com with ESMTP id gr10si13305623pbc.339.2012.04.17.00.30.39;
        Tue, 17 Apr 2012 00:30:40 -0700 (PDT)
Received-SPF: neutral (google.com: 140.211.166.133 is neither permitted nor denied by best guess record for domain of uclibc-bounces@uclibc.org) client-ip=140.211.166.133;
Authentication-Results: mx.google.com; spf=neutral (google.com: 140.211.166.133 is neither permitted nor denied by best guess record for domain of uclibc-bounces@uclibc.org) smtp.mail=uclibc-bounces@uclibc.org; dkim=neutral (body hash did not verify) header.i=@gmail.com
Received: from localhost (localhost [127.0.0.1])
	by hemlock.osuosl.org (Postfix) with ESMTP id 7C494A0277;
	Tue, 17 Apr 2012 07:30:39 +0000 (UTC)
X-Virus-Scanned: amavisd-new at osuosl.org
Received: from hemlock.osuosl.org ([127.0.0.1])
	by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id ZsSp5xE48GwC; Tue, 17 Apr 2012 07:30:34 +0000 (UTC)
Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34])
	by hemlock.osuosl.org (Postfix) with ESMTP id 1C4F5A0274;
	Tue, 17 Apr 2012 07:30:33 +0000 (UTC)
X-Original-To: uclibc@lists.busybox.net
Delivered-To: uclibc@osuosl.org
Received: from fraxinus.osuosl.org (fraxinus.osuosl.org [140.211.166.137])
 by ash.osuosl.org (Postfix) with ESMTP id 17FDE8F75B
 for <uclibc@lists.busybox.net>; Tue, 17 Apr 2012 07:30:32 +0000 (UTC)
Received: from localhost (localhost [127.0.0.1])
 by fraxinus.osuosl.org (Postfix) with ESMTP id 07B491016A1
 for <uclibc@lists.busybox.net>; Tue, 17 Apr 2012 07:30:32 +0000 (UTC)
X-Virus-Scanned: amavisd-new at osuosl.org
Received: from fraxinus.osuosl.org ([127.0.0.1])
 by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id XKP7jhcUijp4 for <uclibc@lists.busybox.net>;
 Tue, 17 Apr 2012 07:30:27 +0000 (UTC)
X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6
Received: from mail-we0-f174.google.com (mail-we0-f174.google.com
 [74.125.82.174])
 by fraxinus.osuosl.org (Postfix) with ESMTPS id 2CC0B100190
 for <uclibc@uclibc.org>; Tue, 17 Apr 2012 07:30:26 +0000 (UTC)
Received: by wejx9 with SMTP id x9so5218587wej.33
 for <uclibc@uclibc.org>; Tue, 17 Apr 2012 00:30:25 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
 h=from:to:cc:subject:date:message-id:x-mailer;
 bh=vadTQ1GL81XLDadHLtwCrcdL0YvVNNbIuISfTaQphgg=;
 b=KkyW95PC1TUTmwGt+iBJ8p0FfGtTPAsTlXmul/1iH2p21itEpWkU+WcVd2jBH+jc6L
 gzf4d6K1pmmfscdbPY3OkpFfvO/v/E4KYN7JmeI+fX1NY+gLBSHhExAVhM1Opue9z09V
 54MrEMtlIA9Wo/5QPd1+W7o9gXHYEnMkoqYYZLmfPlG3+pCXZ6RP36fOZnSV44BQgOFz
 KBqn7XLo6nxgP5X/+JuEe4stvCrI9/66nX30u/Sh77a9poj5pp8hQZmtIpbbm3xRKGnM
 Fi72jNCq/0nHh3M7eMqn+rvwi1JQjk/90zWNv8v5ShAKqSJVrfqLVN72KjTJtXfLOqbL
 e2qA==
Received: by 10.216.133.72 with SMTP id p50mr8903959wei.78.1334647825412;
 Tue, 17 Apr 2012 00:30:25 -0700 (PDT)
Received: from s42.loc (85-127-86-115.dynamic.xdsl-line.inode.at.
 [85.127.86.115])
 by mx.google.com with ESMTPS id n20sm40466274wiw.5.2012.04.17.00.30.23
 (version=TLSv1/SSLv3 cipher=OTHER);
 Tue, 17 Apr 2012 00:30:24 -0700 (PDT)
Received: from cow by s42.loc with local (Exim 4.77)
 (envelope-from <rep.dot.nop@gmail.com>)
 id 1SK2rm-0008Pl-V3; Tue, 17 Apr 2012 09:30:23 +0200
From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
To: uclibc@uclibc.org
Subject: [PATCH,CFT] libc: add posix_fallocate()
Date: Tue, 17 Apr 2012 09:30:15 +0200
Message-Id: <1334647815-32315-1-git-send-email-rep.dot.nop@gmail.com>
X-Mailer: git-send-email 1.7.9.1
X-BeenThere: uclibc@uclibc.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "Discussion and development of uClibc \(the embedded C library\)"
 <uclibc.uclibc.org>
List-Unsubscribe: <http://lists.busybox.net/mailman/options/uclibc>,
 <mailto:uclibc-request@uclibc.org?subject=unsubscribe>
List-Archive: <http://lists.busybox.net/pipermail/uclibc>
List-Post: <mailto:uclibc@uclibc.org>
List-Help: <mailto:uclibc-request@uclibc.org?subject=help>
List-Subscribe: <http://lists.busybox.net/mailman/listinfo/uclibc>,
 <mailto:uclibc-request@uclibc.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: uclibc-bounces@uclibc.org
Sender: uclibc-bounces@uclibc.org

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Upstream-Status: Pending
---
 include/fcntl.h                                  |    4 +-
 libc/sysdeps/linux/common/Makefile.in            |    3 +-
 libc/sysdeps/linux/common/bits/kernel-features.h |    8 ++
 libc/sysdeps/linux/common/posix_fallocate.c      |   43 ++++++++
 libc/sysdeps/linux/common/posix_fallocate64.c    |   39 +++++++
 libc/sysdeps/linux/common/stubs.c                |    4 +
 test/.gitignore                                  |    1 +
 test/unistd/Makefile.in                          |    3 +
 test/unistd/tst-posix_fallocate.c                |  121 ++++++++++++++++++++++
 9 files changed, 222 insertions(+), 4 deletions(-)
 create mode 100644 libc/sysdeps/linux/common/posix_fallocate.c
 create mode 100644 libc/sysdeps/linux/common/posix_fallocate64.c
 create mode 100644 test/unistd/tst-posix_fallocate.c

Index: git/include/fcntl.h
===================================================================
--- git.orig/include/fcntl.h	2012-09-02 17:00:26.000000000 -0700
+++ git/include/fcntl.h	2012-09-02 17:01:51.567076705 -0700
@@ -210,9 +210,7 @@
 
 #endif
 
-#if 0 /* && defined __UCLIBC_HAS_ADVANCED_REALTIME__ */
-
-/* FIXME -- uClibc should probably implement these... */
+#if defined __UCLIBC_HAS_ADVANCED_REALTIME__
 
 /* Reserve storage for the data of the file associated with FD.
 
Index: git/libc/sysdeps/linux/common/Makefile.in
===================================================================
--- git.orig/libc/sysdeps/linux/common/Makefile.in	2012-09-02 17:00:26.000000000 -0700
+++ git/libc/sysdeps/linux/common/Makefile.in	2012-09-02 17:03:02.739079369 -0700
@@ -81,7 +81,7 @@
 	sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \
 	sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c
 # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait
-CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c
+CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c posix_fallocate.c posix_fallocate64.c
 CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c
 CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c
 CSRC-$(UCLIBC_HAS_XATTR) += xattr.c
Index: git/libc/sysdeps/linux/common/bits/kernel-features.h
===================================================================
--- git.orig/libc/sysdeps/linux/common/bits/kernel-features.h	2012-09-02 17:00:26.000000000 -0700
+++ git/libc/sysdeps/linux/common/bits/kernel-features.h	2012-09-02 17:01:51.567076705 -0700
@@ -494,6 +494,14 @@
 # define __ASSUME_PRIVATE_FUTEX	1
 #endif
 
+/* Support for fallocate was added in 2.6.23,
+   on s390 only after 2.6.23-rc1, on alpha only after 2.6.33-rc1.  */
+#if __LINUX_KERNEL_VERSION >= 0x020617 \
+    && (!defined __s390__ || __LINUX_KERNEL_VERSION >= 0x020618) \
+    && (!defined __alpha__ || __LINUX_KERNEL_VERSION >= 0x020621)
+# define __ASSUME_FALLOCATE 1
+#endif
+
 /* getcpu is a syscall for x86-64 since 3.1.  */
 #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100
 # define __ASSUME_GETCPU_SYSCALL        1
Index: git/libc/sysdeps/linux/common/posix_fallocate.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ git/libc/sysdeps/linux/common/posix_fallocate.c	2012-09-02 17:01:51.579076667 -0700
@@ -0,0 +1,43 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * posix_fallocate() for uClibc
+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html
+ *
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
+
+#include <sys/syscall.h>
+#include <fcntl.h>
+#include <bits/kernel-features.h>
+#include <stdint.h>
+
+#if defined __NR_fallocate
+int posix_fallocate(int fd, __off_t offset, __off_t len)
+{
+	int ret;
+
+# if __WORDSIZE == 32
+	uint32_t off_low = offset;
+	uint32_t len_low = len;
+	/* may assert that these >>31 are 0 */
+	uint32_t zero = 0;
+	INTERNAL_SYSCALL_DECL(err);
+	ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0,
+		__LONG_LONG_PAIR (zero, off_low),
+		__LONG_LONG_PAIR (zero, len_low)));
+# elif __WORDSIZE == 64
+	INTERNAL_SYSCALL_DECL(err);
+	ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, 0, offset, len));
+# else
+# error your machine is neither 32 bit or 64 bit ... it must be magical
+#endif
+    if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err)))
+      return INTERNAL_SYSCALL_ERRNO (ret, err);
+    return 0;
+}
+# if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64
+strong_alias(posix_fallocate,posix_fallocate64)
+# endif
+#endif
Index: git/libc/sysdeps/linux/common/posix_fallocate64.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ git/libc/sysdeps/linux/common/posix_fallocate64.c	2012-09-02 17:01:51.579076667 -0700
@@ -0,0 +1,39 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * posix_fallocate() for uClibc
+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html
+ *
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
+
+#include <sys/syscall.h>
+#include <fcntl.h>
+#include <bits/kernel-features.h>
+#include <stdint.h>
+
+#if defined __NR_fallocate
+
+# if __WORDSIZE == 64
+/* Can use normal posix_fallocate() */
+# elif __WORDSIZE == 32
+int posix_fallocate64(int fd, __off64_t offset, __off64_t len)
+{
+	int ret;
+	uint32_t off_low = offset & 0xffffffff;
+	uint32_t off_high = offset >> 32;
+	uint32_t len_low = len & 0xffffffff;
+	uint32_t len_high = len >> 32;
+	INTERNAL_SYSCALL_DECL(err);
+	ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0,
+		__LONG_LONG_PAIR (off_high, off_low),
+		__LONG_LONG_PAIR (len_high, len_low)));
+    if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err)))
+      return INTERNAL_SYSCALL_ERRNO (ret, err);
+    return 0;
+}
+# else
+# error your machine is neither 32 bit or 64 bit ... it must be magical
+# endif
+#endif
Index: git/libc/sysdeps/linux/common/stubs.c
===================================================================
--- git.orig/libc/sysdeps/linux/common/stubs.c	2012-09-02 17:00:26.000000000 -0700
+++ git/libc/sysdeps/linux/common/stubs.c	2012-09-02 17:01:51.579076667 -0700
@@ -209,6 +209,10 @@
 make_stub(madvise)
 #endif
 
+#if !defined __NR_fallocate && defined __UCLIBC_HAS_ADVANCED_REALTIME__
+make_ret_stub(posix_fallocate)
+#endif
+
 #if !defined __NR_modify_ldt && defined __UCLIBC_LINUX_SPECIFIC__
 make_stub(modify_ldt)
 #endif
Index: git/test/.gitignore
===================================================================
--- git.orig/test/.gitignore	2012-09-02 17:00:26.000000000 -0700
+++ git/test/.gitignore	2012-09-02 17:01:51.579076667 -0700
@@ -302,6 +302,7 @@
 unistd/getopt
 unistd/getopt_long
 unistd/tstgetopt
+unistd/tst-posix_fallocate
 unistd/tst-preadwrite
 unistd/tst-preadwrite64
 unistd/vfork
Index: git/test/unistd/Makefile.in
===================================================================
--- git.orig/test/unistd/Makefile.in	2012-09-02 17:00:26.000000000 -0700
+++ git/test/unistd/Makefile.in	2012-09-02 17:01:51.579076667 -0700
@@ -4,6 +4,9 @@
 ifeq ($(UCLIBC_HAS_LFS),)
 TESTS_DISABLED := tst-preadwrite64
 endif
+ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),)
+TESTS_DISABLED := tst-posix_fallocate
+endif
 OPTS_getopt      := -abcXXX -9
 OPTS_getopt_long := --add XXX --delete YYY --verbose
 ifeq ($(UCLIBC_HAS_GNU_GETOPT),y)
Index: git/test/unistd/tst-posix_fallocate.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ git/test/unistd/tst-posix_fallocate.c	2012-09-02 17:01:51.579076667 -0700
@@ -0,0 +1,121 @@
+#include <fcntl.h>
+#include <sys/stat.h>
+
+static void do_prepare (void);
+#define PREPARE(argc, argv) do_prepare ()
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+#include <test-skeleton.c>
+
+static int fd;
+#ifndef O_LARGEFILE
+# error no O_LARGEFILE
+#endif
+static void
+do_prepare (void)
+{
+  fd = create_temp_file ("tst-posix_fallocate.", NULL);
+  if (fd == -1)
+    {
+      printf ("cannot create temporary file: %m\n");
+      exit (1);
+    }
+}
+
+
+static int
+do_test (void)
+{
+  struct stat64 st;
+
+  if (fstat64 (fd, &st) != 0)
+    {
+      puts ("1st fstat failed");
+      return 1;
+    }
+
+  if (st.st_size != 0)
+    {
+      puts ("file not created with size 0");
+      return 1;
+    }
+
+  if (posix_fallocate (fd, 512, 768) != 0)
+    {
+      puts ("1st posix_fallocate call failed");
+      return 1;
+    }
+
+  if (fstat64 (fd, &st) != 0)
+    {
+      puts ("2nd fstat failed");
+      return 1;
+    }
+
+  if (st.st_size != 512 + 768)
+    {
+      printf ("file size after 1st posix_fallocate call is %llu, expected %u\n",
+	      (unsigned long long int) st.st_size, 512u + 768u);
+      return 1;
+    }
+
+  if (posix_fallocate (fd, 0, 1024) != 0)
+    {
+      puts ("2nd posix_fallocate call failed");
+      return 1;
+    }
+
+  if (fstat64 (fd, &st) != 0)
+    {
+      puts ("3rd fstat failed");
+      return 1;
+    }
+
+  if (st.st_size != 512 + 768)
+    {
+      puts ("file size changed in 2nd posix_fallocate");
+      return 1;
+    }
+
+  if (posix_fallocate (fd, 2048, 64) != 0)
+    {
+      puts ("3rd posix_fallocate call failed");
+      return 1;
+    }
+
+  if (fstat64 (fd, &st) != 0)
+    {
+      puts ("4th fstat failed");
+      return 1;
+    }
+
+  if (st.st_size != 2048 + 64)
+    {
+      printf ("file size after 3rd posix_fallocate call is %llu, expected %u\n",
+	      (unsigned long long int) st.st_size, 2048u + 64u);
+      return 1;
+    }
+
+  if (posix_fallocate64 (fd, 4097ULL, 4294967295ULL + 2ULL) != 0)
+    {
+      puts ("4th posix_fallocate call failed");
+      return 1;
+    }
+
+  if (fstat64 (fd, &st) != 0)
+    {
+      puts ("5th fstat failed");
+      return 1;
+    }
+
+  if (st.st_size != 4097ULL + 4294967295ULL + 2ULL)
+    {
+      printf ("file size after 4th posix_fallocate call is %llu, expected %u\n",
+	      (unsigned long long int) st.st_size, 4097ULL + 4294967295ULL + 2ULL);
+      return 1;
+    }
+
+  close (fd);
+
+  return 0;
+}