* [PATCH] MD: Prevent sysfs operations on uninitialized kobjects
@ 2013-03-07 22:24 Jonathan Brassow
2013-03-11 0:35 ` NeilBrown
0 siblings, 1 reply; 2+ messages in thread
From: Jonathan Brassow @ 2013-03-07 22:24 UTC (permalink / raw)
To: linux-raid; +Cc: neilb, jbrassow
MD: Prevent sysfs operations on uninitialized kobjects
Device-mapper does not use sysfs; but when device-mapper is leveraging
MD's RAID personalities, MD sometimes attempts to update sysfs. This
patch adds checks for 'mddev-kobj.sd' in sysfs_[un]link_rdev to ensure
it is about to operate on something valid. This patch also checks for
'mddev->kobj.sd' before calling 'sysfs_notify' in 'remove_and_add_spares'.
Although 'sysfs_notify' already makes this check, doing so in
'remove_and_add_spares' prevents an additional mutex operation.
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Index: linux-upstream/drivers/md/md.h
===================================================================
--- linux-upstream.orig/drivers/md/md.h
+++ linux-upstream/drivers/md/md.h
@@ -506,7 +506,7 @@ static inline char * mdname (struct mdde
static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
{
char nm[20];
- if (!test_bit(Replacement, &rdev->flags)) {
+ if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) {
sprintf(nm, "rd%d", rdev->raid_disk);
return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
} else
@@ -516,7 +516,7 @@ static inline int sysfs_link_rdev(struct
static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
{
char nm[20];
- if (!test_bit(Replacement, &rdev->flags)) {
+ if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) {
sprintf(nm, "rd%d", rdev->raid_disk);
sysfs_remove_link(&mddev->kobj, nm);
}
Index: linux-upstream/drivers/md/md.c
===================================================================
--- linux-upstream.orig/drivers/md/md.c
+++ linux-upstream/drivers/md/md.c
@@ -7646,10 +7646,8 @@ static int remove_and_add_spares(struct
removed++;
}
}
- if (removed)
- sysfs_notify(&mddev->kobj, NULL,
- "degraded");
-
+ if (removed && mddev->kobj.sd)
+ sysfs_notify(&mddev->kobj, NULL, "degraded");
rdev_for_each(rdev, mddev) {
if (rdev->raid_disk >= 0 &&
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] MD: Prevent sysfs operations on uninitialized kobjects
2013-03-07 22:24 [PATCH] MD: Prevent sysfs operations on uninitialized kobjects Jonathan Brassow
@ 2013-03-11 0:35 ` NeilBrown
0 siblings, 0 replies; 2+ messages in thread
From: NeilBrown @ 2013-03-11 0:35 UTC (permalink / raw)
To: Jonathan Brassow; +Cc: linux-raid
[-- Attachment #1: Type: text/plain, Size: 2278 bytes --]
On Thu, 07 Mar 2013 16:24:26 -0600 Jonathan Brassow <jbrassow@redhat.com>
wrote:
> MD: Prevent sysfs operations on uninitialized kobjects
>
> Device-mapper does not use sysfs; but when device-mapper is leveraging
> MD's RAID personalities, MD sometimes attempts to update sysfs. This
> patch adds checks for 'mddev-kobj.sd' in sysfs_[un]link_rdev to ensure
> it is about to operate on something valid. This patch also checks for
> 'mddev->kobj.sd' before calling 'sysfs_notify' in 'remove_and_add_spares'.
> Although 'sysfs_notify' already makes this check, doing so in
> 'remove_and_add_spares' prevents an additional mutex operation.
>
> Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
>
> Index: linux-upstream/drivers/md/md.h
> ===================================================================
> --- linux-upstream.orig/drivers/md/md.h
> +++ linux-upstream/drivers/md/md.h
> @@ -506,7 +506,7 @@ static inline char * mdname (struct mdde
> static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
> {
> char nm[20];
> - if (!test_bit(Replacement, &rdev->flags)) {
> + if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) {
> sprintf(nm, "rd%d", rdev->raid_disk);
> return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
> } else
> @@ -516,7 +516,7 @@ static inline int sysfs_link_rdev(struct
> static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
> {
> char nm[20];
> - if (!test_bit(Replacement, &rdev->flags)) {
> + if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) {
> sprintf(nm, "rd%d", rdev->raid_disk);
> sysfs_remove_link(&mddev->kobj, nm);
> }
> Index: linux-upstream/drivers/md/md.c
> ===================================================================
> --- linux-upstream.orig/drivers/md/md.c
> +++ linux-upstream/drivers/md/md.c
> @@ -7646,10 +7646,8 @@ static int remove_and_add_spares(struct
> removed++;
> }
> }
> - if (removed)
> - sysfs_notify(&mddev->kobj, NULL,
> - "degraded");
> -
> + if (removed && mddev->kobj.sd)
> + sysfs_notify(&mddev->kobj, NULL, "degraded");
>
> rdev_for_each(rdev, mddev) {
> if (rdev->raid_disk >= 0 &&
>
Applied, thanks.
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-03-11 0:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-07 22:24 [PATCH] MD: Prevent sysfs operations on uninitialized kobjects Jonathan Brassow
2013-03-11 0:35 ` NeilBrown
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.