* [PATCH 2/2] KVM test: Turning off debug output for frequently called monitor commands
From: Lucas Meneghel Rodrigues @ 2011-04-10 22:49 UTC (permalink / raw)
To: autotest; +Cc: kvm
In-Reply-To: <1302475794-10361-1-git-send-email-lmr@redhat.com>
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
client/tests/kvm/kvm_monitor.py | 14 +++++++-------
client/tests/kvm/kvm_preprocessing.py | 6 +++---
client/tests/kvm/tests/stepmaker.py | 4 ++--
client/tests/kvm/tests/steps.py | 2 +-
4 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/client/tests/kvm/kvm_monitor.py b/client/tests/kvm/kvm_monitor.py
index 507e8dd..159c575 100644
--- a/client/tests/kvm/kvm_monitor.py
+++ b/client/tests/kvm/kvm_monitor.py
@@ -176,7 +176,7 @@ class HumanMonitor(Monitor):
"Output so far: %r" % o)
# Save the output of 'help' for future use
- self._help_str = self.cmd("help")
+ self._help_str = self.cmd("help", debug=False)
except MonitorError, e:
if suppress_exceptions:
@@ -279,7 +279,7 @@ class HumanMonitor(Monitor):
"""
Make sure the monitor is responsive by sending a command.
"""
- self.cmd("info status")
+ self.cmd("info status", debug=False)
# Command wrappers
@@ -310,14 +310,14 @@ class HumanMonitor(Monitor):
return self.info(what)
- def screendump(self, filename):
+ def screendump(self, filename, debug=True):
"""
Request a screendump.
@param filename: Location for the screendump
@return: The command's output
"""
- return self.cmd("screendump %s" % filename)
+ return self.cmd(command="screendump %s" % filename, debug=debug)
def migrate(self, uri, full_copy=False, incremental_copy=False, wait=False):
@@ -647,7 +647,7 @@ class QMPMonitor(Monitor):
"""
Make sure the monitor is responsive by sending a command.
"""
- self.cmd("query-status")
+ self.cmd(cmd="query-status", debug=False)
def get_events(self):
@@ -725,7 +725,7 @@ class QMPMonitor(Monitor):
return self.info(what)
- def screendump(self, filename):
+ def screendump(self, filename, debug=True):
"""
Request a screendump.
@@ -733,7 +733,7 @@ class QMPMonitor(Monitor):
@return: The response to the command
"""
args = {"filename": filename}
- return self.cmd("screendump", args)
+ return self.cmd(cmd="screendump", args=args, debug=debug)
def migrate(self, uri, full_copy=False, incremental_copy=False, wait=False):
diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
index e2cafe9..f679be0 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -85,7 +85,7 @@ def preprocess_vm(test, params, env, name):
scrdump_filename = os.path.join(test.debugdir, "pre_%s.ppm" % name)
try:
if vm.monitor:
- vm.monitor.screendump(scrdump_filename)
+ vm.monitor.screendump(scrdump_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
@@ -121,7 +121,7 @@ def postprocess_vm(test, params, env, name):
scrdump_filename = os.path.join(test.debugdir, "post_%s.ppm" % name)
try:
if vm.monitor:
- vm.monitor.screendump(scrdump_filename)
+ vm.monitor.screendump(scrdump_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
@@ -414,7 +414,7 @@ def _take_screendumps(test, params, env):
if not vm.is_alive():
continue
try:
- vm.monitor.screendump(temp_filename)
+ vm.monitor.screendump(filename=temp_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
continue
diff --git a/client/tests/kvm/tests/stepmaker.py b/client/tests/kvm/tests/stepmaker.py
index 5a9acdc..54f0e2b 100755
--- a/client/tests/kvm/tests/stepmaker.py
+++ b/client/tests/kvm/tests/stepmaker.py
@@ -138,7 +138,7 @@ class StepMaker(stepeditor.StepMakerWindow):
os.unlink(self.screendump_filename)
try:
- self.vm.monitor.screendump(self.screendump_filename)
+ self.vm.monitor.screendump(self.screendump_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
else:
@@ -292,7 +292,7 @@ class StepMaker(stepeditor.StepMakerWindow):
os.unlink(self.screendump_filename)
try:
- self.vm.monitor.screendump(self.screendump_filename)
+ self.vm.monitor.screendump(self.screendump_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
else:
diff --git a/client/tests/kvm/tests/steps.py b/client/tests/kvm/tests/steps.py
index 91b864d..3ad0143 100644
--- a/client/tests/kvm/tests/steps.py
+++ b/client/tests/kvm/tests/steps.py
@@ -86,7 +86,7 @@ def barrier_2(vm, words, params, debug_dir, data_scrdump_filename,
# Request screendump
try:
- vm.monitor.screendump(scrdump_filename)
+ vm.monitor.screendump(scrdump_filename, debug=False)
except kvm_monitor.MonitorError, e:
logging.warn(e)
continue
--
1.7.4.2
^ permalink raw reply related
* [PATCH 1/2] KVM test: Introducing monitor commands and response logging
From: Lucas Meneghel Rodrigues @ 2011-04-10 22:49 UTC (permalink / raw)
To: autotest; +Cc: kvm
In several KVM tests, it is very useful to log commands sent
to the monitor and their responses, but most of the time
output from such commands in verify_responsive and screendump
threads are not necessary. So, introduce the param debug in
monitor.cmd(), that defaults to True, and then later turn
off selectively outputs from the parts of the framework
where monitor commands are excessively called and their
output is not so interesting.
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
client/tests/kvm/kvm_monitor.py | 23 +++++++++++++++++++++--
1 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/client/tests/kvm/kvm_monitor.py b/client/tests/kvm/kvm_monitor.py
index 8cf2441..507e8dd 100644
--- a/client/tests/kvm/kvm_monitor.py
+++ b/client/tests/kvm/kvm_monitor.py
@@ -228,18 +228,22 @@ class HumanMonitor(Monitor):
# Public methods
- def cmd(self, command, timeout=20):
+ def cmd(self, command, timeout=20, debug=True):
"""
Send command to the monitor.
@param command: Command to send to the monitor
@param timeout: Time duration to wait for the (qemu) prompt to return
+ @param debug: Whether to print the commands being sent and responses
@return: Output received from the monitor
@raise MonitorLockError: Raised if the lock cannot be acquired
@raise MonitorSocketError: Raised if a socket error occurs
@raise MonitorProtocolError: Raised if the (qemu) prompt cannot be
found after sending the command
"""
+ if debug:
+ logging.debug("(monitor %s) Sending command '%s'",
+ self.name, command)
if not self._acquire_lock(20):
raise MonitorLockError("Could not acquire exclusive lock to send "
"monitor command '%s'" % command)
@@ -255,6 +259,12 @@ class HumanMonitor(Monitor):
o = "\n".join(o.splitlines()[1:])
# Report success/failure
if s:
+ if debug and o:
+ logging.debug("(monitor %s) "
+ "Response to '%s'", self.name,
+ command)
+ for l in o.splitlines():
+ logging.debug("(monitor %s) %s", self.name, l)
return o
else:
msg = ("Could not find (qemu) prompt after command '%s'. "
@@ -514,7 +524,7 @@ class QMPMonitor(Monitor):
# Public methods
- def cmd(self, cmd, args=None, timeout=20):
+ def cmd(self, cmd, args=None, timeout=20, debug=True):
"""
Send a QMP monitor command and return the response.
@@ -532,6 +542,9 @@ class QMPMonitor(Monitor):
(the exception's args are (cmd, args, data) where data is the
error data)
"""
+ if debug:
+ logging.debug("(monitor %s) Sending command '%s'",
+ self.name, cmd)
if not self._acquire_lock(20):
raise MonitorLockError("Could not acquire exclusive lock to send "
"QMP command '%s'" % cmd)
@@ -550,6 +563,12 @@ class QMPMonitor(Monitor):
"response with an incorrect id"
% cmd)
if "return" in r:
+ if debug and r["return"]:
+ logging.debug("(monitor %s) "
+ "Response to '%s'", self.name, cmd)
+ o = str(r["return"])
+ for l in o.splitlines():
+ logging.debug("(monitor %s) %s", self.name, l)
return r["return"]
if "error" in r:
raise QMPCmdError(cmd, args, r["error"])
--
1.7.4.2
^ permalink raw reply related
* [PATCH 2.6.39] V4L: videobuf-dma-contig: fix mmap_mapper broken on ARM
From: Janusz Krzysztofik @ 2011-04-10 22:47 UTC (permalink / raw)
To: Linux Media Mailing List
Cc: Mauro Carvalho Chehab, linux-arm-kernel, Jiri Slaby
After switching from mem->dma_handle to virt_to_phys(mem->vaddr) used
for obtaining page frame number passed to remap_pfn_range()
(commit 35d9f510b67b10338161aba6229d4f55b4000f5b), videobuf-dma-contig
stopped working on my ARM based board. The ARM architecture maintainer,
Russell King, confirmed that using something like
virt_to_phys(dma_alloc_coherent()) is not supported on ARM, and can be
broken on other architectures as well. The author of the change, Jiri
Slaby, also confirmed that his code may not work on all architectures.
The patch takes two different countermeasures against this regression:
1. On architectures which provide dma_mmap_coherent() function (ARM for
now), use it instead of just remap_pfn_range(). The code is stollen
from sound/core/pcm_native.c:snd_pcm_default_mmap().
Set vma->vm_pgoff to 0 before calling dma_mmap_coherent(), or it
fails.
2. On other architectures, use virt_to_phys(bus_to_virt(mem->dma_handle))
instead of problematic virt_to_phys(mem->vaddr). This should work
even if those translations would occure inaccurate for DMA addresses,
since possible errors introduced by both calculations, performed in
opposite directions, should compensate.
Both solutions tested on ARM OMAP1 based Amstrad Delta board.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
---
drivers/media/video/videobuf-dma-contig.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
--- linux-2.6.39-rc2/drivers/media/video/videobuf-dma-contig.c.orig 2011-04-09 00:38:45.000000000 +0200
+++ linux-2.6.39-rc2/drivers/media/video/videobuf-dma-contig.c 2011-04-10 15:00:23.000000000 +0200
@@ -295,13 +295,26 @@ static int __videobuf_mmap_mapper(struct
/* Try to remap memory */
+#ifndef ARCH_HAS_DMA_MMAP_COHERENT
+/* This should be defined / handled globally! */
+#ifdef CONFIG_ARM
+#define ARCH_HAS_DMA_MMAP_COHERENT
+#endif
+#endif
+
+#ifdef ARCH_HAS_DMA_MMAP_COHERENT
+ vma->vm_pgoff = 0;
+ retval = dma_mmap_coherent(q->dev, vma, mem->vaddr, mem->dma_handle,
+ mem->size);
+#else
size = vma->vm_end - vma->vm_start;
size = (size < mem->size) ? size : mem->size;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
retval = remap_pfn_range(vma, vma->vm_start,
- PFN_DOWN(virt_to_phys(mem->vaddr)),
- size, vma->vm_page_prot);
+ PFN_DOWN(virt_to_phys(bus_to_virt(mem->dma_handle))),
+ size, vma->vm_page_prot);
+#endif
if (retval) {
dev_err(q->dev, "mmap: remap failed with error %d. ", retval);
dma_free_coherent(q->dev, mem->size,
^ permalink raw reply
* [PATCHv2 1/3] --dirstat: Describe non-obvious differences relative to --stat or regular diff
From: Johan Herland @ 2011-04-10 22:48 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Linus Torvalds, Johan Herland
In-Reply-To: <1302475732-741-1-git-send-email-johan@herland.net>
Also add a testcase documenting the current behavior.
Improved-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
---
Documentation/diff-options.txt | 4 +++
t/t4013-diff-various.sh | 27 +++++++++++++++----
t/t4013/diff.diff_--dirstat_initial_rearrange | 2 +
...tch_--stdout_--cover-letter_-n_initial..master^ | 2 +-
t/t4013/diff.log_--decorate=full_--all | 6 ++++
t/t4013/diff.log_--decorate_--all | 6 ++++
6 files changed, 40 insertions(+), 7 deletions(-)
create mode 100644 t/t4013/diff.diff_--dirstat_initial_rearrange
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index c93124b..23772d6 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -72,6 +72,10 @@ endif::git-format-patch[]
a cut-off percent (3% by default) are not shown. The cut-off percent
can be set with `--dirstat=<limit>`. Changes in a child directory are not
counted for the parent directory, unless `--cumulative` is used.
++
+Note that the `--dirstat` option computes the changes while ignoring
+pure code movements within a file. In other words, rearranging lines
+in a file is not counted as a change.
--dirstat-by-file[=<limit>]::
Same as `--dirstat`, but counts changed files instead of lines.
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 5daa0f2..3b1b392 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -80,18 +80,31 @@ test_expect_success setup '
git config log.showroot false &&
git commit --amend &&
+
+ GIT_AUTHOR_DATE="2006-06-26 00:06:00 +0000" &&
+ GIT_COMMITTER_DATE="2006-06-26 00:06:00 +0000" &&
+ export GIT_AUTHOR_DATE GIT_COMMITTER_DATE &&
+ git checkout -b rearrange initial &&
+ for i in B A; do echo $i; done >dir/sub &&
+ git add dir/sub &&
+ git commit -m "Rearranged lines in dir/sub" &&
+ git checkout master &&
+
git show-branch
'
: <<\EOF
! [initial] Initial
* [master] Merge branch 'side'
- ! [side] Side
----
- - [master] Merge branch 'side'
- *+ [side] Side
- * [master^] Second
-+*+ [initial] Initial
+ ! [rearrange] Rearranged lines in dir/sub
+ ! [side] Side
+----
+ + [rearrange] Rearranged lines in dir/sub
+ - [master] Merge branch 'side'
+ * + [side] Side
+ * [master^] Third
+ * [master~2] Second
++*++ [initial] Initial
EOF
V=`git version | sed -e 's/^git version //' -e 's/\./\\./g'`
@@ -287,6 +300,8 @@ diff --no-index --name-status -- dir2 dir
diff --no-index dir dir3
diff master master^ side
diff --dirstat master~1 master~2
+# --dirstat doesn't notice changes that simply rearrange existing lines
+diff --dirstat initial rearrange
EOF
test_expect_success 'log -S requires an argument' '
diff --git a/t/t4013/diff.diff_--dirstat_initial_rearrange b/t/t4013/diff.diff_--dirstat_initial_rearrange
new file mode 100644
index 0000000..fb2e17d
--- /dev/null
+++ b/t/t4013/diff.diff_--dirstat_initial_rearrange
@@ -0,0 +1,2 @@
+$ git diff --dirstat initial rearrange
+$
diff --git a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ b/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
index 1f0f9ad..3b4e113 100644
--- a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
+++ b/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
@@ -1,7 +1,7 @@
$ git format-patch --stdout --cover-letter -n initial..master^
From 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 Mon Sep 17 00:00:00 2001
From: C O Mitter <committer@example.com>
-Date: Mon, 26 Jun 2006 00:05:00 +0000
+Date: Mon, 26 Jun 2006 00:06:00 +0000
Subject: [DIFFERENT_PREFIX 0/2] *** SUBJECT HERE ***
*** BLURB HERE ***
diff --git a/t/t4013/diff.log_--decorate=full_--all b/t/t4013/diff.log_--decorate=full_--all
index d155e0b..44d4525 100644
--- a/t/t4013/diff.log_--decorate=full_--all
+++ b/t/t4013/diff.log_--decorate=full_--all
@@ -1,4 +1,10 @@
$ git log --decorate=full --all
+commit cd4e72fd96faed3f0ba949dc42967430374e2290 (refs/heads/rearrange)
+Author: A U Thor <author@example.com>
+Date: Mon Jun 26 00:06:00 2006 +0000
+
+ Rearranged lines in dir/sub
+
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, refs/heads/master)
Merge: 9a6d494 c7a2ab9
Author: A U Thor <author@example.com>
diff --git a/t/t4013/diff.log_--decorate_--all b/t/t4013/diff.log_--decorate_--all
index fd7c3e6..27d3eab 100644
--- a/t/t4013/diff.log_--decorate_--all
+++ b/t/t4013/diff.log_--decorate_--all
@@ -1,4 +1,10 @@
$ git log --decorate --all
+commit cd4e72fd96faed3f0ba949dc42967430374e2290 (rearrange)
+Author: A U Thor <author@example.com>
+Date: Mon Jun 26 00:06:00 2006 +0000
+
+ Rearranged lines in dir/sub
+
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, master)
Merge: 9a6d494 c7a2ab9
Author: A U Thor <author@example.com>
--
1.7.5.rc1.3.g4d7b
^ permalink raw reply related
* [PATCHv2 0/3] --dirstat fixes
From: Johan Herland @ 2011-04-10 22:48 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Linus Torvalds, Johan Herland
In-Reply-To: <7vtye834al.fsf@alter.siamese.dyndns.org>
Here's a reroll of the previous series. Changes since v1:
- Adopt Junio's phrasing of the differences between --dirstat and
regular diff (--stat)
- Detect and ignore pure renames in the diff queue. This is done by
comparing the SHA1s of each file pair, and if they are equal, we
know the files are identical, and should not show up in --dirstat.
As an extra bonus in this version, when the SHA1s do match, we can
bypass the usual --dirstat analysis, because we know it would find
no changes. Instead, we can directly set damage = 0 in that case.
I've looked at the contents of the diff queue and resulting output in
a variety of cases:
- files with no changes, rearranged lines, and other changes
- files that are copied, moved, or not moved
- unstaged changes, staged changes, committed changes
- diff options: (none), --stat, --dirstat, and --dirstat-by-file
- diff options: (none), -M, and -C -C
(324 variations in total) and I'm fairly sure about the current patches
and how they interact with the diff queue.
A remaining question AFAICS is if there's a different (i.e. better) way
to (cheaply) estimate the damage contributed by code movements within a
file. The current "damage = 1" approach is somewhat crude, but IMHO
still better that ignoring code movements altogether.
Have fun! :)
...Johan
Johan Herland (3):
--dirstat: Describe non-obvious differences relative to --stat or regular diff
--dirstat-by-file: Make it faster and more correct
Teach --dirstat to not completely ignore rearranged lines within a file
Documentation/diff-options.txt | 4 ++
diff.c | 40 ++++++++++++++++++--
t/t4013-diff-various.sh | 27 ++++++++++---
.../diff.diff_--dirstat-by-file_initial_rearrange | 3 +
t/t4013/diff.diff_--dirstat_initial_rearrange | 3 +
...tch_--stdout_--cover-letter_-n_initial..master^ | 2 +-
t/t4013/diff.log_--decorate=full_--all | 6 +++
t/t4013/diff.log_--decorate_--all | 6 +++
8 files changed, 80 insertions(+), 11 deletions(-)
create mode 100644 t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
create mode 100644 t/t4013/diff.diff_--dirstat_initial_rearrange
--
1.7.5.rc1.3.g4d7b
^ permalink raw reply
* [PATCH 2.6.39] V4L: videobuf-dma-contig: fix mmap_mapper broken on ARM
From: Janusz Krzysztofik @ 2011-04-10 22:47 UTC (permalink / raw)
To: linux-arm-kernel
After switching from mem->dma_handle to virt_to_phys(mem->vaddr) used
for obtaining page frame number passed to remap_pfn_range()
(commit 35d9f510b67b10338161aba6229d4f55b4000f5b), videobuf-dma-contig
stopped working on my ARM based board. The ARM architecture maintainer,
Russell King, confirmed that using something like
virt_to_phys(dma_alloc_coherent()) is not supported on ARM, and can be
broken on other architectures as well. The author of the change, Jiri
Slaby, also confirmed that his code may not work on all architectures.
The patch takes two different countermeasures against this regression:
1. On architectures which provide dma_mmap_coherent() function (ARM for
now), use it instead of just remap_pfn_range(). The code is stollen
from sound/core/pcm_native.c:snd_pcm_default_mmap().
Set vma->vm_pgoff to 0 before calling dma_mmap_coherent(), or it
fails.
2. On other architectures, use virt_to_phys(bus_to_virt(mem->dma_handle))
instead of problematic virt_to_phys(mem->vaddr). This should work
even if those translations would occure inaccurate for DMA addresses,
since possible errors introduced by both calculations, performed in
opposite directions, should compensate.
Both solutions tested on ARM OMAP1 based Amstrad Delta board.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
---
drivers/media/video/videobuf-dma-contig.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
--- linux-2.6.39-rc2/drivers/media/video/videobuf-dma-contig.c.orig 2011-04-09 00:38:45.000000000 +0200
+++ linux-2.6.39-rc2/drivers/media/video/videobuf-dma-contig.c 2011-04-10 15:00:23.000000000 +0200
@@ -295,13 +295,26 @@ static int __videobuf_mmap_mapper(struct
/* Try to remap memory */
+#ifndef ARCH_HAS_DMA_MMAP_COHERENT
+/* This should be defined / handled globally! */
+#ifdef CONFIG_ARM
+#define ARCH_HAS_DMA_MMAP_COHERENT
+#endif
+#endif
+
+#ifdef ARCH_HAS_DMA_MMAP_COHERENT
+ vma->vm_pgoff = 0;
+ retval = dma_mmap_coherent(q->dev, vma, mem->vaddr, mem->dma_handle,
+ mem->size);
+#else
size = vma->vm_end - vma->vm_start;
size = (size < mem->size) ? size : mem->size;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
retval = remap_pfn_range(vma, vma->vm_start,
- PFN_DOWN(virt_to_phys(mem->vaddr)),
- size, vma->vm_page_prot);
+ PFN_DOWN(virt_to_phys(bus_to_virt(mem->dma_handle))),
+ size, vma->vm_page_prot);
+#endif
if (retval) {
dev_err(q->dev, "mmap: remap failed with error %d. ", retval);
dma_free_coherent(q->dev, mem->size,
^ permalink raw reply
* Re: [PATCH 2.6.39] soc_camera: OMAP1: fix missing bytesperline and sizeimage initialization
From: Guennadi Liakhovetski @ 2011-04-10 22:46 UTC (permalink / raw)
To: Janusz Krzysztofik; +Cc: Linux Media Mailing List, Sergio Aguirre
In-Reply-To: <201104110000.56040.jkrzyszt@tis.icnet.pl>
On Mon, 11 Apr 2011, Janusz Krzysztofik wrote:
> Dnia niedziela 10 kwiecień 2011 o 18:00:14 Guennadi Liakhovetski
> napisał(a):
> > Hi Janusz
> >
> > On Sat, 9 Apr 2011, Janusz Krzysztofik wrote:
> > > Since commit 0e4c180d3e2cc11e248f29d4c604b6194739d05a, bytesperline
> > > and sizeimage memebers of v4l2_pix_format structure have no longer
> > > been calculated inside soc_camera_g_fmt_vid_cap(), but rather
> > > passed via soc_camera_device structure from a host driver callback
> > > invoked by soc_camera_set_fmt().
> > >
> > > OMAP1 camera host driver has never been providing these parameters,
> > > so it no longer works correctly. Fix it by adding suitable
> > > assignments to omap1_cam_set_fmt().
> >
> > Thanks for the patch, but now it looks like many soc-camera host
> > drivers are re-implementing this very same calculation in different
> > parts of their code - in try_fmt, set_fmt, get_fmt. Why don't we
> > unify them all, implement this centrally in soc_camera.c and remove
> > all those calculations?
>
> Wasn't it already unified before commit in question?
It was, but it was inconsistent. It was done centrally, and it was done in
several other drivers additionally, creating a mess.
> > Could you cook up a patch or maybe several
> > patches - for soc_camera.c and all drivers?
>
> Perhaps I could, as soon as I found some spare time, but first I'd have
> to really understand why we need bytesperline or sizeimage handling
> being changed from how they worked before commit
> 0e4c180d3e2cc11e248f29d4c604b6194739d05a was introduced. I never had a
> need to customize bytesperline or sizeimage calculations in my driver.
>
> But even then, I think these new patches would rather qualify for next
> merge window, while the OMAP1 driver case is just a regression, caused
> by an alredy applied, unrelated change to the underlying framework, and
> requires a fix if that change is not going to be reverted.
Sure, we want this fixed for the current merge window. But I think it is
possible with a relatively easy patch to soc_camera.c. I asked you,
whether you'd be able to make a patch of that kind, if you don't have
enough time ATM, I can try to make one and just ask you to test it on
omap1. I'll have a look at it tomorrow.
> Maybe the author of the change, Sergio Aguirre form TI (CCing him),
> could rework his patch in a way which wouldn't impose, as a side effect,
> the new requirement of those structure members being passed from host
> drivers?
I think we can just make an incremental patch to fill in those fields
centrally, if the driver didn't do it for us.
Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
^ permalink raw reply
* Re: [PATCH 1/2] git-sh-i18n--envsubst: our own envsubst(1) for eval_gettext()
From: Ævar Arnfjörð Bjarmason @ 2011-04-10 22:43 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
In-Reply-To: <7voc4ncg0l.fsf@alter.siamese.dyndns.org>
On Sun, Apr 3, 2011 at 21:05, Junio C Hamano <gitster@pobox.com> wrote:
> Perhaps it is not an issue in real life; after all eval_gettext interface
> is not something you invented in 5 minutes without thinking deeply, but is
> what you plan to use from outside codebase that presumably has seen a wide
> use in the field, and it may be just that I am worried too much about an
> implausible corner case, but I thought I should bring it up.
It's a corner case, but if we run into it we can easily solve it like
this:
#!/bin/sh
. gettext.sh
HOME=/home/junio
path='$HOME/.gitconfig'
var=core.i18n
(
export HOME var ;# no need for HOME, but just an illustration
# TRANSLATORS: $path will be "$HOME/.gitconfig"
eval_gettext 'Look at $path and find definition of $var variable.'; echo
)
Which results in:
$ sh /tmp/foo.sh
Look at $HOME/.gitconfig and find definition of core.i18n variable.
^ permalink raw reply
* [Bug 36121] New: starting Assassin's Creed Brotherhood (in wine) causes kernel freeze
From: bugzilla-daemon @ 2011-04-10 22:44 UTC (permalink / raw)
To: dri-devel
https://bugs.freedesktop.org/show_bug.cgi?id=36121
Summary: starting Assassin's Creed Brotherhood (in wine) causes
kernel freeze
Product: DRI
Version: DRI CVS
Platform: x86-64 (AMD64)
OS/Version: Linux (All)
Status: NEW
Severity: normal
Priority: medium
Component: DRM/Radeon
AssignedTo: dri-devel@lists.freedesktop.org
ReportedBy: mike.kaplinskiy@gmail.com
Created an attachment (id=45461)
--> (https://bugs.freedesktop.org/attachment.cgi?id=45461)
dmesg from the freeze
Once the game gets to the menu screen (after intros) it shows a white screen
(as expected, but for too long). After a few seconds the white screen goes
away, the fan stops, the monitor goes into standby, and the whole os is
unresponsive (no sysrq keys). Rebooting shows no sign that the kernel even
knows anything happened (in dmesg, etc).
This only occurs if you use wine with glsl=enabled. glsl=disabled shows a
semi-corrupt menu which you can exit without killing your system.
I'm on kernel 2.6.39-rc2 (built with NMI) and mesa git from 2011/04/08
(xorg-edgers ppa). The card is a Barts chip (6870), and glxinfo shows I'm using
r600g. Wine is version 1.3.17.
If it matters, the NMI never comes. The kernel is built with
CONFIG_FB_RADEON_DEBUG=y , but it's still rather quiet around the crash.
--
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
^ permalink raw reply
* Re: Firmware files for Ralink RT28x0
From: Larry Finger @ 2011-04-10 22:37 UTC (permalink / raw)
To: Xose Vazquez Perez; +Cc: Ben Hutchings, users, linux-wireless
In-Reply-To: <4DA22545.6050209@gmail.com>
On 04/10/2011 04:46 PM, Xose Vazquez Perez wrote:
> On 04/10/2011 11:03 PM, Ben Hutchings wrote:
>
>> These files aren't used by the Ralink drivers. So why should you
>> believe the labels on them?
>
> Because the hardware manufacturer says that:
> http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2011-March/003380.html
>
> Anyway, the firmware in staging(or ralink web) drivers look different because
> they are different _versions_ of the _same_ firmware.
>
> rt2870.bin: before 4096 bytes, now 8192 bytes.
>
>> linux-firmware is not *actively* maintained; it requires people to send
>> submissions (repeatedly...).
>
> On 04/06/2010, *ONE YEAR AGO* , I sent a patch to rt2870.bin rt2860.bin.
> It went to /dev/null
>
> A similar patch was sent by the *driver maintainer* on 10/30/2010.
> It went to /dev/null
>
> The same patch was sent by the *hardware manufacturer* on 03/11/2011
> It went to /dev/null
>
> Torvalds, Mozart and God are pending.
>
>> I think there may be a problem with distribution of Intel Pro Wireless
>> firmware because Intel requires users to accept a EULA.
>
> If it's included in Fedora then there are zero issues with licenses.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Do you still have the patch from one year ago? I would like to see what you
proposed in changes to WHENCE.
Larry
^ permalink raw reply
* [Buildroot] external-toolchain with CodeSourcery works well
From: Charles Krinke @ 2011-04-10 22:34 UTC (permalink / raw)
To: buildroot
In-Reply-To: <201104102324.27407.yann.morin.1998@anciens.enib.fr>
Thanks for the hints, Yann, and I do have a couple of puzzles concerning
directories as it is not quite clear. For instance, I have compiled the
crosstools-ng and have a myriad of directories it created. Things like
<buildDir> /bin /lib /share and under bin a bin/.build.
I gave crosstools-ng the <buildDir> which obviously buildroot knows nothing
about.
I can see in buildroot's xconfig a string that looks like
"toolchain/toolchain-crosstool-ng/crosstool-ng.config" and as a consequence
the linkage between crosstool-ng and buildroot seems a bit ambiguous to me.
I wonder if you could expound a bit on how that linkage works so I can get
it tested and do a thumbs up for crosstools-ng, please.
Charles
On Sun, Apr 10, 2011 at 2:24 PM, Yann E. MORIN <
yann.morin.1998@anciens.enib.fr> wrote:
> Charles, All,
>
> On Sunday 10 April 2011 21:10:30 Charles Krinke wrote:
> > Now, I am going to attempt to understand a bit about crosstools-ng. Here,
> I
> > am guessing a bit on configuration settings, that is, things like
> prefixes
> > and paths. Any suggestions would be gratefully appreciated.
>
> It all depends on what you are trying to do. Regarding toolchains, here is
> what buildroot can do:
> 1- build its own toolchain using the internal backend
> 2- use a pre-built toolchain already installed on your machine
> 3- use a pre-built CodeSourcery toolchain that it downloads for you
> (what you did)
> 4- build its own toolchain using the crosstool-NG backend
>
> If you want to build your own toolchain, that you later feed to buildroot
> using 2, then you'd get better chance to post your questions on the
> crosstool-NG mailing list, as it has nothing to do with buildroot.
>
> If you want to use 4, then buildroot handles all the paths and prefixes
> stuff for you, and they are even hidden in the crosstool-NG config
> menu:
> cd buildroot
> make menuconfig
> Toolchain --->
> Toolchain type (Crosstool-NG toolchain)
> [other options at your discretion]
> [then exit]
> make ctng-menuconfig
> [wait till it handles dependencies]
> [configure crosstool-NG as you need]
>
> Then if you have issues while configuring/building crosstool-NG, please
> direct your questions to the crosstool-NG mailing list. You may keep the
> buildroot mailing list copied, but only on the initial question, and
> then on the final answer, keeping the crosstool-NG discussions on the
> crosstool-NG mailing list.
>
> Regards,
> Yann E. MORIN.
>
> --
>
> .-----------------.--------------------.------------------.--------------------.
> | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics'
> conspiracy: |
> | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___
> |
> | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is
> no |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v
> conspiracy. |
>
> '------------------------------^-------^------------------^--------------------'
>
--
Charles Krinke
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20110410/e1ae20da/attachment-0001.html>
^ permalink raw reply
* How to configure dual-head for multiple Screens (:0.0, :0.1) with Sandy Bridge IGP
From: Jochen Heuer @ 2011-04-10 22:22 UTC (permalink / raw)
To: intel-gfx
Hello,
I want to run a Multi-Head setup on my new Sandy Bridge system with IGP and I
am currently failing to do so because I only get one screen no matter how I
configure xorg.conf.
Even though the Xorg.0.log tells me about two screens:
[ 711.534] (**) ServerLayout "X.org Configured"
[ 711.534] (**) |-->Screen "Screen0" (0)
[ 711.534] (**) | |-->Monitor "Monitor0"
[ 711.534] (**) | |-->Device "Card0"
[ 711.534] (**) |-->Screen "Screen1" (1)
[ 711.534] (**) | |-->Monitor "Monitor1"
[ 711.534] (**) | |-->Device "Card1"
[ 711.534] (**) |-->Input Device "Mouse0"
[ 711.534] (**) |-->Input Device "Keyboard0"
planetnew X11 # DISPLAY=:0 xdpyinfo | grep -i screen
MIT-SCREEN-SAVER
default screen number: 0
number of screens: 1
screen #0:
On my main system (AMD Phenom + AMD 5750) I got this Multi-Head setup working
just fine:
jogi@planetzork ~ $ DISPLAY=:0 xdpyinfo | grep -i screen
MIT-SCREEN-SAVER
default screen number: 0
number of screens: 2
screen #0:
screen #1:
Find my current xorg.conf attached. Is there a way I can get the intel driver
to open two screens?
Or even better a solution like this one from Dave Arlie for the intel driver:
http://airlied.livejournal.com/72187.html (two X servers one graphics card)
Many thanks in advance!
Best regards,
Jogi
^ permalink raw reply
* Re: [PATCH] 2.6.38: access permission filesystem 0.24
From: Olaf Dietsche @ 2011-04-10 21:50 UTC (permalink / raw)
To: linux-kernel; +Cc: Rod Cordova
In-Reply-To: <Pine.LNX.4.64.1103291321440.32194@fatboy.ethernet.org>
[-- Attachment #1: Type: text/plain, Size: 1293 bytes --]
This *untested* patch adds a new permission managing file system.
Furthermore, it adds two modules, which make use of this file system.
One module allows granting capabilities based on user-/groupid. The
second module allows to grant access to lower numbered ports based on
user-/groupid, too.
Changes:
- updated to 2.6.38
This patch is available at:
<http://www.olafdietsche.de/linux/accessfs/>
and attached inline below.
Regards, Olaf
Documentation/filesystems/accessfs.txt | 41 +++
fs/Kconfig | 1 +
fs/Makefile | 1 +
fs/accessfs/Kconfig | 63 +++++
fs/accessfs/Makefile | 11 +
fs/accessfs/capabilities.c | 108 ++++++++
fs/accessfs/inode.c | 432 ++++++++++++++++++++++++++++++++
fs/accessfs/ip.c | 101 ++++++++
include/linux/accessfs_fs.h | 42 +++
include/net/sock.h | 43 ++++
net/Kconfig | 12 +
net/Makefile | 1 +
net/hooks.c | 55 ++++
net/ipv4/af_inet.c | 2 +-
net/ipv6/af_inet6.c | 2 +-
15 files changed, 913 insertions(+), 2 deletions(-)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: access permission filesystem --]
[-- Type: text/x-diff, Size: 27242 bytes --]
diff --git a/Documentation/filesystems/accessfs.txt b/Documentation/filesystems/accessfs.txt
new file mode 100644
index 0000000..bf135b5
--- /dev/null
+++ b/Documentation/filesystems/accessfs.txt
@@ -0,0 +1,41 @@
+Accessfs is a permission managing filesystem. It allows to control access to
+system resources, based on file permissions. The recommended mount point for
+this file-system is /proc/access, which will appear automatically in the
+/proc filesystem.
+
+Currently there are two modules using accessfs, userports and usercaps.
+
+With userports, you will be able to control access to IP ports based
+on user-/groupid.
+
+There's no need anymore to run internet daemons as root. You can
+individually configure which user/program can bind to protected ports
+(by default, below 1024).
+
+For example, you can say, user www is allowed to bind to port 80 or
+user mail is allowed to bind to port 25. Then, you can run apache as
+user www and sendmail as user mail. Now, you don't have to rely on
+apache or sendmail giving up superuser rights to enhance security.
+
+To use this option, you need to mount the access file system
+and do a chown on the appropriate ports:
+
+# mount -t accessfs none /proc/access
+# chown www /proc/access/net/ip/bind/80
+# chown mail /proc/access/net/ip/bind/25
+
+You can grant access to a group for individual ports as well. Just say:
+
+# chgrp lp /proc/access/net/ip/bind/515
+# chown g+x /proc/access/net/ip/bind/515
+
+With usercaps, you will be able to grant capabilities based on
+user-/groupid (root by default).
+
+For example you can create a group raw and change the capability
+net_raw to this group:
+
+# chgrp raw /proc/access/capabilities/net_raw
+# chmod ug+x /proc/access/capabilities/net_raw
+# chgrp raw /sbin/ping
+# chmod u-s /sbin/ping; chmod g+s /sbin/ping
diff --git a/fs/Kconfig b/fs/Kconfig
index 3db9caa..595f6c6 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -190,6 +190,7 @@ source "fs/romfs/Kconfig"
source "fs/sysv/Kconfig"
source "fs/ufs/Kconfig"
source "fs/exofs/Kconfig"
+source "fs/accessfs/Kconfig"
endif # MISC_FILESYSTEMS
diff --git a/fs/Makefile b/fs/Makefile
index a7f7cef..281f68e 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -120,4 +120,5 @@ obj-$(CONFIG_OCFS2_FS) += ocfs2/
obj-$(CONFIG_BTRFS_FS) += btrfs/
obj-$(CONFIG_GFS2_FS) += gfs2/
obj-$(CONFIG_EXOFS_FS) += exofs/
+obj-$(CONFIG_ACCESS_FS) += accessfs/
obj-$(CONFIG_CEPH_FS) += ceph/
diff --git a/fs/accessfs/Kconfig b/fs/accessfs/Kconfig
new file mode 100644
index 0000000..9e56180
--- /dev/null
+++ b/fs/accessfs/Kconfig
@@ -0,0 +1,63 @@
+config ACCESS_FS
+ tristate "Accessfs support (Experimental)"
+ depends on EXPERIMENTAL
+ default n
+ help
+ This is a new file system to manage permissions. It is not very
+ useful on its own. You need to enable other options below.
+
+ If you're unsure, say N.
+
+config ACCESSFS_USER_PORTS
+ tristate "User permission based IP ports"
+ depends on ACCESS_FS
+ select NET_HOOKS
+ default n
+ help
+ If you say Y here, you will be able to control access to IP ports
+ based on user-/groupid. For this to work, you must say Y
+ to CONFIG_NET_HOOKS.
+
+ If you're unsure, say N.
+
+config ACCESSFS_PROT_SOCK
+ int "Range of protected ports (1024-65536)"
+ depends on ACCESSFS_USER_PORTS
+ default 1024
+ help
+ Here you can extend the range of protected ports. This is
+ from 1-1023 inclusive on normal unix systems. One use for this
+ could be to reserve ports for X11 (port 6000) or database
+ servers (port 3306 for mysql), so nobody else could grab this port.
+ The default permission for extended ports is --x--x--x.
+
+ If you build this as a module, you can specify the range of
+ protected ports at module load time (max_prot_sock).
+
+ If you're unsure, say 1024.
+
+config ACCESSFS_IGNORE_NET_BIND_SERVICE
+ bool "Ignore CAP_NET_BIND_SERVICE capability"
+ depends on ACCESSFS_USER_PORTS
+ default n
+ help
+ This option lets you decide, wether a user with
+ CAP_NET_BIND_SERVICE capability is able to override
+ your userport configuration.
+
+ If you build this as a module, you can specify this
+ option at module load time (ignore_net_bind_service).
+
+ If you're unsure, say n.
+
+config ACCESSFS_USER_CAPABILITIES
+ tristate "User permission based capabilities"
+ depends on ACCESS_FS
+ select SECURITY
+ default n
+ help
+ If you say Y here, you will be able to grant capabilities based on
+ user-/groupid (root by default). For this to work, you must say M or
+ N to CONFIG_SECURITY_CAPABILITIES.
+
+ If you're unsure, say N.
diff --git a/fs/accessfs/Makefile b/fs/accessfs/Makefile
new file mode 100644
index 0000000..63a5647
--- /dev/null
+++ b/fs/accessfs/Makefile
@@ -0,0 +1,11 @@
+#
+# Makefile for the linux accessfs routines.
+#
+
+obj-$(CONFIG_ACCESS_FS) += accessfs.o
+obj-$(CONFIG_ACCESSFS_USER_CAPABILITIES) += usercaps.o
+obj-$(CONFIG_ACCESSFS_USER_PORTS) += userports.o
+
+accessfs-objs := inode.o
+usercaps-objs := capabilities.o
+userports-objs := ip.o
diff --git a/fs/accessfs/capabilities.c b/fs/accessfs/capabilities.c
new file mode 100644
index 0000000..8c6f6ef
--- /dev/null
+++ b/fs/accessfs/capabilities.c
@@ -0,0 +1,108 @@
+/* Copyright (c) 2002-2006 Olaf Dietsche
+ *
+ * User based capabilities for Linux.
+ */
+
+#include <linux/accessfs_fs.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/security.h>
+
+/* perl -n -e 'print "\"", lc($1), "\",\n" if (m/^#define\s+CAP_(.+?)\s+\d+$/);' include/linux/capability.h */
+static const char *names[] = {
+ "chown",
+ "dac_override",
+ "dac_read_search",
+ "fowner",
+ "fsetid",
+ "kill",
+ "setgid",
+ "setuid",
+ "setpcap",
+ "linux_immutable",
+ "net_bind_service",
+ "net_broadcast",
+ "net_admin",
+ "net_raw",
+ "ipc_lock",
+ "ipc_owner",
+ "sys_module",
+ "sys_rawio",
+ "sys_chroot",
+ "sys_ptrace",
+ "sys_pacct",
+ "sys_admin",
+ "sys_boot",
+ "sys_nice",
+ "sys_resource",
+ "sys_time",
+ "sys_tty_config",
+ "mknod",
+ "lease",
+ "audit_write",
+ "audit_control",
+ "setfcap",
+ "mac_override",
+ "mac_admin",
+ "syslog",
+};
+
+static struct access_attr caps[ARRAY_SIZE(names)];
+
+static int accessfs_capable(struct task_struct *tsk, const struct cred *cred, int cap, int audit)
+{
+ if (accessfs_permitted(&caps[cap], MAY_EXEC)) {
+ /* capability granted */
+ return 0;
+ }
+
+ /* capability denied */
+ return -EPERM;
+}
+
+static struct security_operations accessfs_security_ops = {
+ .name = "usercaps",
+ .capable = accessfs_capable,
+};
+
+static void unregister_capabilities(struct accessfs_direntry *dir, int n)
+{
+ int i;
+ for (i = 0; i < n; ++i)
+ accessfs_unregister(dir, names[i]);
+}
+
+static int __init init_capabilities(void)
+{
+ struct accessfs_direntry *dir;
+ int i, err;
+ dir = accessfs_make_dirpath("capabilities");
+ if (dir == 0)
+ return -ENOTDIR;
+
+ for (i = 0; i < ARRAY_SIZE(caps); ++i) {
+ caps[i].uid = 0;
+ caps[i].gid = 0;
+ caps[i].mode = S_IXUSR;
+ err = accessfs_register(dir, names[i], &caps[i]);
+ if (err) {
+ unregister_capabilities(dir, i);
+ return err;
+ }
+ }
+
+ if (!security_module_enable(&accessfs_security_ops))
+ return -EAGAIN;
+
+ err = register_security(&accessfs_security_ops);
+ if (err != 0)
+ unregister_capabilities(dir, ARRAY_SIZE(names));
+
+ return err;
+}
+
+security_initcall(init_capabilities);
+
+MODULE_AUTHOR("Olaf Dietsche");
+MODULE_DESCRIPTION("User based capabilities");
+MODULE_LICENSE("GPL v2");
diff --git a/fs/accessfs/inode.c b/fs/accessfs/inode.c
new file mode 100644
index 0000000..832867af
--- /dev/null
+++ b/fs/accessfs/inode.c
@@ -0,0 +1,432 @@
+/* Copyright (c) 2001-2006 Olaf Dietsche
+ *
+ * Access permission filesystem for Linux.
+ *
+ * 2002 Ben Clifford, create mount point at /proc/access
+ * 2002 Ben Clifford, trying to make it work under 2.5.5-dj2
+ * (see comments: BENC255 for reminders and todos)
+ *
+ *
+ * BENC255: the kernel doesn't lock BKL for us when entering methods
+ * (see Documentation/fs/porting.txt)
+ * Need to look at code here and see if we need either the BKL
+ * or our own lock - I think probably not.
+ *
+ */
+
+#include <linux/accessfs_fs.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/pagemap.h>
+#include <linux/init.h>
+#include <linux/semaphore.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/proc_fs.h>
+#include <asm/statfs.h>
+#include <asm/uaccess.h>
+
+#define ACCESSFS_MAGIC 0x3c1d36e7
+
+static struct proc_dir_entry *mountdir = NULL;
+
+static DEFINE_MUTEX(accessfs_sem);
+
+static struct inode_operations accessfs_inode_operations;
+static struct file_operations accessfs_dir_file_operations;
+static struct inode_operations accessfs_dir_inode_operations;
+
+static inline void accessfs_readdir_aux(struct file *filp,
+ struct accessfs_direntry *dir,
+ int start, void *dirent,
+ filldir_t filldir)
+{
+ struct list_head *list;
+ int i = 2;
+ list_for_each(list, &dir->children) {
+ struct accessfs_entry *de;
+ if (i++ < start)
+ continue;
+
+ de = list_entry(list, struct accessfs_entry, siblings);
+ if (filldir(dirent, de->name, strlen(de->name), filp->f_pos,
+ de->ino, DT_UNKNOWN) < 0)
+ break;
+
+ ++filp->f_pos;
+ }
+}
+
+static int accessfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+{
+ int i;
+ struct dentry *dentry = filp->f_dentry;
+ struct accessfs_direntry *dir;
+
+ i = filp->f_pos;
+ switch (i) {
+ case 0:
+ if (filldir(dirent, ".", 1, i, dentry->d_inode->i_ino,
+ DT_DIR) < 0)
+ break;
+
+ ++i;
+ ++filp->f_pos;
+ /* NO break; */
+ case 1:
+ if (filldir(dirent, "..", 2, i,
+ dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
+ break;
+
+ ++i;
+ ++filp->f_pos;
+ /* NO break; */
+ default:
+ mutex_lock(&accessfs_sem);
+ dir = dentry->d_inode->i_private;
+ accessfs_readdir_aux(filp, dir, i, dirent, filldir);
+ mutex_unlock(&accessfs_sem);
+ break;
+ }
+
+ return 0;
+}
+
+static struct accessfs_entry *accessfs_lookup_entry(struct accessfs_entry *pe,
+ const char *name, int len)
+{
+ struct list_head *list;
+ struct accessfs_direntry *dir;
+ if (!S_ISDIR(pe->attr->mode))
+ return NULL;
+
+ dir = (struct accessfs_direntry *) pe;
+ list_for_each(list, &dir->children) {
+ struct accessfs_entry *de = list_entry(list, struct accessfs_entry, siblings);
+ if (strncmp(de->name, name, len) == 0 && de->name[len] == 0)
+ return de;
+ }
+
+ return NULL;
+}
+
+static struct accessfs_direntry accessfs_rootdir = {
+ { "/",
+ LIST_HEAD_INIT(accessfs_rootdir.node.hash),
+ LIST_HEAD_INIT(accessfs_rootdir.node.siblings),
+ 1, &accessfs_rootdir.attr },
+ NULL, LIST_HEAD_INIT(accessfs_rootdir.children),
+ { 0, 0, S_IFDIR | 0755 }
+};
+
+static void accessfs_init_inode(struct inode *inode, struct accessfs_entry *pe)
+{
+ static const struct timespec epoch = {0, 0};
+ inode->i_private = pe;
+ inode->i_uid = pe->attr->uid;
+ inode->i_gid = pe->attr->gid;
+ inode->i_mode = pe->attr->mode;
+/*
+ inode->i_blksize = PAGE_CACHE_SIZE;
+ inode->i_blocks = 0;
+ inode->i_rdev = NODEV;
+*/
+ inode->i_atime = inode->i_mtime = inode->i_ctime = epoch;
+ switch (inode->i_mode & S_IFMT) {
+ case S_IFREG:
+ inode->i_op = &accessfs_inode_operations;
+ break;
+ case S_IFDIR:
+ inode->i_op = &accessfs_dir_inode_operations;
+ inode->i_fop = &accessfs_dir_file_operations;
+ break;
+ default:
+ BUG();
+ break;
+ }
+}
+
+static struct inode *accessfs_get_root_inode(struct super_block *sb)
+{
+ struct inode *inode = new_inode(sb);
+ if (inode) {
+ mutex_lock(&accessfs_sem);
+/* inode->i_ino = accessfs_rootdir.node.ino; */
+ accessfs_init_inode(inode, &accessfs_rootdir.node);
+ accessfs_rootdir.node.ino = inode->i_ino;
+ mutex_unlock(&accessfs_sem);
+ }
+
+ return inode;
+}
+
+static LIST_HEAD(hash);
+
+static int accessfs_node_init(struct accessfs_direntry *parent,
+ struct accessfs_entry *de, const char *name,
+ size_t len, struct access_attr *attr, mode_t mode)
+{
+ static unsigned long ino = 1;
+ de->name = kmalloc(len + 1, GFP_KERNEL);
+ if (de->name == NULL)
+ return -ENOMEM;
+
+ strncpy(de->name, name, len);
+ de->name[len] = 0;
+ de->ino = ++ino;
+ de->attr = attr;
+ de->attr->uid = 0;
+ de->attr->gid = 0;
+ de->attr->mode = mode;
+
+ list_add_tail(&de->hash, &hash);
+ list_add_tail(&de->siblings, &parent->children);
+ return 0;
+}
+
+static int accessfs_mknod(struct accessfs_direntry *dir, const char *name,
+ struct access_attr *attr)
+{
+ struct accessfs_entry *pe;
+ pe = kmalloc(sizeof(struct accessfs_entry), GFP_KERNEL);
+ if (pe == NULL)
+ return -ENOMEM;
+
+ accessfs_node_init(dir, pe, name, strlen(name), attr,
+ S_IFREG | attr->mode);
+ return 0;
+}
+
+static struct accessfs_direntry *accessfs_mkdir(struct accessfs_direntry *parent,
+ const char *name, size_t len)
+{
+ int err;
+ struct accessfs_direntry *dir;
+ dir = kmalloc(sizeof(struct accessfs_direntry), GFP_KERNEL);
+ if (dir == NULL)
+ return NULL;
+
+ dir->parent = parent;
+ INIT_LIST_HEAD(&dir->children);
+ err = accessfs_node_init(parent, &dir->node, name, len, &dir->attr,
+ S_IFDIR | 0755);
+ if (err) {
+ kfree(dir);
+ dir = 0;
+ }
+
+ return dir;
+}
+
+struct accessfs_direntry *accessfs_make_dirpath(const char *name)
+{
+ struct accessfs_direntry *dir = &accessfs_rootdir;
+ const char *slash;
+ mutex_lock(&accessfs_sem);
+ do {
+ struct accessfs_entry *de;
+ size_t len;
+ while (*name == '/')
+ ++name;
+
+ slash = strchr(name, '/');
+ len = slash ? slash - name : strlen(name);
+ de = accessfs_lookup_entry(&dir->node, name, len);
+ if (de == NULL) {
+ dir = accessfs_mkdir(dir, name, len);
+ } else if (S_ISDIR(de->attr->mode)) {
+ dir = (struct accessfs_direntry *) de;
+ } else {
+ dir = NULL;
+ }
+
+ if (dir == NULL)
+ break;
+
+ name = slash + 1;
+ } while (slash != NULL);
+
+ mutex_unlock(&accessfs_sem);
+ return dir;
+}
+
+static void accessfs_unlink(struct accessfs_entry *pe)
+{
+ list_del_init(&pe->hash);
+ list_del_init(&pe->siblings);
+ kfree(pe->name);
+ kfree(pe);
+}
+
+static int accessfs_notify_change(struct dentry *dentry, struct iattr *iattr)
+{
+ struct accessfs_entry *pe;
+ struct inode *i = dentry->d_inode;
+ int err;
+ err = inode_change_ok(i, iattr);
+ if (err)
+ return err;
+
+ setattr_copy(i, iattr);
+
+ pe = (struct accessfs_entry *) i->i_private;
+ pe->attr->uid = i->i_uid;
+ pe->attr->gid = i->i_gid;
+ pe->attr->mode = i->i_mode;
+ return 0;
+}
+
+static struct inode *accessfs_iget(struct super_block *sb, unsigned long ino)
+{
+ struct list_head *list;
+ struct inode *inode = iget_locked(sb, ino);
+ if (!inode)
+ return ERR_PTR(-ENOMEM);
+
+ if (!(inode->i_state & I_NEW))
+ return inode;
+
+ mutex_lock(&accessfs_sem);
+ list_for_each(list, &hash) {
+ struct accessfs_entry *pe;
+ pe = list_entry(list, struct accessfs_entry, hash);
+ if (pe->ino == ino) {
+ accessfs_init_inode(inode, pe);
+ break;
+ }
+ }
+
+ mutex_unlock(&accessfs_sem);
+ return inode;
+}
+
+static struct dentry *accessfs_lookup(struct inode *dir, struct dentry *dentry,
+ struct nameidata *nd)
+{
+ struct inode *inode = NULL;
+ struct accessfs_entry *pe;
+ mutex_lock(&accessfs_sem);
+ pe = accessfs_lookup_entry(dir->i_private, dentry->d_name.name,
+ dentry->d_name.len);
+ mutex_unlock(&accessfs_sem);
+ if (pe)
+ inode = accessfs_iget(dir->i_sb, pe->ino);
+
+ d_add(dentry, inode);
+ return NULL;
+}
+
+static struct inode_operations accessfs_inode_operations = {
+ .setattr = accessfs_notify_change,
+};
+
+static struct inode_operations accessfs_dir_inode_operations = {
+ .lookup = accessfs_lookup,
+ .setattr = accessfs_notify_change,
+};
+
+static struct file_operations accessfs_dir_file_operations = {
+ .readdir = accessfs_readdir,
+};
+
+static struct super_operations accessfs_ops = {
+ .statfs = simple_statfs,
+};
+
+static int accessfs_fill_super(struct super_block *sb, void *data, int silent)
+{
+ struct inode *inode;
+ struct dentry *root;
+
+ sb->s_blocksize = PAGE_CACHE_SIZE;
+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
+ sb->s_magic = ACCESSFS_MAGIC;
+ sb->s_op = &accessfs_ops;
+ inode = accessfs_get_root_inode(sb);
+ if (!inode)
+ return -ENOMEM;
+
+ root = d_alloc_root(inode);
+ if (!root) {
+ iput(inode);
+ return -ENOMEM;
+ }
+
+ sb->s_root = root;
+ return 0;
+}
+
+static int accessfs_get_sb(struct file_system_type *fs_type,
+ int flags, const char *dev_name,
+ void *data, struct vfsmount *mnt)
+{
+ return get_sb_single(fs_type, flags, data, accessfs_fill_super, mnt);
+}
+
+int accessfs_permitted(struct access_attr *p, int mask)
+{
+ mode_t mode = p->mode;
+ if (current_fsuid() == p->uid)
+ mode >>= 6;
+ else if (in_group_p(p->gid))
+ mode >>= 3;
+
+ return (mode & mask) == mask;
+}
+
+int accessfs_register(struct accessfs_direntry *dir, const char *name,
+ struct access_attr *attr)
+{
+ int err;
+ if (dir == 0)
+ return -EINVAL;
+
+ mutex_lock(&accessfs_sem);
+ err = accessfs_mknod(dir, name, attr);
+ mutex_unlock(&accessfs_sem);
+ return err;
+}
+
+void accessfs_unregister(struct accessfs_direntry *dir, const char *name)
+{
+ struct accessfs_entry *pe;
+ mutex_lock(&accessfs_sem);
+ pe = accessfs_lookup_entry(&dir->node, name, strlen(name));
+ if (pe)
+ accessfs_unlink(pe);
+
+ mutex_unlock(&accessfs_sem);
+}
+
+static struct file_system_type accessfs_fs_type = {
+ .owner = THIS_MODULE,
+ .name = "accessfs",
+ .get_sb = accessfs_get_sb,
+ .kill_sb = kill_anon_super,
+};
+
+static int __init init_accessfs_fs(void)
+{
+
+ /* create mount point for accessfs */
+ mountdir = proc_mkdir("access", NULL);
+ return register_filesystem(&accessfs_fs_type);
+}
+
+static void __exit exit_accessfs_fs(void)
+{
+ unregister_filesystem(&accessfs_fs_type);
+ remove_proc_entry("access", NULL);
+}
+
+module_init(init_accessfs_fs)
+module_exit(exit_accessfs_fs)
+
+MODULE_AUTHOR("Olaf Dietsche");
+MODULE_DESCRIPTION("Access Filesystem");
+MODULE_LICENSE("GPL v2");
+
+EXPORT_SYMBOL(accessfs_permitted);
+EXPORT_SYMBOL(accessfs_make_dirpath);
+EXPORT_SYMBOL(accessfs_register);
+EXPORT_SYMBOL(accessfs_unregister);
diff --git a/fs/accessfs/ip.c b/fs/accessfs/ip.c
new file mode 100644
index 0000000..bddd2f0
--- /dev/null
+++ b/fs/accessfs/ip.c
@@ -0,0 +1,101 @@
+/* Copyright (c) 2002-2006 Olaf Dietsche
+ *
+ * User permission based port access for Linux.
+ */
+
+#include <linux/accessfs_fs.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <net/sock.h>
+
+static int max_prot_sock = CONFIG_ACCESSFS_PROT_SOCK;
+#ifndef CONFIG_ACCESSFS_IGNORE_NET_BIND_SERVICE
+#define CONFIG_ACCESSFS_IGNORE_NET_BIND_SERVICE 0
+#endif
+static int ignore_net_bind_service = CONFIG_ACCESSFS_IGNORE_NET_BIND_SERVICE;
+static struct access_attr *bind_to_port;
+
+static int accessfs_ip_prot_sock(struct socket *sock,
+ struct sockaddr *uaddr, int addr_len)
+{
+ struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
+ unsigned short snum = ntohs(addr->sin_port);
+ if (snum && snum < max_prot_sock
+ && !accessfs_permitted(&bind_to_port[snum], MAY_EXEC)
+ && (ignore_net_bind_service || !capable(CAP_NET_BIND_SERVICE)))
+ return -EACCES;
+
+ return 0;
+}
+
+static int accessfs_ip6_prot_sock(struct socket *sock,
+ struct sockaddr *uaddr, int addr_len)
+{
+ struct sockaddr_in6 *addr = (struct sockaddr_in6 *) uaddr;
+ unsigned short snum = ntohs(addr->sin6_port);
+ if (snum && snum < max_prot_sock
+ && !accessfs_permitted(&bind_to_port[snum], MAY_EXEC)
+ && !capable(CAP_NET_BIND_SERVICE))
+ return -EACCES;
+
+ return 0;
+}
+
+static struct net_hook_operations ip_net_ops = {
+ .ip_prot_sock = accessfs_ip_prot_sock,
+ .ip6_prot_sock = accessfs_ip6_prot_sock,
+};
+
+static int __init init_ip(void)
+{
+ struct accessfs_direntry *dir = accessfs_make_dirpath("net/ip/bind");
+ int i;
+
+ if (max_prot_sock < PROT_SOCK)
+ max_prot_sock = PROT_SOCK;
+ else if (max_prot_sock > 65536)
+ max_prot_sock = 65536;
+
+ bind_to_port = kmalloc(max_prot_sock * sizeof(*bind_to_port),
+ GFP_KERNEL);
+ if (bind_to_port == 0)
+ return -ENOMEM;
+
+ for (i = 1; i < max_prot_sock; ++i) {
+ char buf[sizeof("65536")];
+ bind_to_port[i].uid = 0;
+ bind_to_port[i].gid = 0;
+ bind_to_port[i].mode = i < PROT_SOCK ? S_IXUSR : S_IXUGO;
+ sprintf(buf, "%d", i);
+ accessfs_register(dir, buf, &bind_to_port[i]);
+ }
+
+ net_hooks_register(&ip_net_ops);
+ return 0;
+}
+
+static void __exit exit_ip(void)
+{
+ struct accessfs_direntry *dir = accessfs_make_dirpath("net/ip/bind");
+ int i;
+ net_hooks_unregister(&ip_net_ops);
+ for (i = 1; i < max_prot_sock; ++i) {
+ char buf[sizeof("65536")];
+ sprintf(buf, "%d", i);
+ accessfs_unregister(dir, buf);
+ }
+
+ if (bind_to_port != NULL)
+ kfree(bind_to_port);
+}
+
+module_init(init_ip)
+module_exit(exit_ip)
+
+MODULE_AUTHOR("Olaf Dietsche");
+MODULE_DESCRIPTION("User based IP ports permission");
+MODULE_LICENSE("GPL v2");
+module_param(max_prot_sock, int, 0444);
+MODULE_PARM_DESC(max_prot_sock, "Number of protected ports");
+module_param(ignore_net_bind_service, bool, 0644);
+MODULE_PARM_DESC(ignore_net_bind_service, "Ignore CAP_NET_BIND_SERVICE capability");
diff --git a/include/linux/accessfs_fs.h b/include/linux/accessfs_fs.h
new file mode 100644
index 0000000..ecd914e
--- /dev/null
+++ b/include/linux/accessfs_fs.h
@@ -0,0 +1,42 @@
+/* -*- mode: c -*- */
+#ifndef __accessfs_fs_h_included__
+#define __accessfs_fs_h_included__ 1
+
+/* Copyright (c) 2001 Olaf Dietsche
+ *
+ * Access permission filesystem for Linux.
+ */
+
+#include <linux/in.h>
+#include <linux/in6.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <net/sock.h>
+
+struct access_attr {
+ uid_t uid;
+ gid_t gid;
+ mode_t mode;
+};
+
+struct accessfs_entry {
+ char *name;
+ struct list_head hash;
+ struct list_head siblings;
+ ino_t ino;
+ struct access_attr *attr;
+};
+
+struct accessfs_direntry {
+ struct accessfs_entry node;
+ struct accessfs_direntry *parent;
+ struct list_head children;
+ struct access_attr attr;
+};
+
+extern int accessfs_permitted(struct access_attr *p, int mask);
+extern struct accessfs_direntry *accessfs_make_dirpath(const char *name);
+extern int accessfs_register(struct accessfs_direntry *dir, const char *name, struct access_attr *attr);
+extern void accessfs_unregister(struct accessfs_direntry *dir, const char *name);
+
+#endif
diff --git a/include/net/sock.h b/include/net/sock.h
index bc1cf7d8..a92c2c7 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1794,4 +1794,47 @@ extern int sysctl_optmem_max;
extern __u32 sysctl_wmem_default;
extern __u32 sysctl_rmem_default;
+/* Networking hooks */
+extern int default_ip_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len);
+extern int default_ip6_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len);
+#ifdef CONFIG_NET_HOOKS
+struct net_hook_operations {
+ int (*ip_prot_sock)(struct socket *sock,
+ struct sockaddr *uaddr, int addr_len);
+ int (*ip6_prot_sock)(struct socket *sock,
+ struct sockaddr *uaddr, int addr_len);
+};
+
+extern struct net_hook_operations *net_ops;
+
+extern void net_hooks_register(struct net_hook_operations *ops);
+extern void net_hooks_unregister(struct net_hook_operations *ops);
+
+static inline int ip_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len)
+{
+ return net_ops->ip_prot_sock(sock, uaddr, addr_len);
+}
+
+static inline int ip6_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len)
+{
+ return net_ops->ip6_prot_sock(sock, uaddr, addr_len);
+}
+#else
+static inline int ip_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len)
+{
+ return default_ip_prot_sock(sock, uaddr, addr_len);
+}
+
+static inline int ip6_prot_sock(struct socket *sock, struct sockaddr *uaddr,
+ int addr_len)
+{
+ return default_ip6_prot_sock(sock, uaddr, addr_len);
+}
+#endif
+
#endif /* _SOCK_H */
diff --git a/net/Kconfig b/net/Kconfig
index 7284062..4136811 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -75,6 +75,18 @@ config INET
if INET
source "net/ipv4/Kconfig"
source "net/ipv6/Kconfig"
+
+config NET_HOOKS
+ bool "IP: Networking hooks (Experimental)"
+ depends on INET && EXPERIMENTAL
+ default n
+ help
+ This option enables other kernel parts or modules to hook into the
+ networking area and provide fine grained control over the access to
+ IP ports.
+
+ If you're unsure, say N.
+
source "net/netlabel/Kconfig"
endif # if INET
diff --git a/net/Makefile b/net/Makefile
index a51d946..4199f6b 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -60,6 +60,7 @@ ifneq ($(CONFIG_DCB),)
obj-y += dcb/
endif
obj-$(CONFIG_IEEE802154) += ieee802154/
+obj-$(CONFIG_NET_HOOKS) += hooks.o
ifeq ($(CONFIG_NET),y)
obj-$(CONFIG_SYSCTL) += sysctl_net.o
diff --git a/net/hooks.c b/net/hooks.c
new file mode 100644
index 0000000..33100e6
--- /dev/null
+++ b/net/hooks.c
@@ -0,0 +1,55 @@
+/* Copyright (c) 2002 Olaf Dietsche
+ *
+ * Networking hooks. Currently for IPv4 and IPv6 only.
+ */
+
+#include <linux/module.h>
+#include <linux/in.h>
+#include <linux/in6.h>
+#include <net/sock.h>
+
+int default_ip_prot_sock(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+{
+ struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
+ unsigned short snum = ntohs(addr->sin_port);
+ if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
+ return -EACCES;
+
+ return 0;
+}
+
+int default_ip6_prot_sock(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+{
+ struct sockaddr_in6 *addr = (struct sockaddr_in6 *) uaddr;
+ unsigned short snum = ntohs(addr->sin6_port);
+ if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
+ return -EACCES;
+
+ return 0;
+}
+
+EXPORT_SYMBOL(default_ip_prot_sock);
+EXPORT_SYMBOL(default_ip6_prot_sock);
+
+#ifdef CONFIG_NET_HOOKS
+static struct net_hook_operations default_net_ops = {
+ .ip_prot_sock = default_ip_prot_sock,
+ .ip6_prot_sock = default_ip6_prot_sock,
+};
+
+struct net_hook_operations *net_ops = &default_net_ops;
+
+void net_hooks_register(struct net_hook_operations *ops)
+{
+ net_ops = ops;
+}
+
+void net_hooks_unregister(struct net_hook_operations *ops)
+{
+ net_ops = &default_net_ops;
+}
+
+EXPORT_SYMBOL(net_ops);
+EXPORT_SYMBOL(net_hooks_register);
+EXPORT_SYMBOL(net_hooks_unregister);
+#endif
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 45b89d7..bdda2a9 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -484,7 +484,7 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
snum = ntohs(addr->sin_port);
err = -EACCES;
- if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
+ if (ip_prot_sock(sock, uaddr, addr_len))
goto out;
/* We keep a pair of addresses. rcv_saddr is the one
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 978e80e..2465070 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -277,7 +277,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
return -EINVAL;
snum = ntohs(addr->sin6_port);
- if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
+ if (ip6_prot_sock(sock, uaddr, addr_len))
return -EACCES;
lock_sock(sk);
^ permalink raw reply related
* Re: [PATCH] unify usage of VOID
From: Christopher Li @ 2011-04-10 22:20 UTC (permalink / raw)
To: Jan Pokorný; +Cc: linux-sparse
In-Reply-To: <4DA1D9A1.3090109@seznam.cz>
Hi Jan,
You are one fire with this sparse code :-)
I will take a closer look of your patch series tonight.
Thanks
Chris
On Sun, Apr 10, 2011 at 9:24 AM, Jan Pokorný <pokorny_jan@seznam.cz> wrote:
> Also remove unneeded empty initializator of `void_pseudo'.
>
> Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
> ---
> linearize.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/linearize.c b/linearize.c
> index f2034ce..46c9726 100644
> --- a/linearize.c
> +++ b/linearize.c
> @@ -33,7 +33,7 @@ struct access_data;
> static pseudo_t add_load(struct entrypoint *ep, struct access_data *);
> static pseudo_t linearize_initializer(struct entrypoint *ep, struct expression *initializer, struct access_data *);
>
> -struct pseudo void_pseudo = {};
> +struct pseudo void_pseudo;
>
> static struct position current_pos;
>
> @@ -1880,7 +1880,7 @@ pseudo_t linearize_statement(struct entrypoint *ep, struct statement *stmt)
> struct basic_block *active;
> pseudo_t src = linearize_expression(ep, expr);
> active = ep->active;
> - if (active && src != &void_pseudo) {
> + if (active && src != VOID) {
> struct instruction *phi_node = first_instruction(bb_return->insns);
> pseudo_t phi;
> if (!phi_node) {
> --
> 1.7.1
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sparse" 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-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [Bug 33002] Driver "nouveau" does not compile
From: bugzilla-daemon @ 2011-04-10 22:18 UTC (permalink / raw)
To: dri-devel
In-Reply-To: <bug-33002-2300@https.bugzilla.kernel.org/>
https://bugzilla.kernel.org/show_bug.cgi?id=33002
Andrew Morton <akpm@linux-foundation.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |akpm@linux-foundation.org
Component|Video(Other) |Video(DRI - non Intel)
AssignedTo|drivers_video-other@kernel- |drivers_video-dri@kernel-bu
|bugs.osdl.org |gs.osdl.org
--
Configure bugmail: https://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel
^ permalink raw reply
* Re: [PATCH v5 3/8] btrfs: Factor out enumeration of chunks to a separate function
From: David Sterba @ 2011-04-10 22:11 UTC (permalink / raw)
To: Hugo Mills; +Cc: chris.mason, dave, lizf, linux-btrfs
In-Reply-To: <1302469571-12605-4-git-send-email-hugo@carfax.org.uk>
On Sun, Apr 10, 2011 at 10:06:06PM +0100, Hugo Mills wrote:
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index cf019af..20c2772 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -2029,6 +2029,97 @@ static u64 div_factor(u64 num, int factor)
> +static void balance_move_chunks(struct btrfs_root *chunk_root,
> + struct btrfs_balance_info *bal_info,
> + struct btrfs_path *path,
> + struct btrfs_key *key)
> +{
> + int ret;
> +
> + ret = btrfs_relocate_chunk(chunk_root,
> + chunk_root->root_key.objectid,
> + key->objectid,
> + key->offset);
> + BUG_ON(ret && ret != -ENOSPC);
> + spin_lock(&chunk_root->fs_info->balance_info_lock);
> + bal_info->completed++;
> + spin_unlock(&chunk_root->fs_info->balance_info_lock);
> + printk(KERN_INFO "btrfs: balance: %llu/%llu block groups completed\n",
> + bal_info->completed, bal_info->expected);
as you've changed 'completed' and 'expected' members to 32bit, change
%llu to %u.
d/
^ permalink raw reply
* Re: [PATCH 2.6.39] soc_camera: OMAP1: fix missing bytesperline and sizeimage initialization
From: Janusz Krzysztofik @ 2011-04-10 22:00 UTC (permalink / raw)
To: Guennadi Liakhovetski; +Cc: Linux Media Mailing List, Sergio Aguirre
In-Reply-To: <Pine.LNX.4.64.1104101751380.12697@axis700.grange>
Dnia niedziela 10 kwiecień 2011 o 18:00:14 Guennadi Liakhovetski
napisał(a):
> Hi Janusz
>
> On Sat, 9 Apr 2011, Janusz Krzysztofik wrote:
> > Since commit 0e4c180d3e2cc11e248f29d4c604b6194739d05a, bytesperline
> > and sizeimage memebers of v4l2_pix_format structure have no longer
> > been calculated inside soc_camera_g_fmt_vid_cap(), but rather
> > passed via soc_camera_device structure from a host driver callback
> > invoked by soc_camera_set_fmt().
> >
> > OMAP1 camera host driver has never been providing these parameters,
> > so it no longer works correctly. Fix it by adding suitable
> > assignments to omap1_cam_set_fmt().
>
> Thanks for the patch, but now it looks like many soc-camera host
> drivers are re-implementing this very same calculation in different
> parts of their code - in try_fmt, set_fmt, get_fmt. Why don't we
> unify them all, implement this centrally in soc_camera.c and remove
> all those calculations?
Wasn't it already unified before commit in question?
> Could you cook up a patch or maybe several
> patches - for soc_camera.c and all drivers?
Perhaps I could, as soon as I found some spare time, but first I'd have
to really understand why we need bytesperline or sizeimage handling
being changed from how they worked before commit
0e4c180d3e2cc11e248f29d4c604b6194739d05a was introduced. I never had a
need to customize bytesperline or sizeimage calculations in my driver.
But even then, I think these new patches would rather qualify for next
merge window, while the OMAP1 driver case is just a regression, caused
by an alredy applied, unrelated change to the underlying framework, and
requires a fix if that change is not going to be reverted.
Maybe the author of the change, Sergio Aguirre form TI (CCing him),
could rework his patch in a way which wouldn't impose, as a side effect,
the new requirement of those structure members being passed from host
drivers?
Thanks,
Janusz
^ permalink raw reply
* Re: [PATCH 2/3] powerpc: Use MSR_64BIT in places
From: Benjamin Herrenschmidt @ 2011-04-10 22:00 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <94DD022B-86D8-4751-BB65-7D46AC63ED9A@kernel.crashing.org>
On Sun, 2011-04-10 at 12:29 -0500, Kumar Gala wrote:
> On Apr 9, 2011, at 5:04 PM, Benjamin Herrenschmidt wrote:
>
> > On Fri, 2011-04-08 at 04:24 -0500, Kumar Gala wrote:
> >> On Apr 8, 2011, at 2:56 AM, Michael Ellerman wrote:
> >>
> >>> Use the new MSR_64BIT in a few places. Some of these are already ifdef'ed
> >>> for BOOKE vs BOOKS, but it's still clearer, MSR_SF does not immediately
> >>> parse as "MSR bit for 64bit".
> >>>
> >>> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
> >>> ---
> >>> arch/powerpc/kernel/head_64.S | 2 +-
> >>> arch/powerpc/kernel/signal_64.c | 4 ++--
> >>> arch/powerpc/kernel/traps.c | 2 +-
> >>> arch/powerpc/xmon/xmon.c | 14 +++++++-------
> >>> 4 files changed, 11 insertions(+), 11 deletions(-)
> >>
> >> However MSR_ISF does ;)
> >
> > I'm not sure I parse that one :-) Any ways ISF is "interrupt SF" and has
> > no equivalent in the MSR for BookE (it's elsewhere, EPCR no ?).
>
> I was just saying that if _SF doesn't parse as 64-bit mode, ISF doesn't parse as interrupt into 64-bit mode :)
Ah right :-) But it's not used nearly as much and has no equivalent on
BookE so I wouldn't bother. The deal here is really more about getting
a single definition for both subarchs.
Cheers,
Ben.
^ permalink raw reply
* RE: [PATCH 1/2] mpt2sas: Remove acquisition of host_lock
From: Moore, Eric @ 2011-04-10 22:01 UTC (permalink / raw)
To: Matthew Wilcox, Christoph Hellwig
Cc: linux-scsi@vger.kernel.org, DL-MPT Fusion Linux
In-Reply-To: <20110407053058.GC4673@linux.intel.com>
On Wednesday, April 06, 2011 11:31 PM, Matthew Wilcox wrote:
> On Wed, Apr 06, 2011 at 09:45:55AM -0400, Christoph Hellwig wrote:
> > On Tue, Apr 05, 2011 at 05:43:55PM -0400, Matthew Wilcox wrote:
> > >
> > > We can eliminate the use of the scsi command serial_number, as the race
> > > that the driver is checking for cannot happen.
> > >
> > > Then the driver no longer needs to use the DEF_SCSI_QCMD() macro and no
> > > longer acquires the host_lock. This improves performance substantially
> > > on high-IOPS workloads.
> >
> > Looks fine. Note that this somehow clashes with my patch to simply
> > remove the serial_number check from mpt2sas. We could just drop my
> > smaller patch if this one gets in in a timely fashion.
>
> We should probably split this patch apart into the serial_number removal
> and then the host_lock removal anyway.
>
> But I don't think your patch is correct:
>
> - if (scmd_lookup && (scmd_lookup->serial_number ==
> - scmd->serial_number))
> + if (scmd_lookup)
> rc = FAILED;
> else
> rc = SUCCESS;
>
> The second part of the conditional is always false (right? because that
> command can't be in flight).
>
> So that's (scmd_lookup && 0), which is if (0), so we can just state rc
> = SUCCESS. Or is my reasoning faulty somewhere?
The patch that Christoph provided is correct. We are doing this check following the task management completion. The purpose of this check is to determine whether the outstanding IO was completed. For whatever reason, if the scmd_lookup is non-zero, it means the IO is still in driver queue. It's not guaranteed that the IO is returned by the task abort. So we need to return FAILED status if the scmd_lookup is non-zero.
The serial_number check is there if IO is resent while error recovery is going on, it appears I merged that in from the older generation mptsas driver. It's not needed since unjam host locks down the IO queues.
^ permalink raw reply
* [Bug 35434] [RADEON:KMS:R600G] etqw: broken ground textures
From: bugzilla-daemon @ 2011-04-10 21:56 UTC (permalink / raw)
To: dri-devel
In-Reply-To: <bug-35434-502@http.bugs.freedesktop.org/>
https://bugs.freedesktop.org/show_bug.cgi?id=35434
--- Comment #7 from Brian Paterni <bpaterni@gmail.com> 2011-04-10 14:56:50 PDT ---
I'm getting this 'unknown param 45' error as well, though it doesn't /seem/ to
be related to this bug; I recall being able to run quake wars prior to the
error appearing regularly. So a separate bug report may be necessary.
Looking at src/gallium/drivers/r600/r600_pipe.c though, it looks like
r600_get_param() is not handling PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL which
has been mapped to '45'. However I'm unsure of what exactly needs to be done
for r600g to support it.
--
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
^ permalink raw reply
* Re: Raid 5 to 6 grow stalled
From: NeilBrown @ 2011-04-10 21:52 UTC (permalink / raw)
To: Edward Siefker; +Cc: linux-raid
In-Reply-To: <1302447763.8724.1439486933@webmail.messagingengine.com>
On Sun, 10 Apr 2011 08:02:43 -0700 "Edward Siefker" <hatta00@fastmail.fm>
wrote:
>
> >
> > Doesn't look good..
> > What version of mdadm? What kernel?
> >
> > NeilBrown
> >
>
>
>
> root@iblis:~# mdadm --version
> mdadm - v3.1.4 - 31st August 2010
> root@iblis:~# uname -a
> Linux iblis 2.6.38-2-amd64 #1 SMP Tue Mar 29 16:45:36 UTC 2011 x86_64
> GNU/Linux
>
> Did you see the other post I made? The array still
> reports as clean, but I haven't tried to mount it yet.
> This array started out as a RAID1, which I changed to
> RAID5, added a disk, reshaped, and added a spare to.
> This worked great and I used it for a couple weeks
> before deciding to go to RAID6.
>
>
> Looking at the output of 'mdadm -E' and 'mdadm -D'
> (again in the other post), it looks like there's
> some inconsistency in the raid device for /dev/sde1.
> -E reports it as number 4 and raid device 4. But,
> -D says /dev/sde1 is number 4 and raid device 3.
> Don't know if that means anything, but it's the
> only thing I see that looks unusual.
>
> Since the array is clean, is it safe to mount it?
> It's actually a luks volume, fwiw. Thanks
That inconsistency is expected. The v0.90 metadata isn't able to represent
some state information that the running kernel can represent. So when the
metadata is written out it looks a bit different just as you noticed.
Your data is safe and it is easy to make it all happy again.
There are a couple of options...
The state of your array is that it has been converted to RAID6 in a special
layout where the Q blocks (the second parity block) are all on the last drive
instead of spread among all the drives.
mdadm then tried to start the process of converting this to a more normal
layout but because the array was "auto-read-only" (which means you hadn't
even tried to mount it or anything) it got confused and aborted.
This left some sysfs settings in an unusual state.
In particular:
sync_max is 16385 (sectors) so when the rebuilt started it paused at 8192K
suspend_hi is 65536 so any IO lower than this address will block.
The simplest thing to is:
echo max > /sys/block/md0/md/sync_max
echo 0 > /sys/block/md0/md/suspend_hi
this will allow the recovery of sde1 to complete and you will have full access
to your data.
This will result in the array being in the unusual layout with non-rotated Q.
This can then be fixed with
mdadm --grow /dev/md0 --layout=normalise --backup=/whatever
If you don't want to wait for both the recovery and the subsequent
reshape you could do them both at once:
- issue the above two 'echo' commands.
- fail and remove sde1
mdadm /dev/md0 -f /dev/sde1
mdadm /dev/md0 -r /dev/sde1
- then freeze recovery in the array, add the device back in, and start the
grow, so:
echo frozen > /sys/block/md0/md/sync_action
mdadm /dev/md0 --add /dev/sde1
mdadm --grow /dev/md0 --layout=normalise --backup=/whereever
You don't need to use the same backup file as before - and make sure you
give the name of a file which doesn't exist, or mdadm will complain,
unfreeze the array and it will start recovery - which isn't a big problem,
just not part of the plan.
And you did exactly the right thing to ask instead of fiddling with the
array!! It was in quite an unusual state and while I is unlikely you would
have corrupted any date - waiting for a definitive answer is safest!
The next version of mdadm will check for arrays that are 'auto-readonly' and
not get confused by them.
Thanks,
NeilBrown
^ permalink raw reply
* Re: Firmware files for Ralink RT28x0
From: Xose Vazquez Perez @ 2011-04-10 21:46 UTC (permalink / raw)
To: Ben Hutchings; +Cc: users, linux-wireless
In-Reply-To: <1302469406.5282.341.camel@localhost>
On 04/10/2011 11:03 PM, Ben Hutchings wrote:
> These files aren't used by the Ralink drivers. So why should you
> believe the labels on them?
Because the hardware manufacturer says that:
http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2011-March/003380.html
Anyway, the firmware in staging(or ralink web) drivers look different because
they are different _versions_ of the _same_ firmware.
rt2870.bin: before 4096 bytes, now 8192 bytes.
> linux-firmware is not *actively* maintained; it requires people to send
> submissions (repeatedly...).
On 04/06/2010, *ONE YEAR AGO* , I sent a patch to rt2870.bin rt2860.bin.
It went to /dev/null
A similar patch was sent by the *driver maintainer* on 10/30/2010.
It went to /dev/null
The same patch was sent by the *hardware manufacturer* on 03/11/2011
It went to /dev/null
Torvalds, Mozart and God are pending.
> I think there may be a problem with distribution of Intel Pro Wireless
> firmware because Intel requires users to accept a EULA.
If it's included in Fedora then there are zero issues with licenses.
^ permalink raw reply
* [ath9k-devel] iwconfig drives which modules in the kernel/ath9k
From: Serene Gud @ 2011-04-10 21:46 UTC (permalink / raw)
To: ath9k-devel
Hi all,
I am able to print out the present operating frequency from the ath9k/main.c file in dmesg and if I change the frequency using iwconfig, the output of of dmesg shows that the frequency has been changed. As far as I could figure out struct ieee80211_channel is defined in ./include/net/cfg80211.h which defines one element as center_freq. But what I do not know is that which file has the code that is affected by the "iwconfig wlan0 channel #" command because struct ieee80211_channel is used in may files in ./net/mac80211 ./net/wireless and ./drivers/net/wireless/ath/ath9k folders mainly.
If anybody knows, kindly share...
Thanks!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20110411/0afea230/attachment.htm
^ permalink raw reply
* [ath9k-devel] GOOD for OpenWrt: only 2 tx failed per day
From: Matteo Croce @ 2011-04-10 21:40 UTC (permalink / raw)
To: ath9k-devel
In-Reply-To: <20110410212814.22516.qmail@stuge.se>
2011/4/10 Peter Stuge <peter@stuge.se>:
> rootkit85 at yahoo.it wrote:
>> Did you experience much tx failure?
>
> You are asking for the exact information that was originally posted.
> Please rephrase your question to be more clear.
>
>
> //Peter
> _______________________________________________
> ath9k-devel mailing list
> ath9k-devel at lists.ath9k.org
> https://lists.ath9k.org/mailman/listinfo/ath9k-devel
>
Larry is happy because he has only 7 tx failure in 3 days.
Maybe he had many more failures with an older driver/openwrt version?
Cheers,
--
Matteo Croce
OpenWrt Developer
?_______ ? ? ? ? ? ? ? ? ? ? ________ ? ? ? ?__
| ? ? ? |.-----.-----.-----.| ?| ?| ?|.----.| ?|_
| ? - ? || ?_ ?| ?-__| ? ? || ?| ?| ?|| ? _|| ? _|
|_______|| ? __|_____|__|__||________||__| ?|____|
? ? ? ? ?|__| W I R E L E S S ? F R E E D O M
ATTITUDE ADJUSTMENT (bleeding edge) --------------
?* 1/4 oz Vodka ? ? ?Pour all ingredents into mixing
?* 1/4 oz Gin ? ? ? ?tin with ice, strain into glass.
?* 1/4 oz Amaretto
?* 1/4 oz Triple sec
?* 1/4 oz Peach schnapps
?* 1/4 oz Sour mix
?* 1 splash Cranberry juice
-----------------------------------------------------
^ permalink raw reply
* [PATCH 1/4] staging: Remove unnecessary semicolons when if (foo) {...};
From: Joe Perches @ 2011-04-10 21:31 UTC (permalink / raw)
To: Greg Kroah-Hartman; +Cc: devel, linux-kernel
In-Reply-To: <cover.1302470807.git.joe@perches.com>
Done via perl script:
$ cat remove_semi_if.pl
my $match_balanced_parentheses = qr/(\((?:[^\(\)]++|(?-1))*\))/;
my $match_balanced_braces = qr/(\{(?:[^\{\}]++|(?-1))*\})/;
foreach my $file (@ARGV) {
my $f;
my $text;
my $oldtext;
next if ((-d $file));
open($f, '<', $file)
or die "$P: Can't open $file for read\n";
$oldtext = do { local($/) ; <$f> };
close($f);
next if ($oldtext eq "");
$text = $oldtext;
my $count = 0;
do {
$count = 0;
$count += $text =~ s@\b(if\s*${match_balanced_parentheses}\s*)${match_balanced_braces}\s*;@"$1$3"@egx;
} while ($count > 0);
if ($text ne $oldtext) {
my $newfile = $file;
open($f, '>', $newfile)
or die "$P: Can't open $newfile for write\n";
print $f $text;
close($f);
}
}
$
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/staging/intel_sst/intel_sst_pvt.c | 2 +-
drivers/staging/vt6655/bssdb.c | 8 ++--
drivers/staging/vt6655/device_main.c | 14 ++++----
drivers/staging/vt6655/dpc.c | 10 +++---
drivers/staging/vt6655/ioctl.c | 38 ++++++++++++------------
drivers/staging/vt6655/power.c | 2 +-
drivers/staging/vt6655/rxtx.c | 4 +-
drivers/staging/vt6655/wcmd.c | 14 ++++----
drivers/staging/vt6655/wmgr.c | 44 ++++++++++++++--------------
drivers/staging/vt6655/wpactl.c | 4 +-
drivers/staging/vt6656/bssdb.c | 8 ++--
drivers/staging/vt6656/dpc.c | 10 +++---
drivers/staging/vt6656/ioctl.c | 38 ++++++++++++------------
drivers/staging/vt6656/main_usb.c | 4 +-
drivers/staging/vt6656/rxtx.c | 4 +-
drivers/staging/vt6656/wcmd.c | 8 ++--
drivers/staging/vt6656/wmgr.c | 46 ++++++++++++++--------------
drivers/staging/vt6656/wpactl.c | 4 +-
18 files changed, 131 insertions(+), 131 deletions(-)
diff --git a/drivers/staging/intel_sst/intel_sst_pvt.c b/drivers/staging/intel_sst/intel_sst_pvt.c
index 01f8c3b..e034bea 100644
--- a/drivers/staging/intel_sst/intel_sst_pvt.c
+++ b/drivers/staging/intel_sst/intel_sst_pvt.c
@@ -203,7 +203,7 @@ int sst_create_large_msg(struct ipc_post **arg)
kfree(msg);
pr_err("kzalloc mailbox_data failed");
return -ENOMEM;
- };
+ }
*arg = msg;
return 0;
}
diff --git a/drivers/staging/vt6655/bssdb.c b/drivers/staging/vt6655/bssdb.c
index 57c1cc9..577599e 100644
--- a/drivers/staging/vt6655/bssdb.c
+++ b/drivers/staging/vt6655/bssdb.c
@@ -1289,7 +1289,7 @@ start:
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == true)
{
@@ -1489,7 +1489,7 @@ BSSvUpdateNodeTxCounter(
}
}
}
- };
+ }
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
@@ -1543,9 +1543,9 @@ BSSvUpdateNodeTxCounter(
}
}
}
- };
+ }
}
- };
+ }
return;
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index efaf19b..a946a69 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -900,7 +900,7 @@ static bool device_release_WPADEV(PSDevice pDevice)
if(ii>20)
break;
}
- };
+ }
return true;
}
@@ -1446,7 +1446,7 @@ static void device_init_defrag_cb(PSDevice pDevice) {
if (!device_alloc_frag_buf(pDevice, pDeF)) {
DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
pDevice->dev->name);
- };
+ }
}
pDevice->cbDFCB = CB_MAX_RX_FRAG;
pDevice->cbFreeDFCB = pDevice->cbDFCB;
@@ -2104,7 +2104,7 @@ static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
dev_kfree_skb_irq(skb);
spin_unlock_irq(&pDevice->lock);
return 0;
- };
+ }
cbMPDULen = skb->len;
pbMPDU = skb->data;
@@ -2136,7 +2136,7 @@ bool device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, unsigned int uNodeI
if (pDevice->bStopTx0Pkt == true) {
dev_kfree_skb_irq(skb);
return false;
- };
+ }
if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
dev_kfree_skb_irq(skb);
@@ -2865,7 +2865,7 @@ static irqreturn_t device_intr(int irq, void *dev_instance) {
pDevice->bBeaconSent = false;
if (pDevice->bEnablePSMode) {
PSbIsNextTBTTWakeUp((void *)pDevice);
- };
+ }
if ((pDevice->eOPMode == OP_MODE_AP) ||
(pDevice->eOPMode == OP_MODE_ADHOC)) {
@@ -2876,7 +2876,7 @@ static irqreturn_t device_intr(int irq, void *dev_instance) {
if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
// todo adhoc PS mode
- };
+ }
}
@@ -2885,7 +2885,7 @@ static irqreturn_t device_intr(int irq, void *dev_instance) {
if (pDevice->eOPMode == OP_MODE_ADHOC) {
pDevice->bIsBeaconBufReadySet = false;
pDevice->cbBeaconBufReadySetCnt = 0;
- };
+ }
if (pDevice->eOPMode == OP_MODE_AP) {
if(pMgmt->byDTIMCount > 0) {
diff --git a/drivers/staging/vt6655/dpc.c b/drivers/staging/vt6655/dpc.c
index 1513073..cf0deac 100644
--- a/drivers/staging/vt6655/dpc.c
+++ b/drivers/staging/vt6655/dpc.c
@@ -700,7 +700,7 @@ device_receive_frame (
pDevice->pMgmt->bInTIMWake = false;
}
}
- };
+ }
// Now it only supports 802.11g Infrastructure Mode, and support rate must up to 54 Mbps
if (pDevice->bDiversityEnable && (FrameSize>50) &&
@@ -884,7 +884,7 @@ device_receive_frame (
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
return false;
@@ -1049,7 +1049,7 @@ static bool s_bAPModeRxCtl (
);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dpc: send vMgrDeAuthenBeginSta 1\n");
return true;
- };
+ }
if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_ASSOC) {
// send deassoc notification
// reason = (7) class 3 received from nonassoc sta
@@ -1061,7 +1061,7 @@ static bool s_bAPModeRxCtl (
);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dpc: send vMgrDisassocBeginSta 2\n");
return true;
- };
+ }
if (pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable) {
// delcare received ps-poll event
@@ -1486,7 +1486,7 @@ static bool s_bAPModeRxData (
bRelayOnly = true;
}
}
- };
+ }
}
if (bRelayOnly || bRelayAndForward) {
diff --git a/drivers/staging/vt6655/ioctl.c b/drivers/staging/vt6655/ioctl.c
index 5624a41..a74833d 100644
--- a/drivers/staging/vt6655/ioctl.c
+++ b/drivers/staging/vt6655/ioctl.c
@@ -91,7 +91,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sScanCmd, pReq->data, sizeof(SCmdScan))) {
result = -EFAULT;
break;
- };
+ }
pItemSSID = (PWLAN_IE_SSID)sScanCmd.ssid;
if (pItemSSID->len != 0) {
@@ -128,7 +128,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sZoneTypeCmd, pReq->data, sizeof(SCmdZoneTypeSet))) {
result = -EFAULT;
break;
- };
+ }
if(sZoneTypeCmd.bWrite==true) {
//////write zonetype
@@ -167,7 +167,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sZoneTypeCmd, sizeof(SCmdZoneTypeSet))) {
result = -EFAULT;
break;
- };
+ }
}
break;
@@ -186,7 +186,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sJoinCmd, pReq->data, sizeof(SCmdBSSJoin))) {
result = -EFAULT;
break;
- };
+ }
pItemSSID = (PWLAN_IE_SSID)sJoinCmd.ssid;
memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
@@ -234,7 +234,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sWEPCmd, pReq->data, sizeof(SCmdSetWEP))) {
result = -EFAULT;
break;
- };
+ }
if (sWEPCmd.bEnableWep != true) {
pDevice->bEncryptionEnable = false;
pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
@@ -300,7 +300,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sLinkStatus, sizeof(SCmdLinkStatus))) {
result = -EFAULT;
break;
- };
+ }
break;
@@ -317,7 +317,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sList, sizeof(SBSSIDList))) {
result = -EFAULT;
break;
- };
+ }
pReq->wResult = 0;
break;
@@ -325,7 +325,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sList, pReq->data, sizeof(SBSSIDList))) {
result = -EFAULT;
break;
- };
+ }
pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)), (int)GFP_ATOMIC);
if (pList == NULL) {
result = -ENOMEM;
@@ -367,7 +367,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, pList, sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)))) {
result = -EFAULT;
break;
- };
+ }
kfree(pList);
pReq->wResult = 0;
break;
@@ -376,14 +376,14 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &(pDevice->s802_11Counter), sizeof(SDot11MIBCount))) {
result = -EFAULT;
break;
- };
+ }
break;
case WLAN_CMD_GET_STAT:
if (copy_to_user(pReq->data, &(pDevice->scStatistic), sizeof(SStatCounter))) {
result = -EFAULT;
break;
- };
+ }
break;
case WLAN_CMD_STOP_MAC:
@@ -427,7 +427,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
if (vt6655_hostap_set_hostapd(pDevice, 1, 1) == 0){
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable HOSTAP\n");
@@ -455,7 +455,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
pDevice->bEnable8021x = true;
@@ -475,7 +475,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
pDevice->bEnableHostWEP = true;
@@ -494,7 +494,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "up wpadev\n");
memcpy(pDevice->wpadev->dev_addr, pDevice->dev->dev_addr, ETH_ALEN);
@@ -519,7 +519,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sStartAPCmd, pReq->data, sizeof(SCmdStartAP))) {
result = -EFAULT;
break;
- };
+ }
if (sStartAPCmd.wBSSType == AP) {
pMgmt->eConfigMode = WMAC_CONFIG_AP;
@@ -612,7 +612,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sNodeList, sizeof(SNodeList))) {
result = -EFAULT;
break;
- };
+ }
pReq->wResult = 0;
break;
@@ -621,7 +621,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sNodeList, pReq->data, sizeof(SNodeList))) {
result = -EFAULT;
break;
- };
+ }
pNodeList = (PSNodeList)kmalloc(sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)), (int)GFP_ATOMIC);
if (pNodeList == NULL) {
result = -ENOMEM;
@@ -661,7 +661,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, pNodeList, sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)))) {
result = -EFAULT;
break;
- };
+ }
kfree(pNodeList);
pReq->wResult = 0;
break;
diff --git a/drivers/staging/vt6655/power.c b/drivers/staging/vt6655/power.c
index 7207aca..4c0b02e 100644
--- a/drivers/staging/vt6655/power.c
+++ b/drivers/staging/vt6655/power.c
@@ -221,7 +221,7 @@ PSbConsiderPowerDown(
((pDevice->dwIsr& ISR_RXDMA0) != 0) &&
((pDevice->dwIsr & ISR_RXDMA1) != 0)){
return false;
- };
+ }
if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) {
if (bCheckCountToWakeUp &&
diff --git a/drivers/staging/vt6655/rxtx.c b/drivers/staging/vt6655/rxtx.c
index c920cf6..6935b37 100644
--- a/drivers/staging/vt6655/rxtx.c
+++ b/drivers/staging/vt6655/rxtx.c
@@ -2902,13 +2902,13 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb, unsigned char *pbMPDU, un
if (pDevice->bEnableHostWEP) {
uNodeIndex = 0;
bNodeExist = true;
- };
+ }
}
else {
if (pDevice->bEnableHostWEP) {
if (BSSDBbIsSTAInNodeDB(pDevice->pMgmt, (unsigned char *)(p80211Header->sA3.abyAddr1), &uNodeIndex))
bNodeExist = true;
- };
+ }
bNeedACK = true;
pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
};
diff --git a/drivers/staging/vt6655/wcmd.c b/drivers/staging/vt6655/wcmd.c
index abd6745..24f1490 100644
--- a/drivers/staging/vt6655/wcmd.c
+++ b/drivers/staging/vt6655/wcmd.c
@@ -385,7 +385,7 @@ vCommandTimer (
spin_unlock_irq(&pDevice->lock);
vCommandTimerWait((void *)pDevice, 10);
return;
- };
+ }
if (pMgmt->uScanChannel == 0 ) {
pMgmt->uScanChannel = pDevice->byMinChannel;
@@ -519,7 +519,7 @@ vCommandTimer (
vCommandTimerWait((void *)pDevice, 10);
spin_unlock_irq(&pDevice->lock);
return;
- };
+ }
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" CARDbRadioPowerOff\n");
//2008-09-02 <mark> by chester
// CARDbRadioPowerOff(pDevice);
@@ -532,7 +532,7 @@ vCommandTimer (
vCommandTimerWait((void *)pDevice, 10);
spin_unlock_irq(&pDevice->lock);
return;
- };
+ }
//2008-09-02 <mark> by chester
// CARDbRadioPowerOff(pDevice);
s_bCommandComplete(pDevice);
@@ -619,7 +619,7 @@ printk("chester-abyDesireSSID=%s\n",((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySS
vMgrCreateOwnIBSS((void *)pDevice, &Status);
if (Status != CMD_STATUS_SUCCESS){
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " WLAN_CMD_IBSS_CREATE fail ! \n");
- };
+ }
BSSvAddMulticastNode(pDevice);
}
}
@@ -631,7 +631,7 @@ printk("chester-abyDesireSSID=%s\n",((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySS
vMgrCreateOwnIBSS((void *)pDevice, &Status);
if (Status != CMD_STATUS_SUCCESS){
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" WLAN_CMD_IBSS_CREATE fail ! \n");
- };
+ }
BSSvAddMulticastNode(pDevice);
if (netif_queue_stopped(pDevice->dev)){
netif_wake_queue(pDevice->dev);
@@ -783,7 +783,7 @@ printk("chester-abyDesireSSID=%s\n",((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySS
vMgrCreateOwnIBSS((void *)pDevice, &Status);
if (Status != CMD_STATUS_SUCCESS){
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " vMgrCreateOwnIBSS fail ! \n");
- };
+ }
// alway turn off unicast bit
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_UNICAST);
pDevice->byRxMode &= ~RCR_UNICAST;
@@ -814,7 +814,7 @@ printk("chester-abyDesireSSID=%s\n",((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySS
}
pMgmt->sNodeDBTable[0].wEnQueueCnt--;
}
- };
+ }
// PS nodes tx
for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
diff --git a/drivers/staging/vt6655/wmgr.c b/drivers/staging/vt6655/wmgr.c
index e540110..71f7726 100644
--- a/drivers/staging/vt6655/wmgr.c
+++ b/drivers/staging/vt6655/wmgr.c
@@ -661,7 +661,7 @@ vMgrDisassocBeginSta(
if (*pStatus == CMD_STATUS_PENDING) {
pMgmt->eCurrState = WMAC_STATE_IDLE;
*pStatus = CMD_STATUS_SUCCESS;
- };
+ }
return;
}
@@ -1019,7 +1019,7 @@ s_vMgrRxAssocResponse(
(sFrame.pSuppRates == 0)){
DBG_PORT80(0xCC);
return;
- };
+ }
pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo);
pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus);
@@ -1039,7 +1039,7 @@ s_vMgrRxAssocResponse(
if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) )
{
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n");
- };
+ }
DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15));
pMgmt->eCurrState = WMAC_STATE_ASSOC;
BSSvUpdateAPNode((void *)pDevice, sFrame.pwCapInfo, sFrame.pSuppRates, sFrame.pExtSuppRates);
@@ -1692,7 +1692,7 @@ s_vMgrRxDisassociation(
//try to send associate packet again because of inactivity timeout
// if (pMgmt->eCurrState == WMAC_STATE_ASSOC) {
// vMgrReAssocBeginSta((PSDevice)pDevice, pMgmt, &CmdStatus);
- // };
+ // }
if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
wpahdr = (viawget_wpa_header *)pDevice->skb->data;
wpahdr->type = VIAWGET_DISASSOC_MSG;
@@ -1707,7 +1707,7 @@ s_vMgrRxDisassociation(
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == true)
@@ -1778,7 +1778,7 @@ s_vMgrRxDeauthentication(
netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false;
}
- };
+ }
if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
wpahdr = (viawget_wpa_header *)pDevice->skb->data;
@@ -1793,7 +1793,7 @@ s_vMgrRxDeauthentication(
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == true)
@@ -1912,7 +1912,7 @@ s_vMgrRxBeacon(
(sFrame.pSuppRates == 0) ) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n");
return;
- };
+ }
if (sFrame.pDSParms != NULL) {
@@ -2054,7 +2054,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
sFrame.pSSID->len
) == 0) {
bIsSSIDEqual = true;
- };
+ }
}
if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== true) &&
@@ -2138,8 +2138,8 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) {
if (sFrame.pCFParms->wCFPDurRemaining > 0) {
// TODO: deal with CFP period to set NAV
- };
- };
+ }
+ }
HIDWORD(qwTimestamp) = cpu_to_le32(HIDWORD(*sFrame.pqwTimestamp));
LODWORD(qwTimestamp) = cpu_to_le32(LODWORD(*sFrame.pqwTimestamp));
@@ -2160,7 +2160,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
}
else if (HIDWORD(qwTimestamp) < HIDWORD(qwLocalTSF)) {
bTSFOffsetPostive = false;
- };
+ }
if (bTSFOffsetPostive) {
qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF));
@@ -2218,7 +2218,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
if (pMgmt->bInTIM) {
PSvSendPSPOLL((PSDevice)pDevice);
// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:PS-POLL sent..\n");
- };
+ }
}
else {
@@ -2231,7 +2231,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
}
if(PSbConsiderPowerDown(pDevice, false, false)) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n");
- };
+ }
}
}
@@ -2316,7 +2316,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
pMgmt->sNodeDBTable[0].bActive = true;
pMgmt->sNodeDBTable[0].uInActiveCount = 0;
- };
+ }
}
else if (bIsSSIDEqual) {
@@ -2356,9 +2356,9 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==true)
// Prepare beacon frame
bMgrPrepareBeaconToSend((void *)pDevice, pMgmt);
// }
- };
+ }
}
- };
+ }
// endian issue ???
// Update TSF
if (bUpdateTSF) {
@@ -2590,7 +2590,7 @@ vMgrCreateOwnIBSS(
pMgmt->byCSSPK = KEY_CTL_WEP;
pMgmt->byCSSGK = KEY_CTL_WEP;
}
- };
+ }
pMgmt->byERPContext = 0;
@@ -2683,7 +2683,7 @@ vMgrJoinBSSBegin(
*pStatus = CMD_STATUS_RESOURCES;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n");
return;
- };
+ }
// memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN);
// Search known BSS list for prefer BSSID or SSID
@@ -2699,7 +2699,7 @@ vMgrJoinBSSBegin(
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID);
return;
- };
+ }
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n");
if (WLAN_GET_CAP_INFO_ESS(cpu_to_le16(pCurr->wCapInfo))){
@@ -4343,7 +4343,7 @@ s_vMgrRxProbeResponse(
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe resp:Fail addr:[%p] \n", pRxPacket->p80211Header);
DBG_PORT80(0xCC);
return;
- };
+ }
if(sFrame.pSSID->len == 0)
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n");
@@ -4625,7 +4625,7 @@ vMgrRxManagePacket(
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n");
if (pMgmt->eScanState != WMAC_NO_SCANNING) {
bInScan = true;
- };
+ }
s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan);
break;
diff --git a/drivers/staging/vt6655/wpactl.c b/drivers/staging/vt6655/wpactl.c
index fbae16d..78e326c 100644
--- a/drivers/staging/vt6655/wpactl.c
+++ b/drivers/staging/vt6655/wpactl.c
@@ -723,7 +723,7 @@ static int wpa_get_scan(PSDevice pDevice,
if (copy_to_user(param->u.scan_results.buf, pBuf, sizeof(struct viawget_scan_result) * count)) {
ret = -EFAULT;
- };
+ }
param->u.scan_results.scan_count = count;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count)
@@ -875,7 +875,7 @@ if (!((pMgmt->eAuthenMode == WMAC_AUTH_SHAREKEY) ||
if (pCurr == NULL){
printk("wpa_set_associate---->hidden mode site survey before associate.......\n");
bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
- };
+ }
}
/****************************************************************/
bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
diff --git a/drivers/staging/vt6656/bssdb.c b/drivers/staging/vt6656/bssdb.c
index 2bdd0a2..af006df 100644
--- a/drivers/staging/vt6656/bssdb.c
+++ b/drivers/staging/vt6656/bssdb.c
@@ -1192,7 +1192,7 @@ if((pMgmt->eCurrState!=WMAC_STATE_ASSOC) &&
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == TRUE)
{
@@ -1416,7 +1416,7 @@ void BSSvUpdateNodeTxCounter(void *hDeviceContext,
}
}
}
- };
+ }
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
@@ -1472,9 +1472,9 @@ void BSSvUpdateNodeTxCounter(void *hDeviceContext,
}
}
}
- };
+ }
}
- };
+ }
return;
diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c
index f4fb0c6..cb817ce 100644
--- a/drivers/staging/vt6656/dpc.c
+++ b/drivers/staging/vt6656/dpc.c
@@ -730,7 +730,7 @@ RXbBulkInProcessData (
pMgmt->bInTIMWake = FALSE;
}
}
- };
+ }
// Now it only supports 802.11g Infrastructure Mode, and support rate must up to 54 Mbps
if (pDevice->bDiversityEnable && (FrameSize>50) &&
@@ -913,7 +913,7 @@ RXbBulkInProcessData (
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
return FALSE;
@@ -1045,7 +1045,7 @@ static BOOL s_bAPModeRxCtl (
);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dpc: send vMgrDeAuthenBeginSta 1\n");
return TRUE;
- };
+ }
if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_ASSOC) {
// send deassoc notification
// reason = (7) class 3 received from nonassoc sta
@@ -1057,7 +1057,7 @@ static BOOL s_bAPModeRxCtl (
);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dpc: send vMgrDisassocBeginSta 2\n");
return TRUE;
- };
+ }
if (pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable) {
// delcare received ps-poll event
@@ -1488,7 +1488,7 @@ static BOOL s_bAPModeRxData (
bRelayOnly = TRUE;
}
}
- };
+ }
}
if (bRelayOnly || bRelayAndForward) {
diff --git a/drivers/staging/vt6656/ioctl.c b/drivers/staging/vt6656/ioctl.c
index 2fe071c..12be316 100644
--- a/drivers/staging/vt6656/ioctl.c
+++ b/drivers/staging/vt6656/ioctl.c
@@ -90,7 +90,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sScanCmd, pReq->data, sizeof(SCmdScan))) {
result = -EFAULT;
break;
- };
+ }
pItemSSID = (PWLAN_IE_SSID)sScanCmd.ssid;
if (pItemSSID->len != 0) {
@@ -124,7 +124,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sZoneTypeCmd, pReq->data, sizeof(SCmdZoneTypeSet))) {
result = -EFAULT;
break;
- };
+ }
if(sZoneTypeCmd.bWrite==TRUE) {
//////write zonetype
@@ -163,7 +163,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sZoneTypeCmd, sizeof(SCmdZoneTypeSet))) {
result = -EFAULT;
break;
- };
+ }
}
break;
@@ -173,7 +173,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sJoinCmd, pReq->data, sizeof(SCmdBSSJoin))) {
result = -EFAULT;
break;
- };
+ }
pItemSSID = (PWLAN_IE_SSID)sJoinCmd.ssid;
memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
@@ -223,7 +223,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sWEPCmd, pReq->data, sizeof(SCmdSetWEP))) {
result = -EFAULT;
break;
- };
+ }
if (sWEPCmd.bEnableWep != TRUE) {
int uu;
@@ -295,7 +295,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sLinkStatus, sizeof(SCmdLinkStatus))) {
result = -EFAULT;
break;
- };
+ }
break;
@@ -312,7 +312,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sList, sizeof(SBSSIDList))) {
result = -EFAULT;
break;
- };
+ }
pReq->wResult = 0;
break;
@@ -320,7 +320,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sList, pReq->data, sizeof(SBSSIDList))) {
result = -EFAULT;
break;
- };
+ }
pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)), (int)GFP_ATOMIC);
if (pList == NULL) {
result = -ENOMEM;
@@ -362,7 +362,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, pList, sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)))) {
result = -EFAULT;
break;
- };
+ }
kfree(pList);
pReq->wResult = 0;
break;
@@ -371,14 +371,14 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &(pDevice->s802_11Counter), sizeof(SDot11MIBCount))) {
result = -EFAULT;
break;
- };
+ }
break;
case WLAN_CMD_GET_STAT:
if (copy_to_user(pReq->data, &(pDevice->scStatistic), sizeof(SStatCounter))) {
result = -EFAULT;
break;
- };
+ }
break;
case WLAN_CMD_STOP_MAC:
@@ -415,7 +415,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
if (vt6656_hostap_set_hostapd(pDevice, 1, 1) == 0){
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable HOSTAP\n");
@@ -443,7 +443,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
pDevice->bEnable8021x = TRUE;
@@ -463,7 +463,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
pDevice->bEnableHostWEP = TRUE;
@@ -482,7 +482,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
result = -EFAULT;
break;
- };
+ }
if (sValue.dwValue == 1) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "up wpadev\n");
memcpy(pDevice->wpadev->dev_addr,
@@ -507,7 +507,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sStartAPCmd, pReq->data, sizeof(SCmdStartAP))) {
result = -EFAULT;
break;
- };
+ }
if (sStartAPCmd.wBSSType == AP) {
pMgmt->eConfigMode = WMAC_CONFIG_AP;
@@ -600,7 +600,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, &sNodeList, sizeof(SNodeList))) {
result = -EFAULT;
break;
- };
+ }
pReq->wResult = 0;
break;
@@ -609,7 +609,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_from_user(&sNodeList, pReq->data, sizeof(SNodeList))) {
result = -EFAULT;
break;
- };
+ }
pNodeList = (PSNodeList)kmalloc(sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)), (int)GFP_ATOMIC);
if (pNodeList == NULL) {
result = -ENOMEM;
@@ -649,7 +649,7 @@ int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
if (copy_to_user(pReq->data, pNodeList, sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)))) {
result = -EFAULT;
break;
- };
+ }
kfree(pNodeList);
pReq->wResult = 0;
break;
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c
index af14ab0..9a8eaf1 100644
--- a/drivers/staging/vt6656/main_usb.c
+++ b/drivers/staging/vt6656/main_usb.c
@@ -709,7 +709,7 @@ static BOOL device_release_WPADEV(PSDevice pDevice)
if(ii>20)
break;
}
- };
+ }
return TRUE;
}
@@ -995,7 +995,7 @@ static BOOL device_init_defrag_cb(PSDevice pDevice) {
DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
pDevice->dev->name);
goto free_frag;
- };
+ }
}
pDevice->cbDFCB = CB_MAX_RX_FRAG;
pDevice->cbFreeDFCB = pDevice->cbDFCB;
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c
index 8f18578..ffd4454 100644
--- a/drivers/staging/vt6656/rxtx.c
+++ b/drivers/staging/vt6656/rxtx.c
@@ -2441,13 +2441,13 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
if (pDevice->bEnableHostWEP) {
uNodeIndex = 0;
bNodeExist = TRUE;
- };
+ }
}
else {
if (pDevice->bEnableHostWEP) {
if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
bNodeExist = TRUE;
- };
+ }
bNeedACK = TRUE;
pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
};
diff --git a/drivers/staging/vt6656/wcmd.c b/drivers/staging/vt6656/wcmd.c
index b83b660..c158ced 100644
--- a/drivers/staging/vt6656/wcmd.c
+++ b/drivers/staging/vt6656/wcmd.c
@@ -642,7 +642,7 @@ void vRunCommand(void *hDeviceContext)
if (Status != CMD_STATUS_SUCCESS){
DBG_PRT(MSG_LEVEL_DEBUG,
KERN_INFO "WLAN_CMD_IBSS_CREATE fail!\n");
- };
+ }
BSSvAddMulticastNode(pDevice);
}
s_bClearBSSID_SCAN(pDevice);
@@ -658,7 +658,7 @@ void vRunCommand(void *hDeviceContext)
if (Status != CMD_STATUS_SUCCESS){
DBG_PRT(MSG_LEVEL_DEBUG,
KERN_INFO "WLAN_CMD_IBSS_CREATE fail!\n");
- };
+ }
BSSvAddMulticastNode(pDevice);
s_bClearBSSID_SCAN(pDevice);
/*
@@ -793,7 +793,7 @@ void vRunCommand(void *hDeviceContext)
if (Status != CMD_STATUS_SUCCESS) {
DBG_PRT(MSG_LEVEL_DEBUG,
KERN_INFO "vMgrCreateOwnIBSS fail!\n");
- };
+ }
// alway turn off unicast bit
MACvRegBitsOff(pDevice, MAC_REG_RCR, RCR_UNICAST);
pDevice->byRxMode &= ~RCR_UNICAST;
@@ -827,7 +827,7 @@ void vRunCommand(void *hDeviceContext)
pMgmt->sNodeDBTable[0].wEnQueueCnt--;
}
- };
+ }
// PS nodes tx
for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
diff --git a/drivers/staging/vt6656/wmgr.c b/drivers/staging/vt6656/wmgr.c
index 2ec200d..938e582 100644
--- a/drivers/staging/vt6656/wmgr.c
+++ b/drivers/staging/vt6656/wmgr.c
@@ -593,7 +593,7 @@ void vMgrDisassocBeginSta(void *hDeviceContext,
if (*pStatus == CMD_STATUS_PENDING) {
pMgmt->eCurrState = WMAC_STATE_IDLE;
*pStatus = CMD_STATUS_SUCCESS;
- };
+ }
return;
}
@@ -942,7 +942,7 @@ s_vMgrRxAssocResponse(
|| (sFrame.pSuppRates == NULL)) {
DBG_PORT80(0xCC);
return;
- };
+ }
pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo);
pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus);
@@ -962,7 +962,7 @@ s_vMgrRxAssocResponse(
if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) )
{
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n");
- };
+ }
DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15));
pMgmt->eCurrState = WMAC_STATE_ASSOC;
BSSvUpdateAPNode((void *) pDevice,
@@ -1621,7 +1621,7 @@ s_vMgrRxDisassociation(
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
//TODO: do something let upper layer know or
//try to send associate packet again because of inactivity timeout
@@ -1636,7 +1636,7 @@ s_vMgrRxDisassociation(
pDevice->byReAssocCount ++;
return; //mike add: you'll retry for many times, so it cann't be regarded as disconnected!
}
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == TRUE)
@@ -1710,7 +1710,7 @@ s_vMgrRxDeauthentication(
pDevice->bLinkPass = FALSE;
ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
}
- };
+ }
if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
wpahdr = (viawget_wpa_header *)pDevice->skb->data;
@@ -1725,7 +1725,7 @@ s_vMgrRxDeauthentication(
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
- };
+ }
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == TRUE)
@@ -1845,7 +1845,7 @@ s_vMgrRxBeacon(
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n");
return;
- };
+ }
if( byCurrChannel > CB_MAX_CHANNEL_24G )
{
@@ -1974,7 +1974,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
sFrame.pSSID->len
) == 0) {
bIsSSIDEqual = TRUE;
- };
+ }
}
if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== TRUE) &&
@@ -2074,8 +2074,8 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) {
if (sFrame.pCFParms->wCFPDurRemaining > 0) {
// TODO: deal with CFP period to set NAV
- };
- };
+ }
+ }
HIDWORD(qwTimestamp) = cpu_to_le32(HIDWORD(*sFrame.pqwTimestamp));
LODWORD(qwTimestamp) = cpu_to_le32(LODWORD(*sFrame.pqwTimestamp));
@@ -2096,7 +2096,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
}
else if (HIDWORD(qwTimestamp) < HIDWORD(qwLocalTSF)) {
bTSFOffsetPostive = FALSE;
- };
+ }
if (bTSFOffsetPostive) {
qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF));
@@ -2154,7 +2154,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
if (pMgmt->bInTIM) {
PSvSendPSPOLL((PSDevice)pDevice);
// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:PS-POLL sent..\n");
- };
+ }
}
else {
@@ -2167,7 +2167,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
}
if(PSbConsiderPowerDown(pDevice, FALSE, FALSE)) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n");
- };
+ }
}
}
@@ -2247,7 +2247,7 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
pMgmt->sNodeDBTable[0].bActive = TRUE;
pMgmt->sNodeDBTable[0].uInActiveCount = 0;
- };
+ }
}
else if (bIsSSIDEqual) {
@@ -2292,9 +2292,9 @@ if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
// Prepare beacon frame
bMgrPrepareBeaconToSend((void *) pDevice, pMgmt);
// }
- };
+ }
}
- };
+ }
// endian issue ???
// Update TSF
if (bUpdateTSF) {
@@ -2556,7 +2556,7 @@ void vMgrCreateOwnIBSS(void *hDeviceContext,
pMgmt->byCSSPK = KEY_CTL_WEP;
pMgmt->byCSSGK = KEY_CTL_WEP;
}
- };
+ }
pMgmt->byERPContext = 0;
@@ -2614,7 +2614,7 @@ void vMgrJoinBSSBegin(void *hDeviceContext, PCMD_STATUS pStatus)
*pStatus = CMD_STATUS_RESOURCES;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n");
return;
- };
+ }
// memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN);
// Search known BSS list for prefer BSSID or SSID
@@ -2630,7 +2630,7 @@ void vMgrJoinBSSBegin(void *hDeviceContext, PCMD_STATUS pStatus)
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID);
return;
- };
+ }
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n");
@@ -3061,7 +3061,7 @@ s_vMgrSynchBSS (
MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
pDevice->byRxMode |= RCR_BSSID;
pMgmt->bCurrBSSIDFilterOn = TRUE;
- };
+ }
if (pDevice->byBBType == BB_TYPE_11A) {
memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesA[0], sizeof(abyCurrSuppRatesA));
@@ -4209,7 +4209,7 @@ s_vMgrRxProbeResponse(
pRxPacket->p80211Header);
DBG_PORT80(0xCC);
return;
- };
+ }
if(sFrame.pSSID->len == 0)
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n");
@@ -4491,7 +4491,7 @@ void vMgrRxManagePacket(void *hDeviceContext,
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n");
if (pMgmt->eScanState != WMAC_NO_SCANNING) {
bInScan = TRUE;
- };
+ }
s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan);
break;
diff --git a/drivers/staging/vt6656/wpactl.c b/drivers/staging/vt6656/wpactl.c
index 8752736..dabcb6e 100644
--- a/drivers/staging/vt6656/wpactl.c
+++ b/drivers/staging/vt6656/wpactl.c
@@ -729,7 +729,7 @@ static int wpa_get_scan(PSDevice pDevice,
if (copy_to_user(param->u.scan_results.buf, pBuf, sizeof(struct viawget_scan_result) * count)) {
ret = -EFAULT;
- };
+ }
param->u.scan_results.scan_count = count;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " param->u.scan_results.scan_count = %d\n", count)
@@ -886,7 +886,7 @@ static int wpa_set_associate(PSDevice pDevice,
bScheduleCommand((void *) pDevice,
WLAN_CMD_BSSID_SCAN,
pMgmt->abyDesireSSID);
- };
+ }
}
/****************************************************************/
--
1.7.4.2.g597a6.dirty
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.