diff options
35 files changed, 223 insertions, 187 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 870d190fe617..0a46833c1b76 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -493,3 +493,52 @@ Why: These two features use non-standard interfaces. There are the | |||
493 | Who: Corentin Chary <corentin.chary@gmail.com> | 493 | Who: Corentin Chary <corentin.chary@gmail.com> |
494 | 494 | ||
495 | ---------------------------- | 495 | ---------------------------- |
496 | |||
497 | What: usbvideo quickcam_messenger driver | ||
498 | When: 2.6.35 | ||
499 | Files: drivers/media/video/usbvideo/quickcam_messenger.[ch] | ||
500 | Why: obsolete v4l1 driver replaced by gspca_stv06xx | ||
501 | Who: Hans de Goede <hdegoede@redhat.com> | ||
502 | |||
503 | ---------------------------- | ||
504 | |||
505 | What: ov511 v4l1 driver | ||
506 | When: 2.6.35 | ||
507 | Files: drivers/media/video/ov511.[ch] | ||
508 | Why: obsolete v4l1 driver replaced by gspca_ov519 | ||
509 | Who: Hans de Goede <hdegoede@redhat.com> | ||
510 | |||
511 | ---------------------------- | ||
512 | |||
513 | What: w9968cf v4l1 driver | ||
514 | When: 2.6.35 | ||
515 | Files: drivers/media/video/w9968cf*.[ch] | ||
516 | Why: obsolete v4l1 driver replaced by gspca_ov519 | ||
517 | Who: Hans de Goede <hdegoede@redhat.com> | ||
518 | |||
519 | ---------------------------- | ||
520 | |||
521 | What: ovcamchip sensor framework | ||
522 | When: 2.6.35 | ||
523 | Files: drivers/media/video/ovcamchip/* | ||
524 | Why: Only used by obsoleted v4l1 drivers | ||
525 | Who: Hans de Goede <hdegoede@redhat.com> | ||
526 | |||
527 | ---------------------------- | ||
528 | |||
529 | What: stv680 v4l1 driver | ||
530 | When: 2.6.35 | ||
531 | Files: drivers/media/video/stv680.[ch] | ||
532 | Why: obsolete v4l1 driver replaced by gspca_stv0680 | ||
533 | Who: Hans de Goede <hdegoede@redhat.com> | ||
534 | |||
535 | ---------------------------- | ||
536 | |||
537 | What: zc0301 v4l driver | ||
538 | When: 2.6.35 | ||
539 | Files: drivers/media/video/zc0301/* | ||
540 | Why: Duplicate functionality with the gspca_zc3xx driver, zc0301 only | ||
541 | supports 2 USB-ID's (because it only supports a limited set of | ||
542 | sensors) wich are also supported by the gspca_zc3xx driver | ||
543 | (which supports 53 USB-ID's in total) | ||
544 | Who: Hans de Goede <hdegoede@redhat.com> | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 3f591629e953..1858646b52e3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1637,9 +1637,8 @@ S: Maintained | |||
1637 | F: sound/pci/cs5535audio/ | 1637 | F: sound/pci/cs5535audio/ |
1638 | 1638 | ||
1639 | CX18 VIDEO4LINUX DRIVER | 1639 | CX18 VIDEO4LINUX DRIVER |
1640 | M: Hans Verkuil <hverkuil@xs4all.nl> | ||
1641 | M: Andy Walls <awalls@radix.net> | 1640 | M: Andy Walls <awalls@radix.net> |
1642 | L: ivtv-devel@ivtvdriver.org | 1641 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) |
1643 | L: linux-media@vger.kernel.org | 1642 | L: linux-media@vger.kernel.org |
1644 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 1643 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
1645 | W: http://linuxtv.org | 1644 | W: http://linuxtv.org |
@@ -3011,8 +3010,8 @@ S: Maintained | |||
3011 | F: drivers/isdn/hardware/eicon/ | 3010 | F: drivers/isdn/hardware/eicon/ |
3012 | 3011 | ||
3013 | IVTV VIDEO4LINUX DRIVER | 3012 | IVTV VIDEO4LINUX DRIVER |
3014 | M: Hans Verkuil <hverkuil@xs4all.nl> | 3013 | M: Andy Walls <awalls@radix.net> |
3015 | L: ivtv-devel@ivtvdriver.org | 3014 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) |
3016 | L: linux-media@vger.kernel.org | 3015 | L: linux-media@vger.kernel.org |
3017 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 3016 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
3018 | W: http://www.ivtvdriver.org | 3017 | W: http://www.ivtvdriver.org |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 51069245b79a..3b3c36601a7b 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -125,50 +125,36 @@ void mconsole_log(struct mc_request *req) | |||
125 | void mconsole_proc(struct mc_request *req) | 125 | void mconsole_proc(struct mc_request *req) |
126 | { | 126 | { |
127 | struct nameidata nd; | 127 | struct nameidata nd; |
128 | struct file_system_type *proc; | 128 | struct vfsmount *mnt = current->nsproxy->pid_ns->proc_mnt; |
129 | struct super_block *super; | ||
130 | struct file *file; | 129 | struct file *file; |
131 | int n, err; | 130 | int n, err; |
132 | char *ptr = req->request.data, *buf; | 131 | char *ptr = req->request.data, *buf; |
132 | mm_segment_t old_fs = get_fs(); | ||
133 | 133 | ||
134 | ptr += strlen("proc"); | 134 | ptr += strlen("proc"); |
135 | ptr = skip_spaces(ptr); | 135 | ptr = skip_spaces(ptr); |
136 | 136 | ||
137 | proc = get_fs_type("proc"); | 137 | err = vfs_path_lookup(mnt->mnt_root, mnt, ptr, LOOKUP_FOLLOW, &nd); |
138 | if (proc == NULL) { | 138 | if (err) { |
139 | mconsole_reply(req, "procfs not registered", 1, 0); | 139 | mconsole_reply(req, "Failed to look up file", 1, 0); |
140 | goto out; | 140 | goto out; |
141 | } | 141 | } |
142 | 142 | ||
143 | super = (*proc->get_sb)(proc, 0, NULL, NULL); | 143 | err = may_open(&nd.path, MAY_READ, FMODE_READ); |
144 | put_filesystem(proc); | 144 | if (result) { |
145 | if (super == NULL) { | 145 | mconsole_reply(req, "Failed to open file", 1, 0); |
146 | mconsole_reply(req, "Failed to get procfs superblock", 1, 0); | 146 | path_put(&nd.path); |
147 | goto out; | 147 | goto out; |
148 | } | 148 | } |
149 | up_write(&super->s_umount); | ||
150 | |||
151 | nd.path.dentry = super->s_root; | ||
152 | nd.path.mnt = NULL; | ||
153 | nd.flags = O_RDONLY + 1; | ||
154 | nd.last_type = LAST_ROOT; | ||
155 | |||
156 | /* START: it was experienced that the stability problems are closed | ||
157 | * if commenting out these two calls + the below read cycle. To | ||
158 | * make UML crash again, it was enough to readd either one.*/ | ||
159 | err = link_path_walk(ptr, &nd); | ||
160 | if (err) { | ||
161 | mconsole_reply(req, "Failed to look up file", 1, 0); | ||
162 | goto out_kill; | ||
163 | } | ||
164 | 149 | ||
165 | file = dentry_open(nd.path.dentry, nd.path.mnt, O_RDONLY, | 150 | file = dentry_open(nd.path.dentry, nd.path.mnt, O_RDONLY, |
166 | current_cred()); | 151 | current_cred()); |
152 | err = PTR_ERR(file); | ||
167 | if (IS_ERR(file)) { | 153 | if (IS_ERR(file)) { |
168 | mconsole_reply(req, "Failed to open file", 1, 0); | 154 | mconsole_reply(req, "Failed to open file", 1, 0); |
169 | goto out_kill; | 155 | path_put(&nd.path); |
156 | goto out; | ||
170 | } | 157 | } |
171 | /*END*/ | ||
172 | 158 | ||
173 | buf = kmalloc(PAGE_SIZE, GFP_KERNEL); | 159 | buf = kmalloc(PAGE_SIZE, GFP_KERNEL); |
174 | if (buf == NULL) { | 160 | if (buf == NULL) { |
@@ -176,10 +162,13 @@ void mconsole_proc(struct mc_request *req) | |||
176 | goto out_fput; | 162 | goto out_fput; |
177 | } | 163 | } |
178 | 164 | ||
179 | if ((file->f_op != NULL) && (file->f_op->read != NULL)) { | 165 | if (file->f_op->read) { |
180 | do { | 166 | do { |
181 | n = (*file->f_op->read)(file, buf, PAGE_SIZE - 1, | 167 | loff_t pos; |
182 | &file->f_pos); | 168 | set_fs(KERNEL_DS); |
169 | n = vfs_read(file, buf, PAGE_SIZE - 1, &pos); | ||
170 | file_pos_write(file, pos); | ||
171 | set_fs(old_fs); | ||
183 | if (n >= 0) { | 172 | if (n >= 0) { |
184 | buf[n] = '\0'; | 173 | buf[n] = '\0'; |
185 | mconsole_reply(req, buf, 0, (n > 0)); | 174 | mconsole_reply(req, buf, 0, (n > 0)); |
@@ -197,8 +186,6 @@ void mconsole_proc(struct mc_request *req) | |||
197 | kfree(buf); | 186 | kfree(buf); |
198 | out_fput: | 187 | out_fput: |
199 | fput(file); | 188 | fput(file); |
200 | out_kill: | ||
201 | deactivate_super(super); | ||
202 | out: ; | 189 | out: ; |
203 | } | 190 | } |
204 | #endif | 191 | #endif |
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c index bff7a5356037..b521ed9d6e2e 100644 --- a/drivers/media/IR/ir-keytable.c +++ b/drivers/media/IR/ir-keytable.c | |||
@@ -13,7 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | 15 | ||
16 | #include <linux/usb/input.h> | 16 | #include <linux/input.h> |
17 | #include <media/ir-common.h> | 17 | #include <media/ir-common.h> |
18 | 18 | ||
19 | #define IR_TAB_MIN_SIZE 32 | 19 | #define IR_TAB_MIN_SIZE 32 |
diff --git a/drivers/media/common/tuners/tda8290.c b/drivers/media/common/tuners/tda8290.c index c190b0dedee4..2833137fa819 100644 --- a/drivers/media/common/tuners/tda8290.c +++ b/drivers/media/common/tuners/tda8290.c | |||
@@ -144,7 +144,8 @@ static void set_audio(struct dvb_frontend *fe, | |||
144 | } | 144 | } |
145 | 145 | ||
146 | if (params->mode == V4L2_TUNER_RADIO) { | 146 | if (params->mode == V4L2_TUNER_RADIO) { |
147 | priv->tda8290_easy_mode = 0x01; /* Start with MN values */ | 147 | /* Set TDA8295 to FM radio; Start TDA8290 with MN values */ |
148 | priv->tda8290_easy_mode = (priv->ver & TDA8295) ? 0x80 : 0x01; | ||
148 | tuner_dbg("setting to radio FM\n"); | 149 | tuner_dbg("setting to radio FM\n"); |
149 | } else { | 150 | } else { |
150 | tuner_dbg("setting tda829x to system %s\n", mode); | 151 | tuner_dbg("setting tda829x to system %s\n", mode); |
@@ -672,16 +673,19 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props) | |||
672 | static int tda8295_probe(struct tuner_i2c_props *i2c_props) | 673 | static int tda8295_probe(struct tuner_i2c_props *i2c_props) |
673 | { | 674 | { |
674 | #define TDA8295_ID 0x8a | 675 | #define TDA8295_ID 0x8a |
676 | #define TDA8295C2_ID 0x8b | ||
675 | unsigned char tda8295_id[] = { 0x2f, 0x00 }; | 677 | unsigned char tda8295_id[] = { 0x2f, 0x00 }; |
676 | 678 | ||
677 | /* detect tda8295 */ | 679 | /* detect tda8295 */ |
678 | tuner_i2c_xfer_send(i2c_props, &tda8295_id[0], 1); | 680 | tuner_i2c_xfer_send(i2c_props, &tda8295_id[0], 1); |
679 | tuner_i2c_xfer_recv(i2c_props, &tda8295_id[1], 1); | 681 | tuner_i2c_xfer_recv(i2c_props, &tda8295_id[1], 1); |
680 | 682 | ||
681 | if (tda8295_id[1] == TDA8295_ID) { | 683 | if ((tda8295_id[1] & 0xfe) == TDA8295_ID) { |
682 | if (debug) | 684 | if (debug) |
683 | printk(KERN_DEBUG "%s: tda8295 detected @ %d-%04x\n", | 685 | printk(KERN_DEBUG "%s: %s detected @ %d-%04x\n", |
684 | __func__, i2c_adapter_id(i2c_props->adap), | 686 | __func__, (tda8295_id[1] == TDA8295_ID) ? |
687 | "tda8295c1" : "tda8295c2", | ||
688 | i2c_adapter_id(i2c_props->adap), | ||
685 | i2c_props->addr); | 689 | i2c_props->addr); |
686 | return 0; | 690 | return 0; |
687 | } | 691 | } |
diff --git a/drivers/media/dvb/frontends/dib8000.h b/drivers/media/dvb/frontends/dib8000.h index d99619ae983c..b1ee20799639 100644 --- a/drivers/media/dvb/frontends/dib8000.h +++ b/drivers/media/dvb/frontends/dib8000.h | |||
@@ -100,7 +100,7 @@ static inline int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_ | |||
100 | static inline enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe) | 100 | static inline enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe) |
101 | { | 101 | { |
102 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 102 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
103 | return CT_SHUTDOWN, | 103 | return CT_SHUTDOWN; |
104 | } | 104 | } |
105 | static inline void dib8000_pwm_agc_reset(struct dvb_frontend *fe) | 105 | static inline void dib8000_pwm_agc_reset(struct dvb_frontend *fe) |
106 | { | 106 | { |
diff --git a/drivers/media/dvb/frontends/lgdt3305.h b/drivers/media/dvb/frontends/lgdt3305.h index 4fa6e52d1fe8..9cb11c9cae53 100644 --- a/drivers/media/dvb/frontends/lgdt3305.h +++ b/drivers/media/dvb/frontends/lgdt3305.h | |||
@@ -54,13 +54,13 @@ struct lgdt3305_config { | |||
54 | u16 usref_qam256; /* default: 0x2a80 */ | 54 | u16 usref_qam256; /* default: 0x2a80 */ |
55 | 55 | ||
56 | /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */ | 56 | /* disable i2c repeater - 0:repeater enabled 1:repeater disabled */ |
57 | int deny_i2c_rptr:1; | 57 | unsigned int deny_i2c_rptr:1; |
58 | 58 | ||
59 | /* spectral inversion - 0:disabled 1:enabled */ | 59 | /* spectral inversion - 0:disabled 1:enabled */ |
60 | int spectral_inversion:1; | 60 | unsigned int spectral_inversion:1; |
61 | 61 | ||
62 | /* use RF AGC loop - 0:disabled 1:enabled */ | 62 | /* use RF AGC loop - 0:disabled 1:enabled */ |
63 | int rf_agc_loop:1; | 63 | unsigned int rf_agc_loop:1; |
64 | 64 | ||
65 | enum lgdt3305_mpeg_mode mpeg_mode; | 65 | enum lgdt3305_mpeg_mode mpeg_mode; |
66 | enum lgdt3305_tp_clock_edge tpclk_edge; | 66 | enum lgdt3305_tp_clock_edge tpclk_edge; |
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index e930a67d526b..bd6214d4ab3b 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -1815,6 +1815,8 @@ static int vidioc_qbuf(struct file *file, void *priv, | |||
1815 | /* put the buffer in the 'queued' queue */ | 1815 | /* put the buffer in the 'queued' queue */ |
1816 | i = gspca_dev->fr_q; | 1816 | i = gspca_dev->fr_q; |
1817 | gspca_dev->fr_queue[i] = index; | 1817 | gspca_dev->fr_queue[i] = index; |
1818 | if (gspca_dev->fr_i == i) | ||
1819 | gspca_dev->cur_frame = frame; | ||
1818 | gspca_dev->fr_q = (i + 1) % gspca_dev->nframes; | 1820 | gspca_dev->fr_q = (i + 1) % gspca_dev->nframes; |
1819 | PDEBUG(D_FRAM, "qbuf q:%d i:%d o:%d", | 1821 | PDEBUG(D_FRAM, "qbuf q:%d i:%d o:%d", |
1820 | gspca_dev->fr_q, | 1822 | gspca_dev->fr_q, |
diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c index aa2f3c7e2cb5..1b536f7d30cf 100644 --- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c | |||
@@ -48,6 +48,12 @@ static | |||
48 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") | 48 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") |
49 | } | 49 | } |
50 | }, { | 50 | }, { |
51 | .ident = "Fujitsu-Siemens Amilo Xi 2428", | ||
52 | .matches = { | ||
53 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
54 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2428") | ||
55 | } | ||
56 | }, { | ||
51 | .ident = "Fujitsu-Siemens Amilo Xi 2528", | 57 | .ident = "Fujitsu-Siemens Amilo Xi 2528", |
52 | .matches = { | 58 | .matches = { |
53 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 59 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c index 4dbb882c83dc..0a6b8f07a69d 100644 --- a/drivers/media/video/gspca/ov534.c +++ b/drivers/media/video/gspca/ov534.c | |||
@@ -1533,7 +1533,7 @@ static void setexposure_96(struct gspca_dev *gspca_dev) | |||
1533 | static void setsharpness_96(struct gspca_dev *gspca_dev) | 1533 | static void setsharpness_96(struct gspca_dev *gspca_dev) |
1534 | { | 1534 | { |
1535 | struct sd *sd = (struct sd *) gspca_dev; | 1535 | struct sd *sd = (struct sd *) gspca_dev; |
1536 | u8 val; | 1536 | s8 val; |
1537 | 1537 | ||
1538 | val = sd->sharpness; | 1538 | val = sd->sharpness; |
1539 | if (val < 0) { /* auto */ | 1539 | if (val < 0) { /* auto */ |
diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c index 4cff8035614f..0ca1c06652b1 100644 --- a/drivers/media/video/gspca/sn9c20x.c +++ b/drivers/media/video/gspca/sn9c20x.c | |||
@@ -2319,7 +2319,7 @@ static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum) | |||
2319 | } | 2319 | } |
2320 | } | 2320 | } |
2321 | if (avg_lum > MAX_AVG_LUM) { | 2321 | if (avg_lum > MAX_AVG_LUM) { |
2322 | if (sd->gain - 1 >= 0) { | 2322 | if (sd->gain >= 1) { |
2323 | sd->gain--; | 2323 | sd->gain--; |
2324 | set_gain(gspca_dev); | 2324 | set_gain(gspca_dev); |
2325 | } | 2325 | } |
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.h b/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.h index 487d40555343..96c61926d372 100644 --- a/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.h +++ b/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.h | |||
@@ -228,6 +228,7 @@ static const struct stv_init stv_bridge_init[] = { | |||
228 | /* This reg is written twice. Some kind of reset? */ | 228 | /* This reg is written twice. Some kind of reset? */ |
229 | {NULL, 0x1620, 0x80}, | 229 | {NULL, 0x1620, 0x80}, |
230 | {NULL, 0x1620, 0x00}, | 230 | {NULL, 0x1620, 0x00}, |
231 | {NULL, 0x1443, 0x00}, | ||
231 | {NULL, 0x1423, 0x04}, | 232 | {NULL, 0x1423, 0x04}, |
232 | {x1500, 0x1500, ARRAY_SIZE(x1500)}, | 233 | {x1500, 0x1500, ARRAY_SIZE(x1500)}, |
233 | {x1536, 0x1536, ARRAY_SIZE(x1536)}, | 234 | {x1536, 0x1536, ARRAY_SIZE(x1536)}, |
diff --git a/drivers/media/video/gspca/sunplus.c b/drivers/media/video/gspca/sunplus.c index 716df6b15fc5..306b7d75b4aa 100644 --- a/drivers/media/video/gspca/sunplus.c +++ b/drivers/media/video/gspca/sunplus.c | |||
@@ -709,7 +709,7 @@ static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) | |||
709 | spca504B_PollingDataReady(gspca_dev); | 709 | spca504B_PollingDataReady(gspca_dev); |
710 | 710 | ||
711 | /* Init the cam width height with some values get on init ? */ | 711 | /* Init the cam width height with some values get on init ? */ |
712 | reg_w_riv(gspca_dev, 0x31, 0, 0x04); | 712 | reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); |
713 | spca504B_WaitCmdStatus(gspca_dev); | 713 | spca504B_WaitCmdStatus(gspca_dev); |
714 | spca504B_PollingDataReady(gspca_dev); | 714 | spca504B_PollingDataReady(gspca_dev); |
715 | break; | 715 | break; |
@@ -807,14 +807,14 @@ static void init_ctl_reg(struct gspca_dev *gspca_dev) | |||
807 | default: | 807 | default: |
808 | /* case BRIDGE_SPCA533: */ | 808 | /* case BRIDGE_SPCA533: */ |
809 | /* case BRIDGE_SPCA504B: */ | 809 | /* case BRIDGE_SPCA504B: */ |
810 | reg_w_riv(gspca_dev, 0, 0x00, 0x21ad); /* hue */ | 810 | reg_w_riv(gspca_dev, 0, 0x21ad, 0x00); /* hue */ |
811 | reg_w_riv(gspca_dev, 0, 0x01, 0x21ac); /* sat/hue */ | 811 | reg_w_riv(gspca_dev, 0, 0x21ac, 0x01); /* sat/hue */ |
812 | reg_w_riv(gspca_dev, 0, 0x00, 0x21a3); /* gamma */ | 812 | reg_w_riv(gspca_dev, 0, 0x21a3, 0x00); /* gamma */ |
813 | break; | 813 | break; |
814 | case BRIDGE_SPCA536: | 814 | case BRIDGE_SPCA536: |
815 | reg_w_riv(gspca_dev, 0, 0x40, 0x20f5); | 815 | reg_w_riv(gspca_dev, 0, 0x20f5, 0x40); |
816 | reg_w_riv(gspca_dev, 0, 0x01, 0x20f4); | 816 | reg_w_riv(gspca_dev, 0, 0x20f4, 0x01); |
817 | reg_w_riv(gspca_dev, 0, 0x00, 0x2089); | 817 | reg_w_riv(gspca_dev, 0, 0x2089, 0x00); |
818 | break; | 818 | break; |
819 | } | 819 | } |
820 | if (pollreg) | 820 | if (pollreg) |
@@ -887,11 +887,11 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
887 | switch (sd->bridge) { | 887 | switch (sd->bridge) { |
888 | case BRIDGE_SPCA504B: | 888 | case BRIDGE_SPCA504B: |
889 | reg_w_riv(gspca_dev, 0x1d, 0x00, 0); | 889 | reg_w_riv(gspca_dev, 0x1d, 0x00, 0); |
890 | reg_w_riv(gspca_dev, 0, 0x01, 0x2306); | 890 | reg_w_riv(gspca_dev, 0x00, 0x2306, 0x01); |
891 | reg_w_riv(gspca_dev, 0, 0x00, 0x0d04); | 891 | reg_w_riv(gspca_dev, 0x00, 0x0d04, 0x00); |
892 | reg_w_riv(gspca_dev, 0, 0x00, 0x2000); | 892 | reg_w_riv(gspca_dev, 0x00, 0x2000, 0x00); |
893 | reg_w_riv(gspca_dev, 0, 0x13, 0x2301); | 893 | reg_w_riv(gspca_dev, 0x00, 0x2301, 0x13); |
894 | reg_w_riv(gspca_dev, 0, 0x00, 0x2306); | 894 | reg_w_riv(gspca_dev, 0x00, 0x2306, 0x00); |
895 | /* fall thru */ | 895 | /* fall thru */ |
896 | case BRIDGE_SPCA533: | 896 | case BRIDGE_SPCA533: |
897 | spca504B_PollingDataReady(gspca_dev); | 897 | spca504B_PollingDataReady(gspca_dev); |
@@ -1000,7 +1000,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
1000 | spca504B_WaitCmdStatus(gspca_dev); | 1000 | spca504B_WaitCmdStatus(gspca_dev); |
1001 | break; | 1001 | break; |
1002 | default: | 1002 | default: |
1003 | reg_w_riv(gspca_dev, 0x31, 0, 0x04); | 1003 | reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); |
1004 | spca504B_WaitCmdStatus(gspca_dev); | 1004 | spca504B_WaitCmdStatus(gspca_dev); |
1005 | spca504B_PollingDataReady(gspca_dev); | 1005 | spca504B_PollingDataReady(gspca_dev); |
1006 | break; | 1006 | break; |
diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index c090efcd8045..71921c878424 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c | |||
@@ -3009,6 +3009,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
3009 | int l; | 3009 | int l; |
3010 | 3010 | ||
3011 | frame = gspca_get_i_frame(gspca_dev); | 3011 | frame = gspca_get_i_frame(gspca_dev); |
3012 | if (frame == NULL) { | ||
3013 | gspca_dev->last_packet_type = DISCARD_PACKET; | ||
3014 | return; | ||
3015 | } | ||
3012 | l = frame->data_end - frame->data; | 3016 | l = frame->data_end - frame->data; |
3013 | if (len > frame->v4l2_buf.length - l) | 3017 | if (len > frame->v4l2_buf.length - l) |
3014 | len = frame->v4l2_buf.length - l; | 3018 | len = frame->v4l2_buf.length - l; |
diff --git a/drivers/media/video/mx1_camera.c b/drivers/media/video/mx1_camera.c index 2ba14fb5b031..c167cc3de492 100644 --- a/drivers/media/video/mx1_camera.c +++ b/drivers/media/video/mx1_camera.c | |||
@@ -718,7 +718,7 @@ static int __init mx1_camera_probe(struct platform_device *pdev) | |||
718 | 718 | ||
719 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 719 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
720 | irq = platform_get_irq(pdev, 0); | 720 | irq = platform_get_irq(pdev, 0); |
721 | if (!res || !irq) { | 721 | if (!res || (int)irq <= 0) { |
722 | err = -ENODEV; | 722 | err = -ENODEV; |
723 | goto exit; | 723 | goto exit; |
724 | } | 724 | } |
diff --git a/drivers/media/video/rj54n1cb0c.c b/drivers/media/video/rj54n1cb0c.c index 7e42989ce0e4..805226e0d9c1 100644 --- a/drivers/media/video/rj54n1cb0c.c +++ b/drivers/media/video/rj54n1cb0c.c | |||
@@ -563,7 +563,7 @@ static int rj54n1_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a) | |||
563 | struct i2c_client *client = sd->priv; | 563 | struct i2c_client *client = sd->priv; |
564 | struct rj54n1 *rj54n1 = to_rj54n1(client); | 564 | struct rj54n1 *rj54n1 = to_rj54n1(client); |
565 | struct v4l2_rect *rect = &a->c; | 565 | struct v4l2_rect *rect = &a->c; |
566 | unsigned int dummy, output_w, output_h, | 566 | unsigned int dummy = 0, output_w, output_h, |
567 | input_w = rect->width, input_h = rect->height; | 567 | input_w = rect->width, input_h = rect->height; |
568 | int ret; | 568 | int ret; |
569 | 569 | ||
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 9f85e917f9f3..a7ad7810fddc 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -420,19 +420,6 @@ int saa7134_set_dmabits(struct saa7134_dev *dev) | |||
420 | ctrl |= SAA7134_MAIN_CTRL_TE5; | 420 | ctrl |= SAA7134_MAIN_CTRL_TE5; |
421 | irq |= SAA7134_IRQ1_INTE_RA2_1 | | 421 | irq |= SAA7134_IRQ1_INTE_RA2_1 | |
422 | SAA7134_IRQ1_INTE_RA2_0; | 422 | SAA7134_IRQ1_INTE_RA2_0; |
423 | |||
424 | /* dma: setup channel 5 (= TS) */ | ||
425 | |||
426 | saa_writeb(SAA7134_TS_DMA0, (dev->ts.nr_packets - 1) & 0xff); | ||
427 | saa_writeb(SAA7134_TS_DMA1, | ||
428 | ((dev->ts.nr_packets - 1) >> 8) & 0xff); | ||
429 | /* TSNOPIT=0, TSCOLAP=0 */ | ||
430 | saa_writeb(SAA7134_TS_DMA2, | ||
431 | (((dev->ts.nr_packets - 1) >> 16) & 0x3f) | 0x00); | ||
432 | saa_writel(SAA7134_RS_PITCH(5), TS_PACKET_SIZE); | ||
433 | saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_16 | | ||
434 | SAA7134_RS_CONTROL_ME | | ||
435 | (dev->ts.pt_ts.dma >> 12)); | ||
436 | } | 423 | } |
437 | 424 | ||
438 | /* set task conditions + field handling */ | 425 | /* set task conditions + field handling */ |
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c index 03488ba4c99c..b9817d74943f 100644 --- a/drivers/media/video/saa7134/saa7134-ts.c +++ b/drivers/media/video/saa7134/saa7134-ts.c | |||
@@ -250,6 +250,19 @@ int saa7134_ts_start(struct saa7134_dev *dev) | |||
250 | 250 | ||
251 | BUG_ON(dev->ts_started); | 251 | BUG_ON(dev->ts_started); |
252 | 252 | ||
253 | /* dma: setup channel 5 (= TS) */ | ||
254 | saa_writeb(SAA7134_TS_DMA0, (dev->ts.nr_packets - 1) & 0xff); | ||
255 | saa_writeb(SAA7134_TS_DMA1, | ||
256 | ((dev->ts.nr_packets - 1) >> 8) & 0xff); | ||
257 | /* TSNOPIT=0, TSCOLAP=0 */ | ||
258 | saa_writeb(SAA7134_TS_DMA2, | ||
259 | (((dev->ts.nr_packets - 1) >> 16) & 0x3f) | 0x00); | ||
260 | saa_writel(SAA7134_RS_PITCH(5), TS_PACKET_SIZE); | ||
261 | saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_16 | | ||
262 | SAA7134_RS_CONTROL_ME | | ||
263 | (dev->ts.pt_ts.dma >> 12)); | ||
264 | |||
265 | /* reset hardware TS buffers */ | ||
253 | saa_writeb(SAA7134_TS_SERIAL1, 0x00); | 266 | saa_writeb(SAA7134_TS_SERIAL1, 0x00); |
254 | saa_writeb(SAA7134_TS_SERIAL1, 0x03); | 267 | saa_writeb(SAA7134_TS_SERIAL1, 0x03); |
255 | saa_writeb(SAA7134_TS_SERIAL1, 0x00); | 268 | saa_writeb(SAA7134_TS_SERIAL1, 0x00); |
diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index d69363f0d8c9..f09c7140d6b2 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c | |||
@@ -1827,7 +1827,7 @@ static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev) | |||
1827 | 1827 | ||
1828 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1828 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1829 | irq = platform_get_irq(pdev, 0); | 1829 | irq = platform_get_irq(pdev, 0); |
1830 | if (!res || !irq) { | 1830 | if (!res || (int)irq <= 0) { |
1831 | dev_err(&pdev->dev, "Not enough CEU platform resources.\n"); | 1831 | dev_err(&pdev->dev, "Not enough CEU platform resources.\n"); |
1832 | err = -ENODEV; | 1832 | err = -ENODEV; |
1833 | goto exit; | 1833 | goto exit; |
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c index 0469d7a876a8..ec8ef8c5560a 100644 --- a/drivers/media/video/uvc/uvc_ctrl.c +++ b/drivers/media/video/uvc/uvc_ctrl.c | |||
@@ -1393,7 +1393,7 @@ uvc_ctrl_prune_entity(struct uvc_device *dev, struct uvc_entity *entity) | |||
1393 | size = entity->processing.bControlSize; | 1393 | size = entity->processing.bControlSize; |
1394 | 1394 | ||
1395 | for (i = 0; i < ARRAY_SIZE(blacklist); ++i) { | 1395 | for (i = 0; i < ARRAY_SIZE(blacklist); ++i) { |
1396 | if (!usb_match_id(dev->intf, &blacklist[i].id)) | 1396 | if (!usb_match_one_id(dev->intf, &blacklist[i].id)) |
1397 | continue; | 1397 | continue; |
1398 | 1398 | ||
1399 | if (blacklist[i].index >= 8 * size || | 1399 | if (blacklist[i].index >= 8 * size || |
diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c index f854698c4061..ea11839cba4a 100644 --- a/drivers/media/video/uvc/uvc_queue.c +++ b/drivers/media/video/uvc/uvc_queue.c | |||
@@ -59,9 +59,9 @@ | |||
59 | * returns immediately. | 59 | * returns immediately. |
60 | * | 60 | * |
61 | * When the buffer is full, the completion handler removes it from the irq | 61 | * When the buffer is full, the completion handler removes it from the irq |
62 | * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue. | 62 | * queue, marks it as done (UVC_BUF_STATE_DONE) and wakes its wait queue. |
63 | * At that point, any process waiting on the buffer will be woken up. If a | 63 | * At that point, any process waiting on the buffer will be woken up. If a |
64 | * process tries to dequeue a buffer after it has been marked ready, the | 64 | * process tries to dequeue a buffer after it has been marked done, the |
65 | * dequeing will succeed immediately. | 65 | * dequeing will succeed immediately. |
66 | * | 66 | * |
67 | * 2. Buffers are queued, user is waiting on a buffer and the device gets | 67 | * 2. Buffers are queued, user is waiting on a buffer and the device gets |
@@ -201,6 +201,7 @@ static void __uvc_query_buffer(struct uvc_buffer *buf, | |||
201 | break; | 201 | break; |
202 | case UVC_BUF_STATE_QUEUED: | 202 | case UVC_BUF_STATE_QUEUED: |
203 | case UVC_BUF_STATE_ACTIVE: | 203 | case UVC_BUF_STATE_ACTIVE: |
204 | case UVC_BUF_STATE_READY: | ||
204 | v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED; | 205 | v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED; |
205 | break; | 206 | break; |
206 | case UVC_BUF_STATE_IDLE: | 207 | case UVC_BUF_STATE_IDLE: |
@@ -295,13 +296,15 @@ static int uvc_queue_waiton(struct uvc_buffer *buf, int nonblocking) | |||
295 | { | 296 | { |
296 | if (nonblocking) { | 297 | if (nonblocking) { |
297 | return (buf->state != UVC_BUF_STATE_QUEUED && | 298 | return (buf->state != UVC_BUF_STATE_QUEUED && |
298 | buf->state != UVC_BUF_STATE_ACTIVE) | 299 | buf->state != UVC_BUF_STATE_ACTIVE && |
300 | buf->state != UVC_BUF_STATE_READY) | ||
299 | ? 0 : -EAGAIN; | 301 | ? 0 : -EAGAIN; |
300 | } | 302 | } |
301 | 303 | ||
302 | return wait_event_interruptible(buf->wait, | 304 | return wait_event_interruptible(buf->wait, |
303 | buf->state != UVC_BUF_STATE_QUEUED && | 305 | buf->state != UVC_BUF_STATE_QUEUED && |
304 | buf->state != UVC_BUF_STATE_ACTIVE); | 306 | buf->state != UVC_BUF_STATE_ACTIVE && |
307 | buf->state != UVC_BUF_STATE_READY); | ||
305 | } | 308 | } |
306 | 309 | ||
307 | /* | 310 | /* |
@@ -348,6 +351,7 @@ int uvc_dequeue_buffer(struct uvc_video_queue *queue, | |||
348 | case UVC_BUF_STATE_IDLE: | 351 | case UVC_BUF_STATE_IDLE: |
349 | case UVC_BUF_STATE_QUEUED: | 352 | case UVC_BUF_STATE_QUEUED: |
350 | case UVC_BUF_STATE_ACTIVE: | 353 | case UVC_BUF_STATE_ACTIVE: |
354 | case UVC_BUF_STATE_READY: | ||
351 | default: | 355 | default: |
352 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state %u " | 356 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state %u " |
353 | "(driver bug?).\n", buf->state); | 357 | "(driver bug?).\n", buf->state); |
@@ -489,6 +493,7 @@ struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, | |||
489 | 493 | ||
490 | spin_lock_irqsave(&queue->irqlock, flags); | 494 | spin_lock_irqsave(&queue->irqlock, flags); |
491 | list_del(&buf->queue); | 495 | list_del(&buf->queue); |
496 | buf->state = UVC_BUF_STATE_DONE; | ||
492 | if (!list_empty(&queue->irqqueue)) | 497 | if (!list_empty(&queue->irqqueue)) |
493 | nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, | 498 | nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, |
494 | queue); | 499 | queue); |
diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index 9a9802830d41..7dcf534a0cf3 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c | |||
@@ -441,7 +441,7 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, | |||
441 | if (fid != stream->last_fid && buf->buf.bytesused != 0) { | 441 | if (fid != stream->last_fid && buf->buf.bytesused != 0) { |
442 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit " | 442 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit " |
443 | "toggled).\n"); | 443 | "toggled).\n"); |
444 | buf->state = UVC_BUF_STATE_DONE; | 444 | buf->state = UVC_BUF_STATE_READY; |
445 | return -EAGAIN; | 445 | return -EAGAIN; |
446 | } | 446 | } |
447 | 447 | ||
@@ -470,7 +470,7 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, | |||
470 | /* Complete the current frame if the buffer size was exceeded. */ | 470 | /* Complete the current frame if the buffer size was exceeded. */ |
471 | if (len > maxlen) { | 471 | if (len > maxlen) { |
472 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n"); | 472 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n"); |
473 | buf->state = UVC_BUF_STATE_DONE; | 473 | buf->state = UVC_BUF_STATE_READY; |
474 | } | 474 | } |
475 | } | 475 | } |
476 | 476 | ||
@@ -482,7 +482,7 @@ static void uvc_video_decode_end(struct uvc_streaming *stream, | |||
482 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n"); | 482 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n"); |
483 | if (data[0] == len) | 483 | if (data[0] == len) |
484 | uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n"); | 484 | uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n"); |
485 | buf->state = UVC_BUF_STATE_DONE; | 485 | buf->state = UVC_BUF_STATE_READY; |
486 | if (stream->dev->quirks & UVC_QUIRK_STREAM_NO_FID) | 486 | if (stream->dev->quirks & UVC_QUIRK_STREAM_NO_FID) |
487 | stream->last_fid ^= UVC_STREAM_FID; | 487 | stream->last_fid ^= UVC_STREAM_FID; |
488 | } | 488 | } |
@@ -568,8 +568,7 @@ static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream, | |||
568 | uvc_video_decode_end(stream, buf, mem, | 568 | uvc_video_decode_end(stream, buf, mem, |
569 | urb->iso_frame_desc[i].actual_length); | 569 | urb->iso_frame_desc[i].actual_length); |
570 | 570 | ||
571 | if (buf->state == UVC_BUF_STATE_DONE || | 571 | if (buf->state == UVC_BUF_STATE_READY) |
572 | buf->state == UVC_BUF_STATE_ERROR) | ||
573 | buf = uvc_queue_next_buffer(&stream->queue, buf); | 572 | buf = uvc_queue_next_buffer(&stream->queue, buf); |
574 | } | 573 | } |
575 | } | 574 | } |
@@ -627,8 +626,7 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream, | |||
627 | if (!stream->bulk.skip_payload && buf != NULL) { | 626 | if (!stream->bulk.skip_payload && buf != NULL) { |
628 | uvc_video_decode_end(stream, buf, stream->bulk.header, | 627 | uvc_video_decode_end(stream, buf, stream->bulk.header, |
629 | stream->bulk.payload_size); | 628 | stream->bulk.payload_size); |
630 | if (buf->state == UVC_BUF_STATE_DONE || | 629 | if (buf->state == UVC_BUF_STATE_READY) |
631 | buf->state == UVC_BUF_STATE_ERROR) | ||
632 | buf = uvc_queue_next_buffer(&stream->queue, | 630 | buf = uvc_queue_next_buffer(&stream->queue, |
633 | buf); | 631 | buf); |
634 | } | 632 | } |
@@ -669,7 +667,7 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream, | |||
669 | stream->bulk.payload_size == stream->bulk.max_payload_size) { | 667 | stream->bulk.payload_size == stream->bulk.max_payload_size) { |
670 | if (buf->buf.bytesused == stream->queue.buf_used) { | 668 | if (buf->buf.bytesused == stream->queue.buf_used) { |
671 | stream->queue.buf_used = 0; | 669 | stream->queue.buf_used = 0; |
672 | buf->state = UVC_BUF_STATE_DONE; | 670 | buf->state = UVC_BUF_STATE_READY; |
673 | uvc_queue_next_buffer(&stream->queue, buf); | 671 | uvc_queue_next_buffer(&stream->queue, buf); |
674 | stream->last_fid ^= UVC_STREAM_FID; | 672 | stream->last_fid ^= UVC_STREAM_FID; |
675 | } | 673 | } |
@@ -924,10 +922,8 @@ static int uvc_init_video_bulk(struct uvc_streaming *stream, | |||
924 | static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) | 922 | static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) |
925 | { | 923 | { |
926 | struct usb_interface *intf = stream->intf; | 924 | struct usb_interface *intf = stream->intf; |
927 | struct usb_host_interface *alts; | 925 | struct usb_host_endpoint *ep; |
928 | struct usb_host_endpoint *ep = NULL; | 926 | unsigned int i; |
929 | int intfnum = stream->intfnum; | ||
930 | unsigned int bandwidth, psize, i; | ||
931 | int ret; | 927 | int ret; |
932 | 928 | ||
933 | stream->last_fid = -1; | 929 | stream->last_fid = -1; |
@@ -936,6 +932,12 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) | |||
936 | stream->bulk.payload_size = 0; | 932 | stream->bulk.payload_size = 0; |
937 | 933 | ||
938 | if (intf->num_altsetting > 1) { | 934 | if (intf->num_altsetting > 1) { |
935 | struct usb_host_endpoint *best_ep = NULL; | ||
936 | unsigned int best_psize = 3 * 1024; | ||
937 | unsigned int bandwidth; | ||
938 | unsigned int uninitialized_var(altsetting); | ||
939 | int intfnum = stream->intfnum; | ||
940 | |||
939 | /* Isochronous endpoint, select the alternate setting. */ | 941 | /* Isochronous endpoint, select the alternate setting. */ |
940 | bandwidth = stream->ctrl.dwMaxPayloadTransferSize; | 942 | bandwidth = stream->ctrl.dwMaxPayloadTransferSize; |
941 | 943 | ||
@@ -949,6 +951,9 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) | |||
949 | } | 951 | } |
950 | 952 | ||
951 | for (i = 0; i < intf->num_altsetting; ++i) { | 953 | for (i = 0; i < intf->num_altsetting; ++i) { |
954 | struct usb_host_interface *alts; | ||
955 | unsigned int psize; | ||
956 | |||
952 | alts = &intf->altsetting[i]; | 957 | alts = &intf->altsetting[i]; |
953 | ep = uvc_find_endpoint(alts, | 958 | ep = uvc_find_endpoint(alts, |
954 | stream->header.bEndpointAddress); | 959 | stream->header.bEndpointAddress); |
@@ -958,21 +963,27 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) | |||
958 | /* Check if the bandwidth is high enough. */ | 963 | /* Check if the bandwidth is high enough. */ |
959 | psize = le16_to_cpu(ep->desc.wMaxPacketSize); | 964 | psize = le16_to_cpu(ep->desc.wMaxPacketSize); |
960 | psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); | 965 | psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); |
961 | if (psize >= bandwidth) | 966 | if (psize >= bandwidth && psize <= best_psize) { |
962 | break; | 967 | altsetting = i; |
968 | best_psize = psize; | ||
969 | best_ep = ep; | ||
970 | } | ||
963 | } | 971 | } |
964 | 972 | ||
965 | if (i >= intf->num_altsetting) { | 973 | if (best_ep == NULL) { |
966 | uvc_trace(UVC_TRACE_VIDEO, "No fast enough alt setting " | 974 | uvc_trace(UVC_TRACE_VIDEO, "No fast enough alt setting " |
967 | "for requested bandwidth.\n"); | 975 | "for requested bandwidth.\n"); |
968 | return -EIO; | 976 | return -EIO; |
969 | } | 977 | } |
970 | 978 | ||
971 | ret = usb_set_interface(stream->dev->udev, intfnum, i); | 979 | uvc_trace(UVC_TRACE_VIDEO, "Selecting alternate setting %u " |
980 | "(%u B/frame bandwidth).\n", altsetting, best_psize); | ||
981 | |||
982 | ret = usb_set_interface(stream->dev->udev, intfnum, altsetting); | ||
972 | if (ret < 0) | 983 | if (ret < 0) |
973 | return ret; | 984 | return ret; |
974 | 985 | ||
975 | ret = uvc_init_video_isoc(stream, ep, gfp_flags); | 986 | ret = uvc_init_video_isoc(stream, best_ep, gfp_flags); |
976 | } else { | 987 | } else { |
977 | /* Bulk endpoint, proceed to URB initialization. */ | 988 | /* Bulk endpoint, proceed to URB initialization. */ |
978 | ep = uvc_find_endpoint(&intf->altsetting[0], | 989 | ep = uvc_find_endpoint(&intf->altsetting[0], |
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h index 7ec9a04ced50..2337585001ea 100644 --- a/drivers/media/video/uvc/uvcvideo.h +++ b/drivers/media/video/uvc/uvcvideo.h | |||
@@ -365,8 +365,9 @@ enum uvc_buffer_state { | |||
365 | UVC_BUF_STATE_IDLE = 0, | 365 | UVC_BUF_STATE_IDLE = 0, |
366 | UVC_BUF_STATE_QUEUED = 1, | 366 | UVC_BUF_STATE_QUEUED = 1, |
367 | UVC_BUF_STATE_ACTIVE = 2, | 367 | UVC_BUF_STATE_ACTIVE = 2, |
368 | UVC_BUF_STATE_DONE = 3, | 368 | UVC_BUF_STATE_READY = 3, |
369 | UVC_BUF_STATE_ERROR = 4, | 369 | UVC_BUF_STATE_DONE = 4, |
370 | UVC_BUF_STATE_ERROR = 5, | ||
370 | }; | 371 | }; |
371 | 372 | ||
372 | struct uvc_buffer { | 373 | struct uvc_buffer { |
diff --git a/drivers/staging/cx25821/cx25821-medusa-video.c b/drivers/staging/cx25821/cx25821-medusa-video.c index e4df8134f059..1eb079b3d429 100644 --- a/drivers/staging/cx25821/cx25821-medusa-video.c +++ b/drivers/staging/cx25821/cx25821-medusa-video.c | |||
@@ -860,10 +860,8 @@ int medusa_video_init(struct cx25821_dev *dev) | |||
860 | 860 | ||
861 | ret_val = medusa_set_videostandard(dev); | 861 | ret_val = medusa_set_videostandard(dev); |
862 | 862 | ||
863 | if (ret_val < 0) { | 863 | if (ret_val < 0) |
864 | mutex_unlock(&dev->lock); | ||
865 | return -EINVAL; | 864 | return -EINVAL; |
866 | } | ||
867 | 865 | ||
868 | return 1; | 866 | return 1; |
869 | } | 867 | } |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 18f74ec4dce9..9d03d1ebca6f 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -1001,44 +1001,6 @@ done: | |||
1001 | } | 1001 | } |
1002 | 1002 | ||
1003 | /** | 1003 | /** |
1004 | * v9fs_vfs_readlink - read a symlink's location | ||
1005 | * @dentry: dentry for symlink | ||
1006 | * @buffer: buffer to load symlink location into | ||
1007 | * @buflen: length of buffer | ||
1008 | * | ||
1009 | */ | ||
1010 | |||
1011 | static int v9fs_vfs_readlink(struct dentry *dentry, char __user * buffer, | ||
1012 | int buflen) | ||
1013 | { | ||
1014 | int retval; | ||
1015 | int ret; | ||
1016 | char *link = __getname(); | ||
1017 | |||
1018 | if (unlikely(!link)) | ||
1019 | return -ENOMEM; | ||
1020 | |||
1021 | if (buflen > PATH_MAX) | ||
1022 | buflen = PATH_MAX; | ||
1023 | |||
1024 | P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_name.name, | ||
1025 | dentry); | ||
1026 | |||
1027 | retval = v9fs_readlink(dentry, link, buflen); | ||
1028 | |||
1029 | if (retval > 0) { | ||
1030 | if ((ret = copy_to_user(buffer, link, retval)) != 0) { | ||
1031 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
1032 | "problem copying to user: %d\n", ret); | ||
1033 | retval = ret; | ||
1034 | } | ||
1035 | } | ||
1036 | |||
1037 | __putname(link); | ||
1038 | return retval; | ||
1039 | } | ||
1040 | |||
1041 | /** | ||
1042 | * v9fs_vfs_follow_link - follow a symlink path | 1004 | * v9fs_vfs_follow_link - follow a symlink path |
1043 | * @dentry: dentry for symlink | 1005 | * @dentry: dentry for symlink |
1044 | * @nd: nameidata | 1006 | * @nd: nameidata |
@@ -1230,7 +1192,6 @@ static const struct inode_operations v9fs_dir_inode_operations_ext = { | |||
1230 | .rmdir = v9fs_vfs_rmdir, | 1192 | .rmdir = v9fs_vfs_rmdir, |
1231 | .mknod = v9fs_vfs_mknod, | 1193 | .mknod = v9fs_vfs_mknod, |
1232 | .rename = v9fs_vfs_rename, | 1194 | .rename = v9fs_vfs_rename, |
1233 | .readlink = v9fs_vfs_readlink, | ||
1234 | .getattr = v9fs_vfs_getattr, | 1195 | .getattr = v9fs_vfs_getattr, |
1235 | .setattr = v9fs_vfs_setattr, | 1196 | .setattr = v9fs_vfs_setattr, |
1236 | }; | 1197 | }; |
@@ -1253,7 +1214,7 @@ static const struct inode_operations v9fs_file_inode_operations = { | |||
1253 | }; | 1214 | }; |
1254 | 1215 | ||
1255 | static const struct inode_operations v9fs_symlink_inode_operations = { | 1216 | static const struct inode_operations v9fs_symlink_inode_operations = { |
1256 | .readlink = v9fs_vfs_readlink, | 1217 | .readlink = generic_readlink, |
1257 | .follow_link = v9fs_vfs_follow_link, | 1218 | .follow_link = v9fs_vfs_follow_link, |
1258 | .put_link = v9fs_vfs_put_link, | 1219 | .put_link = v9fs_vfs_put_link, |
1259 | .getattr = v9fs_vfs_getattr, | 1220 | .getattr = v9fs_vfs_getattr, |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index fea9e898c4ba..b44ce0a0711c 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -269,7 +269,7 @@ static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd, | |||
269 | int err; | 269 | int err; |
270 | 270 | ||
271 | mntget(newmnt); | 271 | mntget(newmnt); |
272 | err = do_add_mount(newmnt, &nd->path, nd->path.mnt->mnt_flags, mntlist); | 272 | err = do_add_mount(newmnt, &nd->path, nd->path.mnt->mnt_flags | MNT_SHRINKABLE, mntlist); |
273 | switch (err) { | 273 | switch (err) { |
274 | case 0: | 274 | case 0: |
275 | path_put(&nd->path); | 275 | path_put(&nd->path); |
@@ -371,7 +371,6 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
371 | if (IS_ERR(mnt)) | 371 | if (IS_ERR(mnt)) |
372 | goto out_err; | 372 | goto out_err; |
373 | 373 | ||
374 | nd->path.mnt->mnt_flags |= MNT_SHRINKABLE; | ||
375 | rc = add_mount_helper(mnt, nd, &cifs_dfs_automount_list); | 374 | rc = add_mount_helper(mnt, nd, &cifs_dfs_automount_list); |
376 | 375 | ||
377 | out: | 376 | out: |
diff --git a/fs/configfs/symlink.c b/fs/configfs/symlink.c index c8afa6b1d91d..32a5f46b1157 100644 --- a/fs/configfs/symlink.c +++ b/fs/configfs/symlink.c | |||
@@ -121,8 +121,10 @@ static int get_target(const char *symname, struct path *path, | |||
121 | ret = -ENOENT; | 121 | ret = -ENOENT; |
122 | path_put(path); | 122 | path_put(path); |
123 | } | 123 | } |
124 | } else | 124 | } else { |
125 | ret = -EPERM; | 125 | ret = -EPERM; |
126 | path_put(path); | ||
127 | } | ||
126 | } | 128 | } |
127 | 129 | ||
128 | return ret; | 130 | return ret; |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 429ca0b3ba08..7f8545032930 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -715,31 +715,31 @@ static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
715 | /* Released in ecryptfs_put_link(); only release here on error */ | 715 | /* Released in ecryptfs_put_link(); only release here on error */ |
716 | buf = kmalloc(len, GFP_KERNEL); | 716 | buf = kmalloc(len, GFP_KERNEL); |
717 | if (!buf) { | 717 | if (!buf) { |
718 | rc = -ENOMEM; | 718 | buf = ERR_PTR(-ENOMEM); |
719 | goto out; | 719 | goto out; |
720 | } | 720 | } |
721 | old_fs = get_fs(); | 721 | old_fs = get_fs(); |
722 | set_fs(get_ds()); | 722 | set_fs(get_ds()); |
723 | rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len); | 723 | rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len); |
724 | set_fs(old_fs); | 724 | set_fs(old_fs); |
725 | if (rc < 0) | 725 | if (rc < 0) { |
726 | goto out_free; | 726 | kfree(buf); |
727 | else | 727 | buf = ERR_PTR(rc); |
728 | } else | ||
728 | buf[rc] = '\0'; | 729 | buf[rc] = '\0'; |
729 | rc = 0; | ||
730 | nd_set_link(nd, buf); | ||
731 | goto out; | ||
732 | out_free: | ||
733 | kfree(buf); | ||
734 | out: | 730 | out: |
735 | return ERR_PTR(rc); | 731 | nd_set_link(nd, buf); |
732 | return NULL; | ||
736 | } | 733 | } |
737 | 734 | ||
738 | static void | 735 | static void |
739 | ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr) | 736 | ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr) |
740 | { | 737 | { |
741 | /* Free the char* */ | 738 | char *buf = nd_get_link(nd); |
742 | kfree(nd_get_link(nd)); | 739 | if (!IS_ERR(buf)) { |
740 | /* Free the char* */ | ||
741 | kfree(buf); | ||
742 | } | ||
743 | } | 743 | } |
744 | 744 | ||
745 | /** | 745 | /** |
diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index a5089a6dd67a..7239efc690d8 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c | |||
@@ -646,22 +646,27 @@ static const struct super_operations hppfs_sbops = { | |||
646 | static int hppfs_readlink(struct dentry *dentry, char __user *buffer, | 646 | static int hppfs_readlink(struct dentry *dentry, char __user *buffer, |
647 | int buflen) | 647 | int buflen) |
648 | { | 648 | { |
649 | struct dentry *proc_dentry; | 649 | struct dentry *proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; |
650 | |||
651 | proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; | ||
652 | return proc_dentry->d_inode->i_op->readlink(proc_dentry, buffer, | 650 | return proc_dentry->d_inode->i_op->readlink(proc_dentry, buffer, |
653 | buflen); | 651 | buflen); |
654 | } | 652 | } |
655 | 653 | ||
656 | static void *hppfs_follow_link(struct dentry *dentry, struct nameidata *nd) | 654 | static void *hppfs_follow_link(struct dentry *dentry, struct nameidata *nd) |
657 | { | 655 | { |
658 | struct dentry *proc_dentry; | 656 | struct dentry *proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; |
659 | |||
660 | proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; | ||
661 | 657 | ||
662 | return proc_dentry->d_inode->i_op->follow_link(proc_dentry, nd); | 658 | return proc_dentry->d_inode->i_op->follow_link(proc_dentry, nd); |
663 | } | 659 | } |
664 | 660 | ||
661 | static void hppfs_put_link(struct dentry *dentry, struct nameidata *nd, | ||
662 | void *cookie) | ||
663 | { | ||
664 | struct dentry *proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; | ||
665 | |||
666 | if (proc_dentry->d_inode->i_op->put_link) | ||
667 | proc_dentry->d_inode->i_op->put_link(proc_dentry, nd, cookie); | ||
668 | } | ||
669 | |||
665 | static const struct inode_operations hppfs_dir_iops = { | 670 | static const struct inode_operations hppfs_dir_iops = { |
666 | .lookup = hppfs_lookup, | 671 | .lookup = hppfs_lookup, |
667 | }; | 672 | }; |
@@ -669,6 +674,7 @@ static const struct inode_operations hppfs_dir_iops = { | |||
669 | static const struct inode_operations hppfs_link_iops = { | 674 | static const struct inode_operations hppfs_link_iops = { |
670 | .readlink = hppfs_readlink, | 675 | .readlink = hppfs_readlink, |
671 | .follow_link = hppfs_follow_link, | 676 | .follow_link = hppfs_follow_link, |
677 | .put_link = hppfs_put_link, | ||
672 | }; | 678 | }; |
673 | 679 | ||
674 | static struct inode *get_inode(struct super_block *sb, struct dentry *dentry) | 680 | static struct inode *get_inode(struct super_block *sb, struct dentry *dentry) |
diff --git a/fs/namei.c b/fs/namei.c index b55440baf7ab..94a5e60779f9 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -561,6 +561,7 @@ static __always_inline int __do_follow_link(struct path *path, struct nameidata | |||
561 | dget(dentry); | 561 | dget(dentry); |
562 | } | 562 | } |
563 | mntget(path->mnt); | 563 | mntget(path->mnt); |
564 | nd->last_type = LAST_BIND; | ||
564 | cookie = dentry->d_inode->i_op->follow_link(dentry, nd); | 565 | cookie = dentry->d_inode->i_op->follow_link(dentry, nd); |
565 | error = PTR_ERR(cookie); | 566 | error = PTR_ERR(cookie); |
566 | if (!IS_ERR(cookie)) { | 567 | if (!IS_ERR(cookie)) { |
@@ -1603,11 +1604,12 @@ struct file *do_filp_open(int dfd, const char *pathname, | |||
1603 | struct file *filp; | 1604 | struct file *filp; |
1604 | struct nameidata nd; | 1605 | struct nameidata nd; |
1605 | int error; | 1606 | int error; |
1606 | struct path path, save; | 1607 | struct path path; |
1607 | struct dentry *dir; | 1608 | struct dentry *dir; |
1608 | int count = 0; | 1609 | int count = 0; |
1609 | int will_truncate; | 1610 | int will_truncate; |
1610 | int flag = open_to_namei_flags(open_flag); | 1611 | int flag = open_to_namei_flags(open_flag); |
1612 | int force_reval = 0; | ||
1611 | 1613 | ||
1612 | /* | 1614 | /* |
1613 | * O_SYNC is implemented as __O_SYNC|O_DSYNC. As many places only | 1615 | * O_SYNC is implemented as __O_SYNC|O_DSYNC. As many places only |
@@ -1619,7 +1621,7 @@ struct file *do_filp_open(int dfd, const char *pathname, | |||
1619 | open_flag |= O_DSYNC; | 1621 | open_flag |= O_DSYNC; |
1620 | 1622 | ||
1621 | if (!acc_mode) | 1623 | if (!acc_mode) |
1622 | acc_mode = MAY_OPEN | ACC_MODE(flag); | 1624 | acc_mode = MAY_OPEN | ACC_MODE(open_flag); |
1623 | 1625 | ||
1624 | /* O_TRUNC implies we need access checks for write permissions */ | 1626 | /* O_TRUNC implies we need access checks for write permissions */ |
1625 | if (flag & O_TRUNC) | 1627 | if (flag & O_TRUNC) |
@@ -1659,9 +1661,12 @@ struct file *do_filp_open(int dfd, const char *pathname, | |||
1659 | /* | 1661 | /* |
1660 | * Create - we need to know the parent. | 1662 | * Create - we need to know the parent. |
1661 | */ | 1663 | */ |
1664 | reval: | ||
1662 | error = path_init(dfd, pathname, LOOKUP_PARENT, &nd); | 1665 | error = path_init(dfd, pathname, LOOKUP_PARENT, &nd); |
1663 | if (error) | 1666 | if (error) |
1664 | return ERR_PTR(error); | 1667 | return ERR_PTR(error); |
1668 | if (force_reval) | ||
1669 | nd.flags |= LOOKUP_REVAL; | ||
1665 | error = path_walk(pathname, &nd); | 1670 | error = path_walk(pathname, &nd); |
1666 | if (error) { | 1671 | if (error) { |
1667 | if (nd.root.mnt) | 1672 | if (nd.root.mnt) |
@@ -1853,17 +1858,7 @@ do_link: | |||
1853 | error = security_inode_follow_link(path.dentry, &nd); | 1858 | error = security_inode_follow_link(path.dentry, &nd); |
1854 | if (error) | 1859 | if (error) |
1855 | goto exit_dput; | 1860 | goto exit_dput; |
1856 | save = nd.path; | ||
1857 | path_get(&save); | ||
1858 | error = __do_follow_link(&path, &nd); | 1861 | error = __do_follow_link(&path, &nd); |
1859 | if (error == -ESTALE) { | ||
1860 | /* nd.path had been dropped */ | ||
1861 | nd.path = save; | ||
1862 | path_get(&nd.path); | ||
1863 | nd.flags |= LOOKUP_REVAL; | ||
1864 | error = __do_follow_link(&path, &nd); | ||
1865 | } | ||
1866 | path_put(&save); | ||
1867 | path_put(&path); | 1862 | path_put(&path); |
1868 | if (error) { | 1863 | if (error) { |
1869 | /* Does someone understand code flow here? Or it is only | 1864 | /* Does someone understand code flow here? Or it is only |
@@ -1873,6 +1868,10 @@ do_link: | |||
1873 | release_open_intent(&nd); | 1868 | release_open_intent(&nd); |
1874 | if (nd.root.mnt) | 1869 | if (nd.root.mnt) |
1875 | path_put(&nd.root); | 1870 | path_put(&nd.root); |
1871 | if (error == -ESTALE && !force_reval) { | ||
1872 | force_reval = 1; | ||
1873 | goto reval; | ||
1874 | } | ||
1876 | return ERR_PTR(error); | 1875 | return ERR_PTR(error); |
1877 | } | 1876 | } |
1878 | nd.flags &= ~LOOKUP_PARENT; | 1877 | nd.flags &= ~LOOKUP_PARENT; |
diff --git a/fs/namespace.c b/fs/namespace.c index 7d70d63ceb29..c768f733c8d6 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -965,10 +965,12 @@ EXPORT_SYMBOL(may_umount_tree); | |||
965 | int may_umount(struct vfsmount *mnt) | 965 | int may_umount(struct vfsmount *mnt) |
966 | { | 966 | { |
967 | int ret = 1; | 967 | int ret = 1; |
968 | down_read(&namespace_sem); | ||
968 | spin_lock(&vfsmount_lock); | 969 | spin_lock(&vfsmount_lock); |
969 | if (propagate_mount_busy(mnt, 2)) | 970 | if (propagate_mount_busy(mnt, 2)) |
970 | ret = 0; | 971 | ret = 0; |
971 | spin_unlock(&vfsmount_lock); | 972 | spin_unlock(&vfsmount_lock); |
973 | up_read(&namespace_sem); | ||
972 | return ret; | 974 | return ret; |
973 | } | 975 | } |
974 | 976 | ||
@@ -1352,12 +1354,12 @@ static int attach_recursive_mnt(struct vfsmount *source_mnt, | |||
1352 | if (err) | 1354 | if (err) |
1353 | goto out_cleanup_ids; | 1355 | goto out_cleanup_ids; |
1354 | 1356 | ||
1357 | spin_lock(&vfsmount_lock); | ||
1358 | |||
1355 | if (IS_MNT_SHARED(dest_mnt)) { | 1359 | if (IS_MNT_SHARED(dest_mnt)) { |
1356 | for (p = source_mnt; p; p = next_mnt(p, source_mnt)) | 1360 | for (p = source_mnt; p; p = next_mnt(p, source_mnt)) |
1357 | set_mnt_shared(p); | 1361 | set_mnt_shared(p); |
1358 | } | 1362 | } |
1359 | |||
1360 | spin_lock(&vfsmount_lock); | ||
1361 | if (parent_path) { | 1363 | if (parent_path) { |
1362 | detach_mnt(source_mnt, parent_path); | 1364 | detach_mnt(source_mnt, parent_path); |
1363 | attach_mnt(source_mnt, path); | 1365 | attach_mnt(source_mnt, path); |
@@ -1534,8 +1536,12 @@ static int do_remount(struct path *path, int flags, int mnt_flags, | |||
1534 | err = change_mount_flags(path->mnt, flags); | 1536 | err = change_mount_flags(path->mnt, flags); |
1535 | else | 1537 | else |
1536 | err = do_remount_sb(sb, flags, data, 0); | 1538 | err = do_remount_sb(sb, flags, data, 0); |
1537 | if (!err) | 1539 | if (!err) { |
1540 | spin_lock(&vfsmount_lock); | ||
1541 | mnt_flags |= path->mnt->mnt_flags & MNT_PNODE_MASK; | ||
1538 | path->mnt->mnt_flags = mnt_flags; | 1542 | path->mnt->mnt_flags = mnt_flags; |
1543 | spin_unlock(&vfsmount_lock); | ||
1544 | } | ||
1539 | up_write(&sb->s_umount); | 1545 | up_write(&sb->s_umount); |
1540 | if (!err) { | 1546 | if (!err) { |
1541 | security_sb_post_remount(path->mnt, flags, data); | 1547 | security_sb_post_remount(path->mnt, flags, data); |
@@ -1665,6 +1671,8 @@ int do_add_mount(struct vfsmount *newmnt, struct path *path, | |||
1665 | { | 1671 | { |
1666 | int err; | 1672 | int err; |
1667 | 1673 | ||
1674 | mnt_flags &= ~(MNT_SHARED | MNT_WRITE_HOLD); | ||
1675 | |||
1668 | down_write(&namespace_sem); | 1676 | down_write(&namespace_sem); |
1669 | /* Something was mounted here while we slept */ | 1677 | /* Something was mounted here while we slept */ |
1670 | while (d_mountpoint(path->dentry) && | 1678 | while (d_mountpoint(path->dentry) && |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 18d5cc62d8ed..e42bbd843ed1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1419,7 +1419,6 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
1419 | goto out; | 1419 | goto out; |
1420 | 1420 | ||
1421 | error = PROC_I(inode)->op.proc_get_link(inode, &nd->path); | 1421 | error = PROC_I(inode)->op.proc_get_link(inode, &nd->path); |
1422 | nd->last_type = LAST_BIND; | ||
1423 | out: | 1422 | out: |
1424 | return ERR_PTR(error); | 1423 | return ERR_PTR(error); |
1425 | } | 1424 | } |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 9147ca88f253..b1bcb275b596 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -2463,7 +2463,7 @@ int proc_nr_files(struct ctl_table *table, int write, | |||
2463 | 2463 | ||
2464 | int __init get_filesystem_list(char *buf); | 2464 | int __init get_filesystem_list(char *buf); |
2465 | 2465 | ||
2466 | #define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE]) | 2466 | #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) |
2467 | #define OPEN_FMODE(flag) ((__force fmode_t)((flag + 1) & O_ACCMODE)) | 2467 | #define OPEN_FMODE(flag) ((__force fmode_t)((flag + 1) & O_ACCMODE)) |
2468 | 2468 | ||
2469 | #endif /* __KERNEL__ */ | 2469 | #endif /* __KERNEL__ */ |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 6f426afbc522..220213e603db 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -804,7 +804,7 @@ static inline int sym_is(const char *symbol, const char *name) | |||
804 | match = strstr(symbol, name); | 804 | match = strstr(symbol, name); |
805 | if (!match) | 805 | if (!match) |
806 | return 0; | 806 | return 0; |
807 | return match[strlen(symbol)] == '\0'; | 807 | return match[strlen(name)] == '\0'; |
808 | } | 808 | } |
809 | 809 | ||
810 | static void do_table(void *symval, unsigned long size, | 810 | static void do_table(void *symval, unsigned long size, |
diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c index 8a00ade85166..2aceebf5f354 100644 --- a/security/tomoyo/tomoyo.c +++ b/security/tomoyo/tomoyo.c | |||
@@ -80,9 +80,8 @@ static int tomoyo_bprm_check_security(struct linux_binprm *bprm) | |||
80 | return tomoyo_find_next_domain(bprm); | 80 | return tomoyo_find_next_domain(bprm); |
81 | /* | 81 | /* |
82 | * Read permission is checked against interpreters using next domain. | 82 | * Read permission is checked against interpreters using next domain. |
83 | * '1' is the result of open_to_namei_flags(O_RDONLY). | ||
84 | */ | 83 | */ |
85 | return tomoyo_check_open_permission(domain, &bprm->file->f_path, 1); | 84 | return tomoyo_check_open_permission(domain, &bprm->file->f_path, O_RDONLY); |
86 | } | 85 | } |
87 | 86 | ||
88 | static int tomoyo_path_truncate(struct path *path, loff_t length, | 87 | static int tomoyo_path_truncate(struct path *path, loff_t length, |
@@ -184,10 +183,6 @@ static int tomoyo_file_fcntl(struct file *file, unsigned int cmd, | |||
184 | static int tomoyo_dentry_open(struct file *f, const struct cred *cred) | 183 | static int tomoyo_dentry_open(struct file *f, const struct cred *cred) |
185 | { | 184 | { |
186 | int flags = f->f_flags; | 185 | int flags = f->f_flags; |
187 | |||
188 | if ((flags + 1) & O_ACCMODE) | ||
189 | flags++; | ||
190 | flags |= f->f_flags & (O_APPEND | O_TRUNC); | ||
191 | /* Don't check read permission here if called from do_execve(). */ | 186 | /* Don't check read permission here if called from do_execve(). */ |
192 | if (current->in_execve) | 187 | if (current->in_execve) |
193 | return 0; | 188 | return 0; |