Update to 3.7

Update aufs to aufs3.x-rcN-20121210.
Disable rt, probably not available for 3.7.
Refresh/drop patches.  They apply but the result may not build.

svn path=/dists/trunk/linux/; revision=19608
This commit is contained in:
Ben Hutchings 2012-12-16 15:20:29 +00:00
parent ef781eb6ee
commit 8123ace851
28 changed files with 601 additions and 1654 deletions

9
debian/changelog vendored
View File

@ -1,7 +1,14 @@
linux (3.6.9-1~experimental.2) UNRELEASED; urgency=low
linux (3.7-1~experimental.1) UNRELEASED; urgency=low
* New upstream release: http://kernelnewbies.org/Linux_3.7
[ maximilian attems ]
* Enable WIZNET_W5100, WIZNET_W5300, AMD_PHY, BCM87XX_PHY.
[ Ben Hutchings ]
* aufs: Update to aufs3.x-rcN-20121210
* [rt] Disable until it is updated for Linux 3.7 or later
-- maximilian attems <maks@debian.org> Thu, 06 Dec 2012 18:14:33 +0100
linux (3.6.9-1~experimental.1) experimental; urgency=low

View File

@ -27,7 +27,7 @@ featuresets:
rt
[featureset-rt_base]
enabled: true
enabled: false
[description]
part-long-up: This kernel is not suitable for SMP (multi-processor,

View File

@ -95,7 +95,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
bprm->file = NULL;
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1398,6 +1398,10 @@ int search_binary_handler(struct linux_b
@@ -1371,6 +1371,10 @@ int search_binary_handler(struct linux_b
struct linux_binfmt *fmt;
pid_t old_pid, old_vpid;
@ -106,7 +106,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
retval = security_bprm_check(bprm);
if (retval)
return retval;
@@ -1422,12 +1426,8 @@ int search_binary_handler(struct linux_b
@@ -1395,12 +1399,8 @@ int search_binary_handler(struct linux_b
if (!try_module_get(fmt->module))
continue;
read_unlock(&binfmt_lock);
@ -122,7 +122,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (depth == 0) {
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -68,8 +68,6 @@ struct linux_binprm {
@@ -54,8 +54,6 @@ struct linux_binprm {
#define BINPRM_FLAGS_EXECFD_BIT 1
#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
@ -130,4 +130,4 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-
/* Function parameter for binfmt->coredump */
struct coredump_params {
long signr;
siginfo_t *siginfo;

View File

@ -19,17 +19,15 @@ removed in later patches.
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -255,7 +255,8 @@ static ssize_t firmware_loading_store(st
fw_priv->nr_pages,
0, PAGE_KERNEL_RO);
if (!fw_priv->fw->data) {
- dev_err(dev, "%s: vmap() failed\n", __func__);
@@ -500,14 +500,23 @@ static ssize_t firmware_loading_store(st
* is completed.
* */
fw_map_pages_buf(fw_buf);
+ if (!fw_buf->data)
+ dev_err(dev->parent, "%s: vmap() failed\n",
+ __func__);
goto err;
}
/* Pages are now owned by 'struct firmware' */
@@ -270,9 +271,14 @@ static ssize_t firmware_loading_store(st
complete_all(&fw_buf->completion);
break;
}
/* fallthrough */
default:
@ -43,10 +41,11 @@ removed in later patches.
+ "firmware: agent aborted loading %s (not found?)\n",
+ fw_priv->fw_id);
+ /* fallthrough */
err:
+ err:
fw_load_abort(fw_priv);
break;
@@ -435,6 +441,9 @@ static void firmware_class_timeout(u_lon
}
@@ -671,6 +680,9 @@ static void firmware_class_timeout(u_lon
{
struct firmware_priv *fw_priv = (struct firmware_priv *) data;
@ -56,7 +55,7 @@ removed in later patches.
fw_load_abort(fw_priv);
}
@@ -486,7 +495,8 @@ _request_firmware_prepare(const struct f
@@ -798,7 +810,8 @@ _request_firmware_prepare(const struct f
}
if (fw_get_builtin_firmware(firmware, name)) {
@ -66,7 +65,7 @@ removed in later patches.
return NULL;
}
@@ -517,25 +527,29 @@ static int _request_firmware_load(struct
@@ -874,25 +887,28 @@ static int _request_firmware_load(struct
retval = device_add(f_dev);
if (retval) {
@ -94,30 +93,29 @@ removed in later patches.
if (uevent) {
dev_set_uevent_suppress(f_dev, false);
- dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_id);
+ dev_dbg(f_dev->parent, "firmware: requesting %s\n",
+ fw_priv->fw_id);
- dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
+ dev_dbg(f_dev->parent, "firmware: requesting %s\n", buf->fw_id);
if (timeout != MAX_SCHEDULE_TIMEOUT)
mod_timer(&fw_priv->timeout,
round_jiffies_up(jiffies + timeout));
@@ -549,8 +563,15 @@ static int _request_firmware_load(struct
del_timer_sync(&fw_priv->timeout);
@@ -906,8 +922,15 @@ static int _request_firmware_load(struct
handle_fw:
mutex_lock(&fw_lock);
- if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status))
+ if (test_bit(FW_STATUS_ABORT, &fw_priv->status)) {
- if (!buf->size || test_bit(FW_STATUS_ABORT, &buf->status))
+ if (test_bit(FW_STATUS_ABORT, &buf->status)) {
+ /* failure has already been logged */
+ retval = -ENOENT;
+ } else if (!fw_priv->fw->size) {
retval = -ENOENT;
+ } else if (!buf->size) {
+ dev_err(f_dev->parent,
+ "firmware: agent loaded no data for %s (not found?)\n",
+ name);
retval = -ENOENT;
+ retval = -ENOENT;
+ }
fw_priv->fw = NULL;
mutex_unlock(&fw_lock);
@@ -601,6 +622,9 @@ request_firmware(const struct firmware *
/*
* add firmware name into devres list so that we can auto cache
@@ -986,6 +1009,9 @@ request_firmware(const struct firmware *
}
if (ret)
_request_firmware_cleanup(firmware_p);
@ -127,7 +125,7 @@ removed in later patches.
return ret;
}
@@ -650,7 +674,7 @@ static void request_firmware_work_func(s
@@ -1035,7 +1061,7 @@ static void request_firmware_work_func(s
ret = _request_firmware_load(fw_priv, fw_work->uevent, timeout);
usermodehelper_read_unlock();
} else {

View File

@ -1,33 +0,0 @@
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Sun, 26 Aug 2012 23:35:17 +0200
Subject: speakup: lower default software speech rate
commit cfd757010691eae4e17acc246f74e7622c3a2f05 upstream.
Speech synthesis beginners need a low speech rate, and trained people
want a high speech rate. A medium speech rate is thus actually not a
good default for neither. Since trained people will typically know how
to change the rate, better default for a low speech rate, which
beginners can grasp and learn how to increase it afterwards
This was agreed with users on the speakup mailing list.
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/staging/speakup/speakup_soft.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c
index 42cdafe..2a67610 100644
--- a/drivers/staging/speakup/speakup_soft.c
+++ b/drivers/staging/speakup/speakup_soft.c
@@ -46,7 +46,7 @@ static int misc_registered;
static struct var_t vars[] = {
{ CAPS_START, .u.s = {"\x01+3p" } },
{ CAPS_STOP, .u.s = {"\x01-3p" } },
- { RATE, .u.n = {"\x01%ds", 5, 0, 9, 0, 0, NULL } },
+ { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } },
{ PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } },
{ VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } },
{ TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } },

View File

@ -1,58 +0,0 @@
From f6bc8c29383456b89ac1b6f1aa768d195670fb53 Mon Sep 17 00:00:00 2001
From: Roger Quadros <rogerq@ti.com>
Date: Mon, 29 Oct 2012 16:44:46 +0200
Subject: [PATCH] usb: otg: Fix build errors if USB_MUSB_OMAP2PLUS is selected
as module
TWL4030_USB & TWL6030_USB must depend on USB_MUSB_OMAP2PLUS in Kconfig else
we get build errors with
CONFIG_USB_MUSB_HDRC=m
CONFIG_USB_MUSB_OMAP2PLUS=m
CONFIG_TWL4030_USB=y
CONFIG_TWL6030_USB=y
LD init/built-in.o
drivers/built-in.o: In function `twl4030_usb_irq':
drivers/usb/otg/twl4030-usb.c:518: undefined reference to `omap_musb_mailbox'
drivers/built-in.o: In function `twl4030_usb_phy_init':
drivers/usb/otg/twl4030-usb.c:540: undefined reference to `omap_musb_mailbox'
drivers/built-in.o: In function `twl6030_usb_irq':
drivers/usb/otg/twl6030-usb.c:230: undefined reference to `omap_musb_mailbox'
drivers/usb/otg/twl6030-usb.c:225: undefined reference to `omap_musb_mailbox'
drivers/built-in.o: In function `twl6030_usbotg_irq':
drivers/usb/otg/twl6030-usb.c:259: undefined reference to `omap_musb_mailbox'
CC: Peter Meerwald <pmeerw@pmeerw.net>
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/otg/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index d8c8a42..6223062 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -58,7 +58,7 @@ config USB_ULPI_VIEWPORT
config TWL4030_USB
tristate "TWL4030 USB Transceiver Driver"
- depends on TWL4030_CORE && REGULATOR_TWL4030
+ depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
select USB_OTG_UTILS
help
Enable this to support the USB OTG transceiver on TWL4030
@@ -68,7 +68,7 @@ config TWL4030_USB
config TWL6030_USB
tristate "TWL6030 USB Transceiver Driver"
- depends on TWL4030_CORE && OMAP_USB2
+ depends on TWL4030_CORE && OMAP_USB2 && USB_MUSB_OMAP2PLUS
select USB_OTG_UTILS
help
Enable this to support the USB OTG transceiver on TWL6030
--
1.7.9.5

View File

@ -1,256 +0,0 @@
From 0e98de67bacba812b1b465b90a3f940d24401c27 Mon Sep 17 00:00:00 2001
From: Kishon Vijay Abraham I <kishon@ti.com>
Date: Thu, 6 Sep 2012 20:27:07 +0530
Subject: [PATCH] usb: otg: make twl6030_usb as a comparator driver to
omap_usb2
All the PHY configuration other than VBUS, ID GND and OTG SRP are removed
from twl6030. The phy configurations are taken care by the dedicated
usb2 phy driver. So twl6030 is made as comparator driver for VBUS and
ID detection.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/otg/Kconfig | 2 +-
drivers/usb/otg/twl6030-usb.c | 118 +++++++----------------------------------
2 files changed, 19 insertions(+), 101 deletions(-)
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index 13fd1ddf..d8c8a42 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -68,7 +68,7 @@ config TWL4030_USB
config TWL6030_USB
tristate "TWL6030 USB Transceiver Driver"
- depends on TWL4030_CORE
+ depends on TWL4030_CORE && OMAP_USB2
select USB_OTG_UTILS
help
Enable this to support the USB OTG transceiver on TWL6030
diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c
index 6907d8d..32525bb 100644
--- a/drivers/usb/otg/twl6030-usb.c
+++ b/drivers/usb/otg/twl6030-usb.c
@@ -25,8 +25,9 @@
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/io.h>
-#include <linux/usb/otg.h>
#include <linux/usb/musb-omap.h>
+#include <linux/usb/phy_companion.h>
+#include <linux/usb/omap_usb.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
@@ -87,7 +88,7 @@
#define VBUS_DET BIT(2)
struct twl6030_usb {
- struct usb_phy phy;
+ struct phy_companion comparator;
struct device *dev;
/* for vbus reporting with irqs disabled */
@@ -107,7 +108,7 @@ struct twl6030_usb {
unsigned long features;
};
-#define phy_to_twl(x) container_of((x), struct twl6030_usb, phy)
+#define comparator_to_twl(x) container_of((x), struct twl6030_usb, comparator)
/*-------------------------------------------------------------------------*/
@@ -137,50 +138,9 @@ static inline u8 twl6030_readb(struct twl6030_usb *twl, u8 module, u8 address)
return ret;
}
-static int twl6030_phy_init(struct usb_phy *x)
+static int twl6030_start_srp(struct phy_companion *comparator)
{
- struct twl6030_usb *twl;
- struct device *dev;
- struct twl4030_usb_data *pdata;
-
- twl = phy_to_twl(x);
- dev = twl->dev;
- pdata = dev->platform_data;
-
- if (twl->linkstat == OMAP_MUSB_ID_GROUND)
- pdata->phy_power(twl->dev, 1, 1);
- else
- pdata->phy_power(twl->dev, 0, 1);
-
- return 0;
-}
-
-static void twl6030_phy_shutdown(struct usb_phy *x)
-{
- struct twl6030_usb *twl;
- struct device *dev;
- struct twl4030_usb_data *pdata;
-
- twl = phy_to_twl(x);
- dev = twl->dev;
- pdata = dev->platform_data;
- pdata->phy_power(twl->dev, 0, 0);
-}
-
-static int twl6030_phy_suspend(struct usb_phy *x, int suspend)
-{
- struct twl6030_usb *twl = phy_to_twl(x);
- struct device *dev = twl->dev;
- struct twl4030_usb_data *pdata = dev->platform_data;
-
- pdata->phy_suspend(dev, suspend);
-
- return 0;
-}
-
-static int twl6030_start_srp(struct usb_otg *otg)
-{
- struct twl6030_usb *twl = phy_to_twl(otg->phy);
+ struct twl6030_usb *twl = comparator_to_twl(comparator);
twl6030_writeb(twl, TWL_MODULE_USB, 0x24, USB_VBUS_CTRL_SET);
twl6030_writeb(twl, TWL_MODULE_USB, 0x84, USB_VBUS_CTRL_SET);
@@ -313,23 +273,8 @@ static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl)
return IRQ_HANDLED;
}
-static int twl6030_set_peripheral(struct usb_otg *otg,
- struct usb_gadget *gadget)
+static int twl6030_enable_irq(struct twl6030_usb *twl)
{
- if (!otg)
- return -ENODEV;
-
- otg->gadget = gadget;
- if (!gadget)
- otg->phy->state = OTG_STATE_UNDEFINED;
-
- return 0;
-}
-
-static int twl6030_enable_irq(struct usb_phy *x)
-{
- struct twl6030_usb *twl = phy_to_twl(x);
-
twl6030_writeb(twl, TWL_MODULE_USB, 0x1, USB_ID_INT_EN_HI_SET);
twl6030_interrupt_unmask(0x05, REG_INT_MSK_LINE_C);
twl6030_interrupt_unmask(0x05, REG_INT_MSK_STS_C);
@@ -362,9 +307,9 @@ static void otg_set_vbus_work(struct work_struct *data)
CHARGERUSB_CTRL1);
}
-static int twl6030_set_vbus(struct usb_otg *otg, bool enabled)
+static int twl6030_set_vbus(struct phy_companion *comparator, bool enabled)
{
- struct twl6030_usb *twl = phy_to_twl(otg->phy);
+ struct twl6030_usb *twl = comparator_to_twl(comparator);
twl->vbus_enable = enabled;
schedule_work(&twl->set_vbus_work);
@@ -372,23 +317,12 @@ static int twl6030_set_vbus(struct usb_otg *otg, bool enabled)
return 0;
}
-static int twl6030_set_host(struct usb_otg *otg, struct usb_bus *host)
-{
- if (!otg)
- return -ENODEV;
-
- otg->host = host;
- if (!host)
- otg->phy->state = OTG_STATE_UNDEFINED;
- return 0;
-}
-
static int __devinit twl6030_usb_probe(struct platform_device *pdev)
{
+ u32 ret;
struct twl6030_usb *twl;
int status, err;
struct twl4030_usb_data *pdata;
- struct usb_otg *otg;
struct device *dev = &pdev->dev;
pdata = dev->platform_data;
@@ -396,28 +330,20 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev)
if (!twl)
return -ENOMEM;
- otg = devm_kzalloc(dev, sizeof *otg, GFP_KERNEL);
- if (!otg)
- return -ENOMEM;
-
twl->dev = &pdev->dev;
twl->irq1 = platform_get_irq(pdev, 0);
twl->irq2 = platform_get_irq(pdev, 1);
twl->features = pdata->features;
twl->linkstat = OMAP_MUSB_UNKNOWN;
- twl->phy.dev = twl->dev;
- twl->phy.label = "twl6030";
- twl->phy.otg = otg;
- twl->phy.init = twl6030_phy_init;
- twl->phy.shutdown = twl6030_phy_shutdown;
- twl->phy.set_suspend = twl6030_phy_suspend;
+ twl->comparator.set_vbus = twl6030_set_vbus;
+ twl->comparator.start_srp = twl6030_start_srp;
- otg->phy = &twl->phy;
- otg->set_host = twl6030_set_host;
- otg->set_peripheral = twl6030_set_peripheral;
- otg->set_vbus = twl6030_set_vbus;
- otg->start_srp = twl6030_start_srp;
+ ret = omap_usb2_set_comparator(&twl->comparator);
+ if (ret == -ENODEV) {
+ dev_info(&pdev->dev, "phy not ready, deferring probe");
+ return -EPROBE_DEFER;
+ }
/* init spinlock for workqueue */
spin_lock_init(&twl->lock);
@@ -427,7 +353,6 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "ldo init failed\n");
return err;
}
- usb_add_phy(&twl->phy, USB_PHY_TYPE_USB2);
platform_set_drvdata(pdev, twl);
if (device_create_file(&pdev->dev, &dev_attr_vbus))
@@ -458,9 +383,7 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev)
}
twl->asleep = 0;
- pdata->phy_init(dev);
- twl6030_phy_suspend(&twl->phy, 0);
- twl6030_enable_irq(&twl->phy);
+ twl6030_enable_irq(twl);
dev_info(&pdev->dev, "Initialized TWL6030 USB module\n");
return 0;
@@ -470,10 +393,6 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev)
{
struct twl6030_usb *twl = platform_get_drvdata(pdev);
- struct twl4030_usb_data *pdata;
- struct device *dev = &pdev->dev;
- pdata = dev->platform_data;
-
twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK,
REG_INT_MSK_LINE_C);
twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK,
@@ -481,7 +400,6 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev)
free_irq(twl->irq1, twl);
free_irq(twl->irq2, twl);
regulator_put(twl->usb3v3);
- pdata->phy_exit(twl->dev);
device_remove_file(twl->dev, &dev_attr_vbus);
cancel_work_sync(&twl->set_vbus_work);
--
1.7.9.5

View File

@ -1,449 +0,0 @@
From 657b306a7bdfca4ae1514b533a0e7c3c6d26dbc6 Mon Sep 17 00:00:00 2001
From: Kishon Vijay Abraham I <kishon@ti.com>
Date: Thu, 6 Sep 2012 20:27:06 +0530
Subject: [PATCH] usb: phy: add a new driver for omap usb2 phy
All phy related programming like enabling/disabling the clocks, powering
on/off the phy is taken care of by this driver. It is also used for OTG
related functionality like srp.
This also includes device tree support for usb2 phy driver and
the documentation with device tree binding information is updated.
Currently writing to control module register is taken care in this
driver which will be removed once the control module driver is in place.
Cc: Felipe Balbi <balbi@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
Documentation/devicetree/bindings/usb/usb-phy.txt | 17 ++
drivers/usb/phy/Kconfig | 9 +
drivers/usb/phy/Makefile | 1 +
drivers/usb/phy/omap-usb2.c | 271 +++++++++++++++++++++
include/linux/usb/omap_usb.h | 46 ++++
include/linux/usb/phy_companion.h | 34 +++
6 files changed, 378 insertions(+)
create mode 100644 Documentation/devicetree/bindings/usb/usb-phy.txt
create mode 100644 drivers/usb/phy/omap-usb2.c
create mode 100644 include/linux/usb/omap_usb.h
create mode 100644 include/linux/usb/phy_companion.h
Index: experimental/Documentation/devicetree/bindings/usb/usb-phy.txt
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ experimental/Documentation/devicetree/bindings/usb/usb-phy.txt 2012-12-05 11:46:39.767567050 +0100
@@ -0,0 +1,17 @@
+USB PHY
+
+OMAP USB2 PHY
+
+Required properties:
+ - compatible: Should be "ti,omap-usb2"
+ - reg : Address and length of the register set for the device. Also
+add the address of control module dev conf register until a driver for
+control module is added
+
+This is usually a subnode of ocp2scp to which it is connected.
+
+usb2phy@4a0ad080 {
+ compatible = "ti,omap-usb2";
+ reg = <0x4a0ad080 0x58>,
+ <0x4a002300 0x4>;
+};
Index: experimental/drivers/usb/phy/Kconfig
===================================================================
--- experimental.orig/drivers/usb/phy/Kconfig 2012-12-03 20:39:49.000000000 +0100
+++ experimental/drivers/usb/phy/Kconfig 2012-12-05 11:46:39.775567051 +0100
@@ -4,6 +4,15 @@
comment "USB Physical Layer drivers"
depends on USB || USB_GADGET
+config OMAP_USB2
+ tristate "OMAP USB2 PHY Driver"
+ select USB_OTG_UTILS
+ help
+ Enable this to support the transceiver that is part of SOC. This
+ driver takes care of all the PHY functionality apart from comparator.
+ The USB OTG controller communicates with the comparator using this
+ driver.
+
config USB_ISP1301
tristate "NXP ISP1301 USB transceiver support"
depends on USB || USB_GADGET
Index: experimental/drivers/usb/phy/Makefile
===================================================================
--- experimental.orig/drivers/usb/phy/Makefile 2012-12-03 20:39:49.000000000 +0100
+++ experimental/drivers/usb/phy/Makefile 2012-12-05 11:46:39.807567048 +0100
@@ -4,4 +4,5 @@
ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
+obj-$(CONFIG_OMAP_USB2) += omap-usb2.o
obj-$(CONFIG_USB_ISP1301) += isp1301.o
Index: experimental/drivers/usb/phy/omap-usb2.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ experimental/drivers/usb/phy/omap-usb2.c 2012-12-05 11:46:39.819567049 +0100
@@ -0,0 +1,271 @@
+/*
+ * omap-usb2.c - USB PHY, talking to musb controller in OMAP.
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Author: Kishon Vijay Abraham I <kishon@ti.com>
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/io.h>
+#include <linux/usb/omap_usb.h>
+#include <linux/usb/phy_companion.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/pm_runtime.h>
+#include <linux/delay.h>
+
+/**
+ * omap_usb2_set_comparator - links the comparator present in the sytem with
+ * this phy
+ * @comparator - the companion phy(comparator) for this phy
+ *
+ * The phy companion driver should call this API passing the phy_companion
+ * filled with set_vbus and start_srp to be used by usb phy.
+ *
+ * For use by phy companion driver
+ */
+int omap_usb2_set_comparator(struct phy_companion *comparator)
+{
+ struct omap_usb *phy;
+ struct usb_phy *x = usb_get_phy(USB_PHY_TYPE_USB2);
+
+ if (IS_ERR(x))
+ return -ENODEV;
+
+ phy = phy_to_omapusb(x);
+ phy->comparator = comparator;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(omap_usb2_set_comparator);
+
+/**
+ * omap_usb_phy_power - power on/off the phy using control module reg
+ * @phy: struct omap_usb *
+ * @on: 0 or 1, based on powering on or off the PHY
+ *
+ * XXX: Remove this function once control module driver gets merged
+ */
+static void omap_usb_phy_power(struct omap_usb *phy, int on)
+{
+ u32 val;
+
+ if (on) {
+ val = readl(phy->control_dev);
+ if (val & PHY_PD) {
+ writel(~PHY_PD, phy->control_dev);
+ /* XXX: add proper documentation for this delay */
+ mdelay(200);
+ }
+ } else {
+ writel(PHY_PD, phy->control_dev);
+ }
+}
+
+static int omap_usb_set_vbus(struct usb_otg *otg, bool enabled)
+{
+ struct omap_usb *phy = phy_to_omapusb(otg->phy);
+
+ if (!phy->comparator)
+ return -ENODEV;
+
+ return phy->comparator->set_vbus(phy->comparator, enabled);
+}
+
+static int omap_usb_start_srp(struct usb_otg *otg)
+{
+ struct omap_usb *phy = phy_to_omapusb(otg->phy);
+
+ if (!phy->comparator)
+ return -ENODEV;
+
+ return phy->comparator->start_srp(phy->comparator);
+}
+
+static int omap_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
+{
+ struct usb_phy *phy = otg->phy;
+
+ otg->host = host;
+ if (!host)
+ phy->state = OTG_STATE_UNDEFINED;
+
+ return 0;
+}
+
+static int omap_usb_set_peripheral(struct usb_otg *otg,
+ struct usb_gadget *gadget)
+{
+ struct usb_phy *phy = otg->phy;
+
+ otg->gadget = gadget;
+ if (!gadget)
+ phy->state = OTG_STATE_UNDEFINED;
+
+ return 0;
+}
+
+static int omap_usb2_suspend(struct usb_phy *x, int suspend)
+{
+ u32 ret;
+ struct omap_usb *phy = phy_to_omapusb(x);
+
+ if (suspend && !phy->is_suspended) {
+ omap_usb_phy_power(phy, 0);
+ pm_runtime_put_sync(phy->dev);
+ phy->is_suspended = 1;
+ } else if (!suspend && phy->is_suspended) {
+ ret = pm_runtime_get_sync(phy->dev);
+ if (ret < 0) {
+ dev_err(phy->dev, "get_sync failed with err %d\n",
+ ret);
+ return ret;
+ }
+ omap_usb_phy_power(phy, 1);
+ phy->is_suspended = 0;
+ }
+
+ return 0;
+}
+
+static int __devinit omap_usb2_probe(struct platform_device *pdev)
+{
+ struct omap_usb *phy;
+ struct usb_otg *otg;
+ struct resource *res;
+
+ phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
+ if (!phy) {
+ dev_err(&pdev->dev, "unable to allocate memory for USB2 PHY\n");
+ return -ENOMEM;
+ }
+
+ otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL);
+ if (!otg) {
+ dev_err(&pdev->dev, "unable to allocate memory for USB OTG\n");
+ return -ENOMEM;
+ }
+
+ phy->dev = &pdev->dev;
+
+ phy->phy.dev = phy->dev;
+ phy->phy.label = "omap-usb2";
+ phy->phy.set_suspend = omap_usb2_suspend;
+ phy->phy.otg = otg;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+
+ phy->control_dev = devm_request_and_ioremap(&pdev->dev, res);
+ if (phy->control_dev == NULL) {
+ dev_err(&pdev->dev, "Failed to obtain io memory\n");
+ return -ENXIO;
+ }
+
+ phy->is_suspended = 1;
+ omap_usb_phy_power(phy, 0);
+
+ otg->set_host = omap_usb_set_host;
+ otg->set_peripheral = omap_usb_set_peripheral;
+ otg->set_vbus = omap_usb_set_vbus;
+ otg->start_srp = omap_usb_start_srp;
+ otg->phy = &phy->phy;
+
+ phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
+ if (IS_ERR(phy->wkupclk)) {
+ dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
+ return PTR_ERR(phy->wkupclk);
+ }
+ clk_prepare(phy->wkupclk);
+
+ usb_add_phy(&phy->phy, USB_PHY_TYPE_USB2);
+
+ platform_set_drvdata(pdev, phy);
+
+ pm_runtime_enable(phy->dev);
+
+ return 0;
+}
+
+static int __devexit omap_usb2_remove(struct platform_device *pdev)
+{
+ struct omap_usb *phy = platform_get_drvdata(pdev);
+
+ clk_unprepare(phy->wkupclk);
+ usb_remove_phy(&phy->phy);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM_RUNTIME
+
+static int omap_usb2_runtime_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_usb *phy = platform_get_drvdata(pdev);
+
+ clk_disable(phy->wkupclk);
+
+ return 0;
+}
+
+static int omap_usb2_runtime_resume(struct device *dev)
+{
+ u32 ret = 0;
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_usb *phy = platform_get_drvdata(pdev);
+
+ ret = clk_enable(phy->wkupclk);
+ if (ret < 0)
+ dev_err(phy->dev, "Failed to enable wkupclk %d\n", ret);
+
+ return ret;
+}
+
+static const struct dev_pm_ops omap_usb2_pm_ops = {
+ SET_RUNTIME_PM_OPS(omap_usb2_runtime_suspend, omap_usb2_runtime_resume,
+ NULL)
+};
+
+#define DEV_PM_OPS (&omap_usb2_pm_ops)
+#else
+#define DEV_PM_OPS NULL
+#endif
+
+#ifdef CONFIG_OF
+static const struct of_device_id omap_usb2_id_table[] = {
+ { .compatible = "ti,omap-usb2" },
+ {}
+};
+MODULE_DEVICE_TABLE(of, omap_usb2_id_table);
+#endif
+
+static struct platform_driver omap_usb2_driver = {
+ .probe = omap_usb2_probe,
+ .remove = __devexit_p(omap_usb2_remove),
+ .driver = {
+ .name = "omap-usb2",
+ .owner = THIS_MODULE,
+ .pm = DEV_PM_OPS,
+ .of_match_table = of_match_ptr(omap_usb2_id_table),
+ },
+};
+
+module_platform_driver(omap_usb2_driver);
+
+MODULE_ALIAS("platform: omap_usb2");
+MODULE_AUTHOR("Texas Instruments Inc.");
+MODULE_DESCRIPTION("OMAP USB2 phy driver");
+MODULE_LICENSE("GPL v2");
Index: experimental/include/linux/usb/omap_usb.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ experimental/include/linux/usb/omap_usb.h 2012-12-05 11:46:39.827567048 +0100
@@ -0,0 +1,46 @@
+/*
+ * omap_usb.h -- omap usb2 phy header file
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Author: Kishon Vijay Abraham I <kishon@ti.com>
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __DRIVERS_OMAP_USB2_H
+#define __DRIVERS_OMAP_USB2_H
+
+#include <linux/usb/otg.h>
+
+struct omap_usb {
+ struct usb_phy phy;
+ struct phy_companion *comparator;
+ struct device *dev;
+ u32 __iomem *control_dev;
+ struct clk *wkupclk;
+ u8 is_suspended:1;
+};
+
+#define PHY_PD 0x1
+
+#define phy_to_omapusb(x) container_of((x), struct omap_usb, phy)
+
+#if defined(CONFIG_OMAP_USB2) || defined(CONFIG_OMAP_USB2_MODULE)
+extern int omap_usb2_set_comparator(struct phy_companion *comparator);
+#else
+static inline int omap_usb2_set_comparator(struct phy_companion *comparator)
+{
+ return -ENODEV;
+}
+#endif
+
+#endif /* __DRIVERS_OMAP_USB_H */
Index: experimental/include/linux/usb/phy_companion.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ experimental/include/linux/usb/phy_companion.h 2012-12-05 11:46:39.839567047 +0100
@@ -0,0 +1,34 @@
+/*
+ * phy-companion.h -- phy companion to indicate the comparator part of PHY
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Author: Kishon Vijay Abraham I <kishon@ti.com>
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __DRIVERS_PHY_COMPANION_H
+#define __DRIVERS_PHY_COMPANION_H
+
+#include <linux/usb/otg.h>
+
+/* phy_companion to take care of VBUS, ID and srp capabilities */
+struct phy_companion {
+
+ /* effective for A-peripheral, ignored for B devices */
+ int (*set_vbus)(struct phy_companion *x, bool enabled);
+
+ /* for B devices only: start session with A-Host */
+ int (*start_srp)(struct phy_companion *x);
+};
+
+#endif /* __DRIVERS_PHY_COMPANION_H */

View File

@ -1,34 +0,0 @@
From ef1c2096fcf390f2f6a6a835d9d26105e82abda5 Mon Sep 17 00:00:00 2001
From: Rob Herring <rob.herring@calxeda.com>
Date: Wed, 15 Aug 2012 16:28:36 +0100
Subject: [PATCH] ARM: 7492/1: add strstr declaration for decompressors
With the generic unaligned.h, more kernel headers get pulled in including
dynamic_debug.h which needs strstr. As it is not really used, we only need
a declaration here.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/boot/compressed/decompress.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/arm/boot/compressed/decompress.c b/arch/arm/boot/compressed/decompress.c
index f41b38c..9deb56a 100644
--- a/arch/arm/boot/compressed/decompress.c
+++ b/arch/arm/boot/compressed/decompress.c
@@ -32,6 +32,9 @@ extern void error(char *);
# define Tracecv(c,x)
#endif
+/* Not needed, but used in some headers pulled in by decompressors */
+extern char * strstr(const char * s1, const char *s2);
+
#ifdef CONFIG_KERNEL_GZIP
#include "../../../../lib/decompress_inflate.c"
#endif
--
1.8.0

View File

@ -1,7 +1,8 @@
From 65cb587d7058441c8c910e8766ee86538c7274d8 Mon Sep 17 00:00:00 2001
From: Arnd Bergmann <arnd@arndb.de>
Date: Fri, 28 Sep 2012 22:36:00 +0100
Subject: [PATCH] staging/iio/lis3l02dq: fix building without irq_to_gpio
Subject: staging/iio/lis3l02dq: fix building without irq_to_gpio
commit 65cb587d7058441c8c910e8766ee86538c7274d8 upstream.
The driver has not been building for some time after the
irq_to_gpio function has been removed from the kernel.
@ -27,10 +28,10 @@ Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/staging/iio/accel/lis3l02dq_ring.c | 2 +-
3 files changed, 8 insertions(+), 5 deletions(-)
Index: experimental/drivers/staging/iio/accel/lis3l02dq.h
===================================================================
--- experimental.orig/drivers/staging/iio/accel/lis3l02dq.h 2012-12-03 20:39:49.000000000 +0100
+++ experimental/drivers/staging/iio/accel/lis3l02dq.h 2012-12-05 11:32:50.159603549 +0100
diff --git a/drivers/staging/iio/accel/lis3l02dq.h b/drivers/staging/iio/accel/lis3l02dq.h
index f9bcd41..2bac722 100644
--- a/drivers/staging/iio/accel/lis3l02dq.h
+++ b/drivers/staging/iio/accel/lis3l02dq.h
@@ -158,6 +158,7 @@ struct lis3l02dq_state {
struct spi_device *us;
struct iio_trigger *trig;
@ -39,10 +40,10 @@ Index: experimental/drivers/staging/iio/accel/lis3l02dq.h
bool trigger_on;
u8 tx[LIS3L02DQ_MAX_RX] ____cacheline_aligned;
Index: experimental/drivers/staging/iio/accel/lis3l02dq_core.c
===================================================================
--- experimental.orig/drivers/staging/iio/accel/lis3l02dq_core.c 2012-12-03 20:39:49.000000000 +0100
+++ experimental/drivers/staging/iio/accel/lis3l02dq_core.c 2012-12-05 11:32:50.159603549 +0100
diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c
index 21b0469..d13c7e9 100644
--- a/drivers/staging/iio/accel/lis3l02dq_core.c
+++ b/drivers/staging/iio/accel/lis3l02dq_core.c
@@ -15,6 +15,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
@ -51,7 +52,7 @@ Index: experimental/drivers/staging/iio/accel/lis3l02dq_core.c
#include <linux/mutex.h>
#include <linux/device.h>
#include <linux/kernel.h>
@@ -690,6 +691,7 @@ static int __devinit lis3l02dq_probe(str
@@ -690,6 +691,7 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi)
spi_set_drvdata(spi, indio_dev);
st->us = spi;
@ -59,7 +60,7 @@ Index: experimental/drivers/staging/iio/accel/lis3l02dq_core.c
mutex_init(&st->buf_lock);
indio_dev->name = spi->dev.driver->name;
indio_dev->dev.parent = &spi->dev;
@@ -711,7 +713,7 @@ static int __devinit lis3l02dq_probe(str
@@ -711,7 +713,7 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi)
goto error_unreg_buffer_funcs;
}
@ -68,7 +69,7 @@ Index: experimental/drivers/staging/iio/accel/lis3l02dq_core.c
ret = request_threaded_irq(st->us->irq,
&lis3l02dq_th,
&lis3l02dq_event_handler,
@@ -738,10 +740,10 @@ static int __devinit lis3l02dq_probe(str
@@ -738,10 +740,10 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi)
return 0;
error_remove_trigger:
@ -81,22 +82,22 @@ Index: experimental/drivers/staging/iio/accel/lis3l02dq_core.c
free_irq(st->us->irq, indio_dev);
error_uninitialize_buffer:
iio_buffer_unregister(indio_dev);
@@ -796,7 +798,7 @@ static int lis3l02dq_remove(struct spi_d
if (ret)
goto err_ret;
@@ -790,7 +792,7 @@ static int __devexit lis3l02dq_remove(struct spi_device *spi)
lis3l02dq_disable_all_events(indio_dev);
lis3l02dq_stop_device(indio_dev);
- if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
+ if (spi->irq)
free_irq(st->us->irq, indio_dev);
lis3l02dq_remove_trigger(indio_dev);
Index: experimental/drivers/staging/iio/accel/lis3l02dq_ring.c
===================================================================
--- experimental.orig/drivers/staging/iio/accel/lis3l02dq_ring.c 2012-12-03 20:39:49.000000000 +0100
+++ experimental/drivers/staging/iio/accel/lis3l02dq_ring.c 2012-12-05 11:32:50.183603549 +0100
@@ -264,7 +264,7 @@ static int lis3l02dq_trig_try_reen(struc
/* If gpio still high (or high again) */
/* In theory possible we will need to do this several times */
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index fa4190d..13c0b4b 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -263,7 +263,7 @@ static int lis3l02dq_trig_try_reen(struct iio_trigger *trig)
/* If gpio still high (or high again)
* In theory possible we will need to do this several times */
for (i = 0; i < 5; i++)
- if (gpio_get_value(irq_to_gpio(st->us->irq)))
+ if (gpio_get_value(st->gpio))

View File

@ -1,29 +0,0 @@
From: Ben Hutchings <ben@decadent.org.uk>
Date: Thu, 7 Jun 2012 04:40:34 +0100
Subject: [PATCH] IA64: Export <asm/cmpxchg.h> to userland
Parts of <asm/intrinsics.h> were moved to <asm/cmpxchg.h>, and the
former now includes the latter. The former is exported to userland
so the latter must be too.
Cc: stable@vger.kernel.org # v3.4
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
arch/ia64/include/asm/Kbuild | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild
index 241d1c5..c929a53 100644
--- a/arch/ia64/include/asm/Kbuild
+++ b/arch/ia64/include/asm/Kbuild
@@ -6,6 +6,7 @@ header-y += gcc_intrin.h
header-y += ia64regs.h
header-y += intel_intrin.h
header-y += intrinsics.h
+header-y += cmpxchg.h
header-y += perfmon.h
header-y += perfmon_default_smpl.h
header-y += ptrace_offsets.h
--
1.7.10

View File

@ -15,7 +15,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
--- a/drivers/gpu/drm/nouveau/Kconfig
+++ b/drivers/gpu/drm/nouveau/Kconfig
@@ -11,8 +11,8 @@
@@ -11,8 +11,8 @@ config DRM_NOUVEAU
select FRAMEBUFFER_CONSOLE if !EXPERT
select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT
select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT
@ -28,21 +28,22 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Choose this option for open-source nVidia support.
--- a/drivers/gpu/drm/nouveau/Makefile
+++ b/drivers/gpu/drm/nouveau/Makefile
@@ -42,6 +42,8 @@
nouveau-$(CONFIG_DRM_NOUVEAU_DEBUG) += nouveau_debugfs.o
@@ -186,7 +186,9 @@ nouveau-y += nouveau_mem.o
# other random bits
nouveau-$(CONFIG_COMPAT) += nouveau_ioc32.o
nouveau-$(CONFIG_DRM_NOUVEAU_BACKLIGHT) += nouveau_backlight.o
+ifdef CONFIG_X86
nouveau-$(CONFIG_ACPI) += nouveau_acpi.o
+endif
nouveau-$(CONFIG_DRM_NOUVEAU_BACKLIGHT) += nouveau_backlight.o
obj-$(CONFIG_DRM_NOUVEAU)+= nouveau.o
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -1095,7 +1095,7 @@
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.h
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.h
@@ -3,7 +3,7 @@
/* nouveau_acpi.c */
#define ROM_BIOS_PAGE 4096
-#if defined(CONFIG_ACPI)
+#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
void nouveau_register_dsm_handler(void);

View File

@ -5,8 +5,8 @@ Subject: [PATCH 2/2] cgroups: Document the Debian memory resource controller
---
--- a/Documentation/cgroups/memory.txt
+++ b/Documentation/cgroups/memory.txt
@@ -47,6 +47,10 @@ Features:
Kernel memory support is work in progress, and the current version provides
@@ -46,6 +46,10 @@ Features:
Kernel memory support is a work in progress, and the current version provides
basically functionality. (See Section 2.7)
+NOTE: In Debian kernel packages, the memory resource controller is

View File

@ -1,27 +0,0 @@
From: Ben Hutchings <ben@decadent.org.uk>
Subject: debugfs: Set default mode to 700
Bug-Debian: http://bugs.debian.org/681418
As discussed here
<http://lists.linux-foundation.org/pipermail/ksummit-2012-discuss/2012-July/000891.html>.
Mounting of debugfs is a significant security liability, but there are
applications that depend on some interfaces based on debugfs and they
(or their packages) will mount it automatically anyway.
Setting the default mode for the debugfs root to 700 (accessible
to root only) should leave it functional, since most such applications
will require root anyway, and users can override it to relax
permissions if they really don't care about the security problems.
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -28,7 +28,7 @@
#include <linux/magic.h>
#include <linux/slab.h>
-#define DEBUGFS_DEFAULT_MODE 0755
+#define DEBUGFS_DEFAULT_MODE 0700
static struct vfsmount *debugfs_mount;
static int debugfs_mount_count;

View File

@ -1,24 +1,14 @@
From 2a7d7ecc9fdcdaa0b82865078fd2a47e3b46da1b Mon Sep 17 00:00:00 2001
From: Ben Hutchings <ben@decadent.org.uk>
Date: Mon, 17 Aug 2009 02:45:41 +0100
Subject: [PATCH 1/2] dvb-usb-af9005: mark as broken
Subject: dvb-usb-af9005: mark as broken
---
drivers/media/dvb/dvb-usb/Kconfig | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index 496c1a3..868e1cb 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -238,6 +238,7 @@ config DVB_USB_OPERA1
--- a/drivers/media/usb/dvb-usb/Kconfig
+++ b/drivers/media/usb/dvb-usb/Kconfig
@@ -227,6 +227,7 @@ config DVB_USB_OPERA1
config DVB_USB_AF9005
tristate "Afatech AF9005 DVB-T USB1.1 support"
+ depends on BROKEN
depends on DVB_USB && EXPERIMENTAL
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
--
1.6.3.3
depends on DVB_USB
select MEDIA_TUNER_MT2060 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_QT1010 if MEDIA_SUBDRV_AUTOSELECT

View File

@ -1,8 +1,14 @@
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index ce1e7ba..4bd5a0c 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -497,2 +497,3 @@ config VIDEO_OV7670
From: Ben Hutchings <ben@decadent.org.uk>
Date: Sun, 27 May 2012 01:56:58 +0100
Subject: vs6624: mark as broken
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -422,6 +422,7 @@ config VIDEO_OV7670
controller.
config VIDEO_VS6624
+ depends on BROKEN
tristate "ST VS6624 sensor support"
depends on VIDEO_V4L2 && I2C
depends on MEDIA_CAMERA_SUPPORT

View File

@ -99,5 +99,5 @@ use of $(ARCH) needs to be moved after this.
+ hdr-arch := m68k
+endif
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE := \

View File

@ -33,8 +33,8 @@ to both DRM and radeon.
---
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -37,6 +37,8 @@
#include "drm_pciids.h"
@@ -36,6 +36,8 @@
#include <drm/drm_pciids.h>
#include <linux/console.h>
#include <linux/module.h>
+#include <linux/namei.h>
@ -42,7 +42,7 @@ to both DRM and radeon.
/*
@@ -378,6 +380,24 @@ static struct pci_driver radeon_kms_pci_
@@ -411,6 +413,24 @@ static struct pci_driver radeon_kms_pci_
.resume = radeon_pci_resume,
};
@ -67,7 +67,7 @@ to both DRM and radeon.
static int __init radeon_init(void)
{
driver = &driver_old;
@@ -402,6 +422,13 @@ static int __init radeon_init(void)
@@ -435,6 +455,13 @@ static int __init radeon_init(void)
radeon_modeset = 0;
#endif
}

View File

@ -8,16 +8,16 @@ are set.
--- a/Makefile
+++ b/Makefile
@@ -806,7 +806,7 @@ endif
@@ -822,7 +822,7 @@ endif
prepare2: prepare3 outputmakefile asm-generic
prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
- include/config/auto.conf
+ include/config/auto.conf include/generated/package.h
$(cmd_crmodverdir)
archprepare: archheaders archscripts prepare1 scripts_basic
@@ -838,12 +838,25 @@ define filechk_version.h
@@ -854,12 +854,25 @@ define filechk_version.h
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
endef
@ -31,7 +31,7 @@ are set.
+endef
+endif
+
include/linux/version.h: $(srctree)/Makefile FORCE
$(version_h): $(srctree)/Makefile FORCE
$(call filechk,version.h)
include/generated/utsrelease.h: include/config/kernel.release FORCE
@ -53,7 +53,7 @@ are set.
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/atomic.h>
@@ -164,11 +165,12 @@ static void show_last_breaking_event(str
@@ -181,11 +182,12 @@ static void show_last_breaking_event(str
*/
void dump_stack(void)
{
@ -68,10 +68,10 @@ are set.
printk("Process %s (pid: %d, task: %p, ksp: %p)\n",
current->comm, current->pid, current,
(void *) current->thread.ksp);
@@ -215,11 +217,12 @@ void show_registers(struct pt_regs *regs
@@ -231,11 +233,12 @@ void show_registers(struct pt_regs *regs
void show_regs(struct pt_regs *regs)
{
print_modules();
- printk("CPU: %d %s %s %.*s\n",
+ printk("CPU: %d %s %s %.*s%s\n",
task_thread_info(current)->cpu, print_tainted(),
@ -92,7 +92,7 @@ are set.
+#include <generated/package.h>
#include <asm/current.h>
#include <asm/ptrace.h>
#include "sysrq.h"
#include <asm/sysrq.h>
@@ -16,8 +17,9 @@ void __show_regs(struct pt_regs *regs)
{
printk("\n");
@ -115,7 +115,7 @@ are set.
#include <asm/cpu.h>
#include <asm/apic.h>
#include <asm/syscalls.h>
@@ -147,11 +148,12 @@ void show_regs_common(void)
@@ -135,11 +136,12 @@ void show_regs_common(void)
/* Board Name is optional */
board = dmi_get_system_info(DMI_BOARD_NAME);
@ -178,14 +178,14 @@ are set.
regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -31,6 +31,7 @@
#include <linux/random.h>
@@ -32,6 +32,7 @@
#include <linux/hw_breakpoint.h>
#include <linux/cpuidle.h>
#include <linux/leds.h>
+#include <generated/package.h>
#include <asm/cacheflush.h>
#include <asm/leds.h>
#include <asm/processor.h>
@@ -278,11 +279,12 @@ void __show_regs(struct pt_regs *regs)
unsigned long flags;
char buf[64];
@ -211,7 +211,7 @@ are set.
#include <asm/pgtable.h>
#include <asm/uaccess.h>
@@ -644,8 +645,9 @@ void show_regs(struct pt_regs * regs)
@@ -643,8 +644,9 @@ void show_regs(struct pt_regs * regs)
printk("NIP: "REG" LR: "REG" CTR: "REG"\n",
regs->nip, regs->link, regs->ctr);

View File

@ -18,8 +18,6 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
scripts/kconfig/lkc_proto.h | 1 +
4 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index f208f90..ffaa787 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -364,7 +364,6 @@ static void conf(struct menu *menu)
@ -27,10 +25,10 @@ index f208f90..ffaa787 100644
case P_MENU:
if ((input_mode == silentoldconfig ||
- input_mode == listnewconfig ||
input_mode == oldnoconfig) &&
input_mode == olddefconfig) &&
rootEntry != menu) {
check_conf(menu);
@@ -425,11 +424,7 @@ static void check_conf(struct menu *menu)
@@ -425,11 +424,7 @@ static void check_conf(struct menu *menu
if (sym && !sym_has_value(sym)) {
if (sym_is_changable(sym) ||
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
@ -38,12 +36,12 @@ index f208f90..ffaa787 100644
- if (sym->name && !sym_is_choice_value(sym)) {
- printf("%s%s\n", CONFIG_, sym->name);
- }
- } else if (input_mode != oldnoconfig) {
+ if (input_mode != oldnoconfig) {
- } else if (input_mode != olddefconfig) {
+ if (input_mode != olddefconfig) {
if (!conf_cnt++)
printf(_("*\n* Restart config...\n*\n"));
rootEntry = menu_get_parent_menu(menu);
@@ -442,6 +437,30 @@ static void check_conf(struct menu *menu)
@@ -442,6 +437,30 @@ static void check_conf(struct menu *menu
check_conf(child);
}
@ -74,7 +72,7 @@ index f208f90..ffaa787 100644
static struct option long_opts[] = {
{"oldaskconfig", no_argument, NULL, oldaskconfig},
{"oldconfig", no_argument, NULL, oldconfig},
@@ -482,6 +501,7 @@ int main(int ac, char **av)
@@ -489,6 +508,7 @@ int main(int ac, char **av)
const char *progname = av[0];
int opt;
const char *name, *defconfig_file = NULL /* gcc uninit */;
@ -82,12 +80,12 @@ index f208f90..ffaa787 100644
struct stat tmpstat;
setlocale(LC_ALL, "");
@@ -634,16 +654,18 @@ int main(int ac, char **av)
@@ -651,16 +671,18 @@ int main(int ac, char **av)
input_mode = silentoldconfig;
/* fall through */
case oldconfig:
- case listnewconfig:
case oldnoconfig:
case olddefconfig:
case silentoldconfig:
/* Update until a loop caused no more changes */
do {
@ -95,8 +93,8 @@ index f208f90..ffaa787 100644
check_conf(&rootmenu);
- } while (conf_cnt &&
- (input_mode != listnewconfig &&
- input_mode != oldnoconfig));
+ } while (conf_cnt && input_mode != oldnoconfig);
- input_mode != olddefconfig));
+ } while (conf_cnt && input_mode != olddefconfig);
+ break;
+ case listnewconfig:
+ conf_set_all_new_symbols(def_default);
@ -105,11 +103,9 @@ index f208f90..ffaa787 100644
break;
}
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 59b667c..d2be252 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -695,6 +695,14 @@ next_menu:
@@ -727,6 +727,14 @@ next_menu:
return 0;
}
@ -124,7 +120,7 @@ index 59b667c..d2be252 100644
int conf_write(const char *name)
{
FILE *out;
@@ -1079,6 +1087,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
@@ -1111,6 +1119,7 @@ void conf_set_all_new_symbols(enum conf_
for_all_symbols(i, sym) {
if (sym_has_value(sym))
continue;
@ -132,11 +128,9 @@ index 59b667c..d2be252 100644
switch (sym_get_type(sym)) {
case S_BOOLEAN:
case S_TRISTATE:
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index 80fce57..0db77f3 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -104,6 +104,8 @@ struct symbol {
@@ -106,6 +106,8 @@ struct symbol {
#define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
@ -145,11 +139,9 @@ index 80fce57..0db77f3 100644
#define SYMBOL_MAXLENGTH 256
#define SYMBOL_HASHSIZE 9973
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index 47fe9c3..dd0024a 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -7,6 +7,7 @@ P(conf_read_simple,int,(const char *name, int));
@@ -7,6 +7,7 @@ P(conf_read_simple,int,(const char *name
P(conf_write_defconfig,int,(const char *name));
P(conf_write,int,(const char *name));
P(conf_write_autoconf,int,(void));
@ -157,6 +149,3 @@ index 47fe9c3..dd0024a 100644
P(conf_get_changed,bool,(void));
P(conf_set_changed_callback, void,(void (*fn)(void)));
P(conf_set_message_callback, void,(void (*fn)(const char *fmt, va_list ap)));
--
1.7.5.4

View File

@ -313,8 +313,8 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_H__ */
--- a/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/branch.c 2012-10-29 03:30:14.227048051 +0000
@@ -0,0 +1,1169 @@
+++ b/fs/aufs/branch.c 2012-12-16 14:11:13.354479811 +0000
@@ -0,0 +1,1172 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -373,7 +373,10 @@
+ else
+ break;
+
+ /* recursive lock, s_umount of branch's */
+ lockdep_off();
+ mntput(br->br_mnt);
+ lockdep_on();
+ kfree(wbr);
+ kfree(br);
+}
@ -949,7 +952,7 @@
+ continue;
+
+ /* AuDbgInode(i); */
+ if (au_iigen(i) == sigen)
+ if (au_iigen(i, NULL) == sigen)
+ ii_read_lock_child(i);
+ else {
+ ii_write_lock_child(i);
@ -1759,7 +1762,7 @@
+
+-include ${srctree}/${src}/conf_priv.mk
--- a/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/cpup.c 2012-10-29 03:30:14.227048051 +0000
+++ b/fs/aufs/cpup.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,1085 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -2185,7 +2188,7 @@
+ goto out;
+
+ err = -ENOMEM;
+ sym.k = __getname_gfp(GFP_NOFS);
+ sym.k = (void *)__get_free_page(GFP_NOFS);
+ if (unlikely(!sym.k))
+ goto out;
+
@ -2200,7 +2203,7 @@
+ sym.k[symlen] = 0;
+ err = vfsub_symlink(h_dir, h_path, sym.k);
+ }
+ __putname(sym.k);
+ free_page((unsigned long)sym.k);
+
+out:
+ return err;
@ -3663,7 +3666,7 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DCSUB_H__ */
--- a/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/debug.c 2012-10-29 03:30:14.227048051 +0000
+++ b/fs/aufs/debug.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -3791,7 +3794,7 @@
+ if (!iinfo)
+ return;
+ dpri("i-1: bstart %d, bend %d, gen %d\n",
+ iinfo->ii_bstart, iinfo->ii_bend, au_iigen(inode));
+ iinfo->ii_bstart, iinfo->ii_bend, au_iigen(inode, NULL));
+ if (iinfo->ii_bstart < 0)
+ return;
+ hn = 0;
@ -4401,8 +4404,8 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DEBUG_H__ */
--- a/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/dentry.c 2012-10-29 03:30:14.231048075 +0000
@@ -0,0 +1,1063 @@
+++ b/fs/aufs/dentry.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,1060 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -4438,7 +4441,6 @@
+struct au_do_lookup_args {
+ unsigned int flags;
+ mode_t type;
+ unsigned int nd_flags;
+};
+
+/*
@ -4529,8 +4531,7 @@
+ * otherwise an error.
+ * can be called at unlinking with @type is zero.
+ */
+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type,
+ unsigned int flags)
+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type)
+{
+ int npositive, err;
+ aufs_bindex_t bindex, btail, bdiropq;
@ -4538,8 +4539,7 @@
+ struct qstr whname;
+ struct au_do_lookup_args args = {
+ .flags = 0,
+ .type = type,
+ .nd_flags = flags
+ .type = type
+ };
+ const struct qstr *name = &dentry->d_name;
+ struct dentry *parent;
@ -5137,7 +5137,7 @@
+ * if current working dir is removed, it returns an error.
+ * but the dentry is legal.
+ */
+ err = au_lkup_dentry(dentry, /*bstart*/0, /*type*/0, /*flags*/0);
+ err = au_lkup_dentry(dentry, /*bstart*/0, /*type*/0);
+ AuDbgDentry(dentry);
+ au_di_swap(tmp, dinfo);
+ if (err == -ENOENT)
@ -5467,8 +5467,8 @@
+ .d_release = aufs_d_release
+};
--- a/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/dentry.h 2012-10-29 03:30:14.231048075 +0000
@@ -0,0 +1,235 @@
+++ b/fs/aufs/dentry.h 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -5522,8 +5522,7 @@
+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir,
+ struct dentry *h_parent, struct au_branch *br);
+
+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type,
+ unsigned int flags);
+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type);
+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex);
+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent);
+int au_reval_dpath(struct dentry *dentry, unsigned int sigen);
@ -7488,7 +7487,7 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_DYNOP_H__ */
--- a/fs/aufs/export.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/export.c 2012-10-29 03:30:14.235048090 +0000
+++ b/fs/aufs/export.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,811 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -7714,7 +7713,7 @@
+ sigen = au_sigen(sb);
+ if (unlikely(is_bad_inode(inode)
+ || IS_DEADDIR(inode)
+ || sigen != au_iigen(inode)))
+ || sigen != au_iigen(inode, NULL)))
+ goto out_iput;
+
+ dentry = NULL;
@ -7859,7 +7858,7 @@
+ goto out;
+
+ dentry = ERR_PTR(-ENOMEM);
+ arg.name = __getname_gfp(GFP_NOFS);
+ arg.name = (void *)__get_free_page(GFP_NOFS);
+ if (unlikely(!arg.name))
+ goto out_file;
+ arg.ino = ino;
@ -7891,7 +7890,7 @@
+ }
+
+out_name:
+ __putname(arg.name);
+ free_page((unsigned long)arg.name);
+out_file:
+ fput(file);
+out:
@ -8302,8 +8301,8 @@
+ atomic_set(&sbinfo->si_xigen_next, u);
+}
--- a/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/f_op.c 2012-10-29 03:30:14.235048090 +0000
@@ -0,0 +1,724 @@
+++ b/fs/aufs/f_op.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,723 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -8779,7 +8778,6 @@
+{
+ return AuConv_VM_MAP(flags, GROWSDOWN)
+ | AuConv_VM_MAP(flags, DENYWRITE)
+ | AuConv_VM_MAP(flags, EXECUTABLE)
+ | AuConv_VM_MAP(flags, LOCKED);
+}
+
@ -11993,8 +11991,8 @@
+ au_hn_destroy_cache();
+}
--- a/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/i_op.c 2012-10-29 03:30:14.239048114 +0000
@@ -0,0 +1,1009 @@
+++ b/fs/aufs/i_op.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,1026 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -12160,15 +12158,21 @@
+
+ IMustLock(dir);
+
+ /* todo: support rcu-walk? */
+ ret = ERR_PTR(-ECHILD);
+ if (flags & LOOKUP_RCU)
+ goto out;
+
+ ret = ERR_PTR(-ENAMETOOLONG);
+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN))
+ goto out;
+
+ sb = dir->i_sb;
+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM);
+ ret = ERR_PTR(err);
+ if (unlikely(err))
+ goto out;
+
+ ret = ERR_PTR(-ENAMETOOLONG);
+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN))
+ goto out_si;
+ err = au_di_init(dentry);
+ ret = ERR_PTR(err);
+ if (unlikely(err))
@ -12183,7 +12187,7 @@
+ err = au_digen_test(parent, au_sigen(sb));
+ if (!err) {
+ npositive = au_lkup_dentry(dentry, au_dbstart(parent),
+ /*type*/0, flags);
+ /*type*/0);
+ err = npositive;
+ }
+ di_read_unlock(parent, AuLock_IR);
@ -12201,6 +12205,13 @@
+ }
+
+ ret = d_splice_alias(inode, dentry);
+#if 0
+ if (unlikely(d_need_lookup(dentry))) {
+ spin_lock(&dentry->d_lock);
+ dentry->d_flags &= ~DCACHE_NEED_LOOKUP;
+ spin_unlock(&dentry->d_lock);
+ } else
+#endif
+ if (unlikely(IS_ERR(ret) && inode)) {
+ ii_write_unlock(inode);
+ iput(inode);
@ -12904,7 +12915,7 @@
+ } buf;
+
+ err = -ENOMEM;
+ buf.k = __getname_gfp(GFP_NOFS);
+ buf.k = (void *)__get_free_page(GFP_NOFS);
+ if (unlikely(!buf.k))
+ goto out;
+
@ -12929,7 +12940,7 @@
+ }
+
+out_name:
+ __putname(buf.k);
+ free_page((unsigned long)buf.k);
+out:
+ AuTraceErr(err);
+ return ERR_PTR(err);
@ -12938,7 +12949,11 @@
+static void aufs_put_link(struct dentry *dentry __maybe_unused,
+ struct nameidata *nd, void *cookie __maybe_unused)
+{
+ __putname(nd_get_link(nd));
+ char *p;
+
+ p = nd_get_link(nd);
+ if (!IS_ERR_OR_NULL(p))
+ free_page((unsigned long)p);
+}
+
+/* ---------------------------------------------------------------------- */
@ -13005,8 +13020,8 @@
+ .update_time = aufs_update_time
+};
--- a/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/i_op_add.c 2012-10-29 03:30:14.239048114 +0000
@@ -0,0 +1,712 @@
+++ b/fs/aufs/i_op_add.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,713 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -13276,7 +13291,8 @@
+ h_dir = au_pinned_h_dir(&pin);
+ switch (arg->type) {
+ case Creat:
+ err = vfsub_create(h_dir, &h_path, arg->u.c.mode, arg->u.c.want_excl);
+ err = vfsub_create(h_dir, &h_path, arg->u.c.mode,
+ arg->u.c.want_excl);
+ break;
+ case Symlink:
+ err = vfsub_symlink(h_dir, &h_path, arg->u.s.symname);
@ -13720,8 +13736,8 @@
+ return err;
+}
--- a/fs/aufs/i_op_del.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/i_op_del.c 2012-10-29 03:30:14.239048114 +0000
@@ -0,0 +1,478 @@
+++ b/fs/aufs/i_op_del.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -13792,8 +13808,7 @@
+ au_di_cp(tmp, dinfo);
+ au_di_swap(tmp, dinfo);
+ /* returns the number of positive dentries */
+ need_wh = au_lkup_dentry(dentry, bstart + 1, /*type*/0,
+ /*flags*/0);
+ need_wh = au_lkup_dentry(dentry, bstart + 1, /*type*/0);
+ au_di_swap(tmp, dinfo);
+ au_rw_write_unlock(&tmp->di_rwsem);
+ au_di_free(tmp);
@ -15230,8 +15245,8 @@
+ return err;
+}
--- a/fs/aufs/iinfo.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/iinfo.c 2012-01-10 02:15:56.000000000 +0000
@@ -0,0 +1,264 @@
+++ b/fs/aufs/iinfo.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -15344,10 +15359,22 @@
+ hinode->hi_whdentry = h_wh;
+}
+
+void au_update_iigen(struct inode *inode)
+void au_update_iigen(struct inode *inode, int half)
+{
+ atomic_set(&au_ii(inode)->ii_generation, au_sigen(inode->i_sb));
+ /* smp_mb(); */ /* atomic_set */
+ struct au_iinfo *iinfo;
+ struct au_iigen *iigen;
+ unsigned int sigen;
+
+ sigen = au_sigen(inode->i_sb);
+ iinfo = au_ii(inode);
+ iigen = &iinfo->ii_generation;
+ spin_lock(&iinfo->ii_genspin);
+ iigen->ig_generation = sigen;
+ if (half)
+ au_ig_fset(iigen->ig_flags, HALF_REFRESHED);
+ else
+ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED);
+ spin_unlock(&iinfo->ii_genspin);
+}
+
+/* it may be called at remount time, too */
@ -15398,6 +15425,7 @@
+ struct au_iinfo *iinfo = &c->iinfo;
+ static struct lock_class_key aufs_ii;
+
+ spin_lock_init(&iinfo->ii_genspin);
+ au_rw_init(&iinfo->ii_rwsem);
+ au_rw_class(&iinfo->ii_rwsem, &aufs_ii);
+ inode_init_once(&c->vfs_inode);
@ -15420,8 +15448,7 @@
+ for (i = 0; i < nbr; i++)
+ iinfo->ii_hinode[i].hi_id = -1;
+
+ atomic_set(&iinfo->ii_generation, au_sigen(sb));
+ /* smp_mb(); */ /* atomic_set */
+ iinfo->ii_generation.ig_generation = au_sigen(sb);
+ iinfo->ii_bstart = -1;
+ iinfo->ii_bend = -1;
+ iinfo->ii_vdir = NULL;
@ -15497,8 +15524,8 @@
+ AuRwDestroy(&iinfo->ii_rwsem);
+}
--- a/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/inode.c 2012-10-29 03:30:14.239048114 +0000
@@ -0,0 +1,478 @@
+++ b/fs/aufs/inode.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,488 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -15535,7 +15562,7 @@
+static void au_refresh_hinode_attr(struct inode *inode, int do_version)
+{
+ au_cpup_attr_all(inode, /*force*/0);
+ au_update_iigen(inode);
+ au_update_iigen(inode, /*half*/1);
+ if (do_version)
+ inode->i_version++;
+}
@ -15754,6 +15781,8 @@
+static int reval_inode(struct inode *inode, struct dentry *dentry)
+{
+ int err;
+ unsigned int gen;
+ struct au_iigen iigen;
+ aufs_bindex_t bindex, bend;
+ struct inode *h_inode, *h_dinode;
+
@ -15772,12 +15801,20 @@
+ bend = au_ibend(inode);
+ for (bindex = au_ibstart(inode); bindex <= bend; bindex++) {
+ h_inode = au_h_iptr(inode, bindex);
+ if (h_inode && h_inode == h_dinode) {
+ err = 0;
+ if (au_iigen_test(inode, au_digen(dentry)))
+ err = au_refresh_hinode(inode, dentry);
+ if (!h_inode || h_inode != h_dinode)
+ continue;
+
+ err = 0;
+ gen = au_iigen(inode, &iigen);
+ if (gen == au_digen(dentry)
+ && !au_ig_ftest(iigen.ig_flags, HALF_REFRESHED))
+ break;
+ }
+
+ /* fully refresh inode using dentry */
+ err = au_refresh_hinode(inode, dentry);
+ if (!err)
+ au_update_iigen(inode, /*half*/0);
+ break;
+ }
+
+ if (unlikely(err))
@ -15978,8 +16015,8 @@
+ return au_test_h_perm(h_inode, mask);
+}
--- a/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/inode.h 2012-10-29 03:30:14.243048129 +0000
@@ -0,0 +1,560 @@
+++ b/fs/aufs/inode.h 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,588 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -16033,9 +16070,22 @@
+ struct dentry *hi_whdentry;
+};
+
+/* ig_flags */
+#define AuIG_HALF_REFRESHED 1
+#define au_ig_ftest(flags, name) ((flags) & AuIG_##name)
+#define au_ig_fset(flags, name) \
+ do { (flags) |= AuIG_##name; } while (0)
+#define au_ig_fclr(flags, name) \
+ do { (flags) &= ~AuIG_##name; } while (0)
+
+struct au_iigen {
+ __u32 ig_generation, ig_flags;
+};
+
+struct au_vdir;
+struct au_iinfo {
+ atomic_t ii_generation;
+ spinlock_t ii_genspin;
+ struct au_iigen ii_generation;
+ struct super_block *ii_hsb1; /* no get/put */
+
+ struct au_rwsem ii_rwsem;
@ -16184,7 +16234,7 @@
+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex,
+ struct inode *h_inode, unsigned int flags);
+
+void au_update_iigen(struct inode *inode);
+void au_update_iigen(struct inode *inode, int half);
+void au_update_ibrange(struct inode *inode, int do_put_zero);
+
+void au_icntnr_init_once(void *_c);
@ -16292,9 +16342,19 @@
+#endif
+}
+
+static inline unsigned int au_iigen(struct inode *inode)
+static inline unsigned int au_iigen(struct inode *inode, struct au_iigen *iigen)
+{
+ return atomic_read(&au_ii(inode)->ii_generation);
+ unsigned int gen;
+ struct au_iinfo *iinfo;
+
+ iinfo = au_ii(inode);
+ spin_lock(&iinfo->ii_genspin);
+ if (iigen)
+ *iigen = iinfo->ii_generation;
+ gen = iinfo->ii_generation.ig_generation;
+ spin_unlock(&iinfo->ii_genspin);
+
+ return gen;
+}
+
+/* tiny test for inode number */
@ -16311,7 +16371,12 @@
+
+static inline void au_iigen_dec(struct inode *inode)
+{
+ atomic_dec(&au_ii(inode)->ii_generation);
+ struct au_iinfo *iinfo;
+
+ iinfo = au_ii(inode);
+ spin_lock(&iinfo->ii_genspin);
+ iinfo->ii_generation.ig_generation--;
+ spin_unlock(&iinfo->ii_genspin);
+}
+
+static inline int au_iigen_test(struct inode *inode, unsigned int sigen)
@ -16319,7 +16384,7 @@
+ int err;
+
+ err = 0;
+ if (unlikely(inode && au_iigen(inode) != sigen))
+ if (unlikely(inode && au_iigen(inode, NULL) != sigen))
+ err = -EIO;
+
+ return err;
@ -16986,8 +17051,8 @@
+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b
+endif
--- a/fs/aufs/module.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/module.c 2012-03-11 05:01:22.000000000 +0000
@@ -0,0 +1,196 @@
+++ b/fs/aufs/module.c 2012-12-16 14:11:13.358479829 +0000
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -17055,6 +17120,12 @@
+{
+ int i;
+
+ /*
+ * Make sure all delayed rcu free inodes are flushed before we
+ * destroy cache.
+ */
+ rcu_barrier();
+
+ /* excluding AuCache_HNOTIFY */
+ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last);
+ for (i = 0; i < AuCache_HNOTIFY; i++)
@ -20509,7 +20580,7 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_RWSEM_H__ */
--- a/fs/aufs/sbinfo.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/sbinfo.c 2012-01-10 02:15:56.000000000 +0000
+++ b/fs/aufs/sbinfo.c 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -20670,7 +20741,7 @@
+
+ gen = ++au_sbi(sb)->si_generation;
+ au_update_digen(sb->s_root);
+ au_update_iigen(sb->s_root->d_inode);
+ au_update_iigen(sb->s_root->d_inode, /*half*/0);
+ sb->s_root->d_inode->i_version++;
+ return gen;
+}
@ -20920,8 +20991,8 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_SPL_H__ */
--- a/fs/aufs/super.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/super.c 2012-10-29 03:30:14.243048129 +0000
@@ -0,0 +1,962 @@
+++ b/fs/aufs/super.c 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,993 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -21341,6 +21412,36 @@
+
+/* ---------------------------------------------------------------------- */
+
+static int aufs_sync_fs(struct super_block *sb, int wait)
+{
+ int err, e;
+ aufs_bindex_t bend, bindex;
+ struct au_branch *br;
+ struct super_block *h_sb;
+
+ err = 0;
+ si_noflush_read_lock(sb);
+ bend = au_sbend(sb);
+ for (bindex = 0; bindex <= bend; bindex++) {
+ br = au_sbr(sb, bindex);
+ if (!au_br_writable(br->br_perm))
+ continue;
+
+ h_sb = au_sbr_sb(sb, bindex);
+ if (h_sb->s_op->sync_fs) {
+ e = h_sb->s_op->sync_fs(h_sb, wait);
+ if (unlikely(e && !err))
+ err = e;
+ /* go on even if an error happens */
+ }
+ }
+ si_read_unlock(sb);
+
+ return err;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/* final actions when unmounting a file system */
+static void aufs_put_super(struct super_block *sb)
+{
@ -21551,7 +21652,7 @@
+ sigen = au_sigen(sb);
+ for (ull = 0; ull < max; ull++) {
+ inode = array[ull];
+ if (au_iigen(inode) != sigen) {
+ if (au_iigen(inode, NULL) != sigen) {
+ ii_write_lock_child(inode);
+ e = au_refresh_hinode_self(inode);
+ ii_write_unlock(inode);
@ -21704,6 +21805,7 @@
+ .show_options = aufs_show_options,
+ .statfs = aufs_statfs,
+ .put_super = aufs_put_super,
+ .sync_fs = aufs_sync_fs,
+ .remount_fs = aufs_remount_fs
+};
+
@ -23060,7 +23162,7 @@
+ pr_err("err %d (ignored)\n", err);
+}
--- a/fs/aufs/vdir.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/vdir.c 2012-01-10 02:15:56.000000000 +0000
+++ b/fs/aufs/vdir.c 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,885 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -23586,7 +23688,7 @@
+ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH));
+
+ err = -ENOMEM;
+ o = p = __getname_gfp(GFP_NOFS);
+ o = p = (void *)__get_free_page(GFP_NOFS);
+ if (unlikely(!p))
+ goto out;
+
@ -23606,7 +23708,7 @@
+ }
+ }
+
+ __putname(o);
+ free_page((unsigned long)o);
+
+out:
+ AuTraceErr(err);
@ -24728,8 +24830,8 @@
+ return err;
+}
--- a/fs/aufs/vfsub.h 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/vfsub.h 2012-10-29 03:30:14.243048129 +0000
@@ -0,0 +1,283 @@
+++ b/fs/aufs/vfsub.h 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ *
@ -24895,7 +24997,8 @@
+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1,
+ struct dentry *d2, struct au_hinode *hdir2);
+
+int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl);
+int vfsub_create(struct inode *dir, struct path *path, int mode,
+ bool want_excl);
+int vfsub_symlink(struct inode *dir, struct path *path,
+ const char *symname);
+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev);
@ -25717,7 +25820,7 @@
+ }
+};
--- a/fs/aufs/whout.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/whout.c 2012-10-29 03:30:14.247048152 +0000
+++ b/fs/aufs/whout.c 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,1042 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -26536,7 +26639,7 @@
+ struct au_vdir_destr *str;
+
+ err = -ENOMEM;
+ p = __getname_gfp(GFP_NOFS);
+ p = (void *)__get_free_page(GFP_NOFS);
+ wh_name.name = p;
+ if (unlikely(!wh_name.name))
+ goto out;
@ -26566,7 +26669,7 @@
+ break;
+ }
+ }
+ __putname(wh_name.name);
+ free_page((unsigned long)wh_name.name);
+
+out:
+ return err;
@ -27165,7 +27268,7 @@
+#endif /* __KERNEL__ */
+#endif /* __AUFS_WKQ_H__ */
--- a/fs/aufs/xino.c 1970-01-01 01:00:00.000000000 +0100
+++ b/fs/aufs/xino.c 2012-07-22 01:31:00.000000000 +0100
+++ b/fs/aufs/xino.c 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,1264 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
@ -28377,7 +28480,7 @@
+
+ if (bwr >= 0) {
+ file = ERR_PTR(-ENOMEM);
+ page = __getname_gfp(GFP_NOFS);
+ page = (void *)__get_free_page(GFP_NOFS);
+ if (unlikely(!page))
+ goto out;
+ path.mnt = br->br_mnt;
@ -28391,7 +28494,7 @@
+ if (!IS_ERR(file))
+ au_xino_brid_set(sb, br->br_id);
+ }
+ __putname(page);
+ free_page((unsigned long)page);
+ } else {
+ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0);
+ if (IS_ERR(file))
@ -28432,10 +28535,10 @@
+ return err;
+}
--- a/include/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100
+++ b/include/linux/aufs_type.h 2012-10-29 03:30:14.247048152 +0000
@@ -0,0 +1,233 @@
+++ b/include/linux/aufs_type.h 2012-12-16 14:11:13.362479850 +0000
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2005-2012 Junjiro R. Okajima
+ * Copyright (C) 2012 Junjiro R. Okajima
+ *
+ * This program, aufs is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
@ -28452,218 +28555,4 @@
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __AUFS_TYPE_H__
+#define __AUFS_TYPE_H__
+
+#define AUFS_NAME "aufs"
+
+#ifdef __KERNEL__
+/*
+ * define it before including all other headers.
+ * sched.h may use pr_* macros before defining "current", so define the
+ * no-current version first, and re-define later.
+ */
+#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__
+#include <linux/sched.h>
+#undef pr_fmt
+#define pr_fmt(fmt) AUFS_NAME " %s:%d:%s[%d]: " fmt, \
+ __func__, __LINE__, current->comm, current->pid
+#else
+#include <stdint.h>
+#include <sys/types.h>
+#endif /* __KERNEL__ */
+
+#include <linux/limits.h>
+
+#define AUFS_VERSION "3.6-20121015"
+
+/* todo? move this to linux-2.6.19/include/magic.h */
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef CONFIG_AUFS_BRANCH_MAX_127
+typedef int8_t aufs_bindex_t;
+#define AUFS_BRANCH_MAX 127
+#else
+typedef int16_t aufs_bindex_t;
+#ifdef CONFIG_AUFS_BRANCH_MAX_511
+#define AUFS_BRANCH_MAX 511
+#elif defined(CONFIG_AUFS_BRANCH_MAX_1023)
+#define AUFS_BRANCH_MAX 1023
+#elif defined(CONFIG_AUFS_BRANCH_MAX_32767)
+#define AUFS_BRANCH_MAX 32767
+#endif
+#endif
+
+#ifdef __KERNEL__
+#ifndef AUFS_BRANCH_MAX
+#error unknown CONFIG_AUFS_BRANCH_MAX value
+#endif
+#endif /* __KERNEL__ */
+
+/* ---------------------------------------------------------------------- */
+
+#define AUFS_FSTYPE AUFS_NAME
+
+#define AUFS_ROOT_INO 2
+#define AUFS_FIRST_INO 11
+
+#define AUFS_WH_PFX ".wh."
+#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1)
+#define AUFS_WH_TMP_LEN 4
+/* a limit for rmdir/rename a dir */
+#define AUFS_MAX_NAMELEN (NAME_MAX \
+ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\
+ - 1 /* dot */\
+ - AUFS_WH_TMP_LEN) /* hex */
+#define AUFS_XINO_FNAME "." AUFS_NAME ".xino"
+#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME
+#define AUFS_XINO_TRUNC_INIT 64 /* blocks */
+#define AUFS_XINO_TRUNC_STEP 4 /* blocks */
+#define AUFS_DIRWH_DEF 3
+#define AUFS_RDCACHE_DEF 10 /* seconds */
+#define AUFS_RDCACHE_MAX 3600 /* seconds */
+#define AUFS_RDBLK_DEF 512 /* bytes */
+#define AUFS_RDHASH_DEF 32
+#define AUFS_WKQ_NAME AUFS_NAME "d"
+#define AUFS_MFS_DEF_SEC 30 /* seconds */
+#define AUFS_MFS_MAX_SEC 3600 /* seconds */
+#define AUFS_PLINK_WARN 100 /* number of plinks */
+
+/* pseudo-link maintenace under /proc */
+#define AUFS_PLINK_MAINT_NAME "plink_maint"
+#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME
+#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME
+
+#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */
+#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME
+
+#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME
+#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk"
+#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph"
+
+/* doubly whiteouted */
+#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME
+#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME
+#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME
+
+/* branch permissions and attributes */
+#define AUFS_BRPERM_RW "rw"
+#define AUFS_BRPERM_RO "ro"
+#define AUFS_BRPERM_RR "rr"
+#define AUFS_BRRATTR_WH "wh"
+#define AUFS_BRWATTR_NLWH "nolwh"
+
+/* ---------------------------------------------------------------------- */
+
+/* ioctl */
+enum {
+ /* readdir in userspace */
+ AuCtl_RDU,
+ AuCtl_RDU_INO,
+
+ /* pathconf wrapper */
+ AuCtl_WBR_FD,
+
+ /* busy inode */
+ AuCtl_IBUSY
+};
+
+/* borrowed from linux/include/linux/kernel.h */
+#ifndef ALIGN
+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1)
+#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask))
+#endif
+
+/* borrowed from linux/include/linux/compiler-gcc3.h */
+#ifndef __aligned
+#define __aligned(x) __attribute__((aligned(x)))
+#endif
+
+#ifdef __KERNEL__
+#ifndef __packed
+#define __packed __attribute__((packed))
+#endif
+#endif
+
+struct au_rdu_cookie {
+ uint64_t h_pos;
+ int16_t bindex;
+ uint8_t flags;
+ uint8_t pad;
+ uint32_t generation;
+} __aligned(8);
+
+struct au_rdu_ent {
+ uint64_t ino;
+ int16_t bindex;
+ uint8_t type;
+ uint8_t nlen;
+ uint8_t wh;
+ char name[0];
+} __aligned(8);
+
+static inline int au_rdu_len(int nlen)
+{
+ /* include the terminating NULL */
+ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1,
+ sizeof(uint64_t));
+}
+
+union au_rdu_ent_ul {
+ struct au_rdu_ent __user *e;
+ uint64_t ul;
+};
+
+enum {
+ AufsCtlRduV_SZ,
+ AufsCtlRduV_End
+};
+
+struct aufs_rdu {
+ /* input */
+ union {
+ uint64_t sz; /* AuCtl_RDU */
+ uint64_t nent; /* AuCtl_RDU_INO */
+ };
+ union au_rdu_ent_ul ent;
+ uint16_t verify[AufsCtlRduV_End];
+
+ /* input/output */
+ uint32_t blk;
+
+ /* output */
+ union au_rdu_ent_ul tail;
+ /* number of entries which were added in a single call */
+ uint64_t rent;
+ uint8_t full;
+ uint8_t shwh;
+
+ struct au_rdu_cookie cookie;
+} __aligned(8);
+
+/* ---------------------------------------------------------------------- */
+
+struct aufs_wbr_fd {
+ uint32_t oflags;
+ int16_t brid;
+} __aligned(8);
+
+/* ---------------------------------------------------------------------- */
+
+struct aufs_ibusy {
+ uint64_t ino, h_ino;
+ int16_t bindex;
+} __aligned(8);
+
+/* ---------------------------------------------------------------------- */
+
+#define AuCtlType 'A'
+#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu)
+#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu)
+#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \
+ struct aufs_wbr_fd)
+#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy)
+
+#endif /* __AUFS_TYPE_H__ */
+#include <uapi/linux/aufs_type.h>

View File

@ -1,7 +1,20 @@
aufs3.6 base patch
aufs3.x-rcN base patch
diff --git a/fs/file_table.c b/fs/file_table.c
index a72bf9d..dac6792 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -36,7 +36,7 @@ struct files_stat_struct files_stat = {
.max_files = NR_FILE
};
-DEFINE_STATIC_LGLOCK(files_lglock);
+DEFINE_LGLOCK(files_lglock);
/* SLAB cache for file structures */
static struct kmem_cache *filp_cachep __read_mostly;
diff --git a/fs/inode.c b/fs/inode.c
index ac8d904..7b2c8fa 100644
index b03c719..ee497f9 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1491,7 +1491,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode,
@ -14,7 +27,7 @@ index ac8d904..7b2c8fa 100644
if (inode->i_op->update_time)
return inode->i_op->update_time(inode, time, flags);
diff --git a/fs/splice.c b/fs/splice.c
index 41514dd..663b402 100644
index 13e5b47..f185c6c 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1093,8 +1093,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
@ -42,10 +55,10 @@ index 41514dd..663b402 100644
ssize_t (*splice_read)(struct file *, loff_t *,
struct pipe_inode_info *, size_t, unsigned int);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index aa11047..9116d2e 100644
index b33cfc9..963a61b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2741,6 +2741,7 @@ extern int inode_change_ok(const struct inode *, struct iattr *);
@@ -2558,6 +2558,7 @@ extern int inode_change_ok(const struct inode *, struct iattr *);
extern int inode_newsize_ok(const struct inode *, loff_t offset);
extern void setattr_copy(struct inode *inode, const struct iattr *attr);

View File

@ -1,4 +1,4 @@
aufs3.6 kbuild patch
aufs3.x-rcN kbuild patch
diff --git a/fs/Kconfig b/fs/Kconfig
index f95ae3a..6d8a9a5 100644
@ -13,23 +13,11 @@ index f95ae3a..6d8a9a5 100644
endif # MISC_FILESYSTEMS
diff --git a/fs/Makefile b/fs/Makefile
index 2fb9779..abefac5 100644
index 1d7af79..06db6eb 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -125,3 +125,4 @@ obj-$(CONFIG_GFS2_FS) += gfs2/
@@ -126,3 +126,4 @@ obj-$(CONFIG_GFS2_FS) += gfs2/
obj-y += exofs/ # Multiple modules
obj-$(CONFIG_CEPH_FS) += ceph/
obj-$(CONFIG_PSTORE) += pstore/
+obj-$(CONFIG_AUFS_FS) += aufs/
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
index fa21760..ee029e3 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
@@ -66,6 +66,7 @@ header-y += atmppp.h
header-y += atmsap.h
header-y += atmsvc.h
header-y += audit.h
+header-y += aufs_type.h
header-y += auto_fs.h
header-y += auto_fs4.h
header-y += auxvec.h

View File

@ -1,7 +1,7 @@
aufs3.6 standalone patch
aufs3.x-rcN standalone patch
diff --git a/fs/file_table.c b/fs/file_table.c
index 701985e..a9fe741 100644
index dac6792..e3f2c15 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -37,6 +37,7 @@ struct files_stat_struct files_stat = {
@ -12,7 +12,7 @@ index 701985e..a9fe741 100644
/* SLAB cache for file structures */
static struct kmem_cache *filp_cachep __read_mostly;
@@ -509,6 +510,8 @@ void file_sb_list_del(struct file *file)
@@ -403,6 +404,8 @@ void file_sb_list_del(struct file *file)
}
}
@ -22,7 +22,7 @@ index 701985e..a9fe741 100644
/*
diff --git a/fs/inode.c b/fs/inode.c
index 7b2c8fa..0c4318d 100644
index ee497f9..5e7eee7 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -56,6 +56,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
@ -42,7 +42,7 @@ index 7b2c8fa..0c4318d 100644
/**
* touch_atime - update the access time
diff --git a/fs/namespace.c b/fs/namespace.c
index 7bdf790..5b85c4c 100644
index 2496062..3e66a90 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -50,6 +50,7 @@ EXPORT_SYMBOL_GPL(fs_kobj);
@ -123,7 +123,7 @@ index f104d56..54f36db 100644
static int fsnotify_mark_destroy(void *ignored)
{
diff --git a/fs/open.c b/fs/open.c
index e1f2cdb..2804cd6 100644
index 59071f5..7e4c856 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -60,6 +60,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
@ -135,7 +135,7 @@ index e1f2cdb..2804cd6 100644
static long do_sys_truncate(const char __user *pathname, loff_t length)
{
diff --git a/fs/splice.c b/fs/splice.c
index 663b402..51e1deb 100644
index f185c6c..f3d89da 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1117,6 +1117,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
@ -171,7 +171,7 @@ index 6dbae46..9f4f29a 100644
}
+EXPORT_SYMBOL_GPL(cap_mmap_file);
diff --git a/security/device_cgroup.c b/security/device_cgroup.c
index 442204c..e644a1c 100644
index b08d20c..a90420b 100644
--- a/security/device_cgroup.c
+++ b/security/device_cgroup.c
@@ -7,6 +7,7 @@
@ -182,19 +182,19 @@ index 442204c..e644a1c 100644
#include <linux/list.h>
#include <linux/uaccess.h>
#include <linux/seq_file.h>
@@ -493,6 +494,7 @@ found:
return -EPERM;
@@ -617,6 +618,7 @@ int __devcgroup_inode_permission(struct inode *inode, int mask)
return __devcgroup_check_permission(type, imajor(inode), iminor(inode),
access);
}
+EXPORT_SYMBOL_GPL(__devcgroup_inode_permission);
int devcgroup_inode_mknod(int mode, dev_t dev)
{
diff --git a/security/security.c b/security/security.c
index 860aeb3..ffb57bf 100644
index 8dcd4ae..6efe561 100644
--- a/security/security.c
+++ b/security/security.c
@@ -384,6 +384,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
@@ -396,6 +396,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
return 0;
return security_ops->path_rmdir(dir, dentry);
}
@ -202,7 +202,7 @@ index 860aeb3..ffb57bf 100644
int security_path_unlink(struct path *dir, struct dentry *dentry)
{
@@ -400,6 +401,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
@@ -412,6 +413,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
return 0;
return security_ops->path_symlink(dir, dentry, old_name);
}
@ -210,7 +210,7 @@ index 860aeb3..ffb57bf 100644
int security_path_link(struct dentry *old_dentry, struct path *new_dir,
struct dentry *new_dentry)
@@ -408,6 +410,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
@@ -420,6 +422,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
return 0;
return security_ops->path_link(old_dentry, new_dir, new_dentry);
}
@ -218,7 +218,7 @@ index 860aeb3..ffb57bf 100644
int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
struct path *new_dir, struct dentry *new_dentry)
@@ -426,6 +429,7 @@ int security_path_truncate(struct path *path)
@@ -438,6 +441,7 @@ int security_path_truncate(struct path *path)
return 0;
return security_ops->path_truncate(path);
}
@ -226,15 +226,15 @@ index 860aeb3..ffb57bf 100644
int security_path_chmod(struct path *path, umode_t mode)
{
@@ -433,6 +437,7 @@ int security_path_chmod(struct path *path, umode_t mode)
@@ -445,6 +449,7 @@ int security_path_chmod(struct path *path, umode_t mode)
return 0;
return security_ops->path_chmod(path, mode);
}
+EXPORT_SYMBOL_GPL(security_path_chmod);
int security_path_chown(struct path *path, uid_t uid, gid_t gid)
int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
{
@@ -440,6 +445,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid)
@@ -452,6 +457,7 @@ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
return 0;
return security_ops->path_chown(path, uid, gid);
}
@ -242,7 +242,7 @@ index 860aeb3..ffb57bf 100644
int security_path_chroot(struct path *path)
{
@@ -516,6 +522,7 @@ int security_inode_readlink(struct dentry *dentry)
@@ -528,6 +534,7 @@ int security_inode_readlink(struct dentry *dentry)
return 0;
return security_ops->inode_readlink(dentry);
}
@ -250,7 +250,7 @@ index 860aeb3..ffb57bf 100644
int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
{
@@ -530,6 +537,7 @@ int security_inode_permission(struct inode *inode, int mask)
@@ -542,6 +549,7 @@ int security_inode_permission(struct inode *inode, int mask)
return 0;
return security_ops->inode_permission(inode, mask);
}
@ -258,7 +258,7 @@ index 860aeb3..ffb57bf 100644
int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
{
@@ -645,6 +653,7 @@ int security_file_permission(struct file *file, int mask)
@@ -663,6 +671,7 @@ int security_file_permission(struct file *file, int mask)
return fsnotify_perm(file, mask);
}
@ -266,7 +266,7 @@ index 860aeb3..ffb57bf 100644
int security_file_alloc(struct file *file)
{
@@ -705,6 +714,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
@@ -723,6 +732,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
return ret;
return ima_file_mmap(file, prot);
}

View File

@ -19,7 +19,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -455,8 +455,8 @@
@@ -455,8 +455,8 @@ bytes respectively. Such letter suffixes
ccw_timeout_log [S390]
See Documentation/s390/CommonIO for details.
@ -32,7 +32,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
checkreqprot [SELINUX] Set initial checkreqprot flag value.
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -709,6 +709,14 @@
@@ -784,6 +784,14 @@ config MEMCG
This config option also selects MM_OWNER config option, which
could in turn add some fork/exit overhead.
@ -49,7 +49,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
depends on MEMCG && SWAP
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -5029,7 +5029,7 @@
@@ -5132,7 +5132,7 @@ static void cgroup_release_agent(struct
mutex_unlock(&cgroup_mutex);
}
@ -58,8 +58,8 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
{
int i;
char *token;
@@ -5045,17 +5045,29 @@
struct cgroup_subsys *ss = subsys[i];
@@ -5152,17 +5152,29 @@ static int __init cgroup_disable(char *s
continue;
if (!strcmp(token, ss->name)) {
- ss->disabled = 1;
@ -93,7 +93,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
*/
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5596,6 +5596,9 @@
@@ -5630,6 +5630,9 @@ static void mem_cgroup_move_task(struct
struct cgroup_subsys mem_cgroup_subsys = {
.name = "memory",

View File

@ -11,26 +11,22 @@ a version of the script which is directly derived from the driver.
drivers/media/dvb/dvb-usb/af9005-fe.c | 66 ++++++++++++++++++++++++++------
2 files changed, 54 insertions(+), 14 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index 868e1cb..1c3d56d 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -238,10 +238,10 @@ config DVB_USB_OPERA1
--- a/drivers/media/usb/dvb-usb/Kconfig
+++ b/drivers/media/usb/dvb-usb/Kconfig
@@ -227,10 +227,10 @@ config DVB_USB_OPERA1
config DVB_USB_AF9005
tristate "Afatech AF9005 DVB-T USB1.1 support"
- depends on BROKEN
depends on DVB_USB && EXPERIMENTAL
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
depends on DVB_USB
select MEDIA_TUNER_MT2060 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_QT1010 if MEDIA_SUBDRV_AUTOSELECT
+ select FW_LOADER
help
Say Y here to support the Afatech AF9005 based DVB-T USB1.1 receiver
and the TerraTec Cinergy T USB XE (Rev.1)
diff --git a/drivers/media/dvb/dvb-usb/af9005-fe.c b/drivers/media/dvb/dvb-usb/af9005-fe.c
index 199ece0..bcc26c8 100644
--- a/drivers/media/dvb/dvb-usb/af9005-fe.c
+++ b/drivers/media/dvb/dvb-usb/af9005-fe.c
--- a/drivers/media/usb/dvb-usb/af9005-fe.c
+++ b/drivers/media/usb/dvb-usb/af9005-fe.c
@@ -22,10 +22,26 @@
* see Documentation/dvb/README.dvb-usb for more information
*/
@ -59,7 +55,7 @@ index 199ece0..bcc26c8 100644
struct af9005_fe_state {
struct dvb_usb_device *d;
@@ -818,6 +834,8 @@ static int af9005_fe_init(struct dvb_frontend *fe)
@@ -816,6 +832,8 @@ static int af9005_fe_init(struct dvb_fro
{
struct af9005_fe_state *state = fe->demodulator_priv;
struct dvb_usb_adapter *adap = fe->dvb->priv;
@ -68,7 +64,7 @@ index 199ece0..bcc26c8 100644
int ret, i, scriptlen;
u8 temp, temp0 = 0, temp1 = 0, temp2 = 0;
u8 buf[2];
@@ -969,37 +987,55 @@ static int af9005_fe_init(struct dvb_frontend *fe)
@@ -968,37 +986,55 @@ static int af9005_fe_init(struct dvb_fro
if ((ret = af9005_write_ofdm_register(state->d, 0xaefb, 0x01)))
return ret;
@ -136,7 +132,7 @@ index 199ece0..bcc26c8 100644
/* save original TOPs */
deb_info("save original TOPs\n");
@@ -1079,6 +1115,10 @@ static int af9005_fe_init(struct dvb_frontend *fe)
@@ -1078,6 +1114,10 @@ static int af9005_fe_init(struct dvb_fro
deb_info("profit!\n");
return 0;
@ -147,6 +143,3 @@ index 199ece0..bcc26c8 100644
}
static int af9005_fe_sleep(struct dvb_frontend *fe)
--
1.6.3.3

View File

@ -38,22 +38,14 @@ bugfix/ia64/nouveau-ACPI-support-is-dependent-on-X86.patch
bugfix/arm/ixp4xx_iobe.patch
debian/x86-memtest-WARN-if-bad-RAM-found.patch
bugfix/ia64/IA64-Export-asm-cmpxchg.h-to-userland.patch
features/all/cpu-devices/Partially-revert-cpufreq-Add-support-for-x86-cpuinfo.patch
debian/debugfs-set-default-mode-to-700.patch
bugfix/alpha/alpha-use-large-data-model.diff
bugfix/all/speakup-lower-default-software-speech-rate.patch
debian/iwlwifi-do-not-request-unreleased-firmware.patch
debian/cirrus-disable-modeset-by-default.patch
debian/fs-enable-link-security-restrictions-by-default.patch
bugfix/all/hid-add-apple-wireless-keyboard-2011-ansi-to-special-driver-list.patch
bugfix/arm/ARM-7492-1-add-strstr-declaration-for-decompressors.patch
bugfix/arm/lis3l02dq-fix-building-without-irq-to-gpio.patch
bugfix/arm/0001-usb-phy-add-a-new-driver-for-omap-usb2-phy.patch
bugfix/arm/0001-usb-otg-make-twl6030_usb-as-a-comparator-driver-to-o.patch
bugfix/arm/0001-usb-otg-Fix-build-errors-if-USB_MUSB_OMAP2PLUS-is-se.patch
bugfix/arm/omap-musb-choice.patch
bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch