diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO
index 0091a8215ac150736346a669b5c822d70e5d02db..b61885c35ce11db98f6266342aec174f81dd0144 100644
--- a/Documentation/ja_JP/HOWTO
+++ b/Documentation/ja_JP/HOWTO
@@ -315,7 +315,7 @@ Andrew Morton 銇� Linux-kernel 銉°兗銉兂銈般儶銈广儓銇偒銉笺儘銉儶銉兗
 銈傘仐銆�3.x.y 銈兗銉嶃儷銇屽瓨鍦ㄣ仐銇亜鍫村悎銇伅銆佺暘鍙枫亴涓€鐣ぇ銇嶃亜 3.x 銇�
 鏈€鏂般伄瀹夊畾鐗堛偒銉笺儘銉仹銇欍€�
 
-3.x.y 銇� "stable" 銉併兗銉� <stable@kernel.org> 銇с儭銉炽儐銇曘倢銇︺亰銈娿€佸繀
+3.x.y 銇� "stable" 銉併兗銉� <stable@vger.kernel.org> 銇с儭銉炽儐銇曘倢銇︺亰銈娿€佸繀
 瑕併伀蹇溿仒銇︺儶銉兗銈广仌銈屻伨銇欍€傞€氬父銇儶銉兗銈规湡闁撱伅 2閫遍枔姣庛仹銇欍亴銆佸樊銇楄揩銇�
 銇熷晱椤屻亴銇亼銈屻伆銈傘亞灏戙仐闀枫亸銇倠銇撱仺銈傘亗銈娿伨銇欍€傘偦銈儱銉儐銈i枹閫c伄鍟忛
 銇牬鍚堛伅銇撱倢銇銇椼仸銇犮亜銇熴亜銇牬鍚堛€併仚銇愩伀銉儶銉笺偣銇屻仌銈屻伨銇欍€�
diff --git a/Documentation/ja_JP/stable_kernel_rules.txt b/Documentation/ja_JP/stable_kernel_rules.txt
index 14265837c4ce346a3424212c4ab8a3181b39b499..9dbda9b5d21ed4e5f7b68846a1fb0f33e9982dba 100644
--- a/Documentation/ja_JP/stable_kernel_rules.txt
+++ b/Documentation/ja_JP/stable_kernel_rules.txt
@@ -50,16 +50,16 @@ linux-2.6.29/Documentation/stable_kernel_rules.txt
 
 -stable 銉勩儶銉笺伀銉戙儍銉併倰閫佷粯銇欍倠鎵嬬稓銇�-
 
- - 涓婅銇鍓囥伀寰撱仯銇︺亜銈嬨亱銈掔⒑瑾嶃仐銇熷緦銇€乻table@kernel.org 銇儜銉冦儊
+ - 涓婅銇鍓囥伀寰撱仯銇︺亜銈嬨亱銈掔⒑瑾嶃仐銇熷緦銇€乻table@vger.kernel.org 銇儜銉冦儊
    銈掗€併倠銆�
  - 閫佷俊鑰呫伅銉戙儍銉併亴銈儱銉笺伀鍙椼亼浠樸亼銈夈倢銇熼殯銇伅 ACK 銈掋€佸嵈涓嬨仌銈屻仧鍫村悎
    銇伅 NAK 銈掑彈銇戝彇銈嬨€傘亾銇弽蹇溿伅闁嬬櫤鑰呫仧銇°伄銈广偙銈搞儱銉笺儷銇倛銇c仸銆佹暟
    鏃ャ亱銇嬨倠鍫村悎銇屻亗銈嬨€�
  - 銈傘仐鍙椼亼鍙栥倝銈屻仧銈夈€併儜銉冦儊銇粬銇枊鐧鸿€呫仧銇°仺闁㈤€c仚銈嬨偟銉栥偡銈广儐銉犮伄
    銉°兂銉嗐儕銉笺伀銈堛倠銉儞銉ャ兗銇仧銈併伀 -stable 銈儱銉笺伀杩藉姞銇曘倢銈嬨€�
- - 銉戙儍銉併伀 stable@kernel.org 銇偄銉夈儸銈广亴浠樺姞銇曘倢銇︺亜銈嬨仺銇嶃伀銇€併仢銈�
+ - 銉戙儍銉併伀 stable@vger.kernel.org 銇偄銉夈儸銈广亴浠樺姞銇曘倢銇︺亜銈嬨仺銇嶃伀銇€併仢銈�
    銇� Linus 銇儎銉兗銇叆銈嬫檪銇嚜鍕曠殑銇� stable 銉併兗銉犮伀 email 銇曘倢銈嬨€�
- - 銈汇偔銉ャ儶銉嗐偅銉戙儍銉併伅銇撱伄銈ㄣ偆銉偄銈� (stable@kernel.org) 銇€併倝銈屻倠銇�
+ - 銈汇偔銉ャ儶銉嗐偅銉戙儍銉併伅銇撱伄銈ㄣ偆銉偄銈� (stable@vger.kernel.org) 銇€併倝銈屻倠銇�
    銇嶃仹銇仾銇忋€佷唬銈忋倞銇� security@kernel.org 銇偄銉夈儸銈广伀閫併倝銈屻倠銆�
 
 銉儞銉ャ兗銈点偆銈儷-
diff --git a/Documentation/stable_kernel_rules.txt b/Documentation/stable_kernel_rules.txt
index b0714d8f678ac51d0c280a4f5f2980196052421f..cbc2f03056bdef25da9dc87013680748c905e9d0 100644
--- a/Documentation/stable_kernel_rules.txt
+++ b/Documentation/stable_kernel_rules.txt
@@ -39,7 +39,7 @@ Procedure for submitting patches to the -stable tree:
    the stable tree without anything else needing to be done by the author
    or subsystem maintainer.
  - If the patch requires other patches as prerequisites which can be
-   cherry-picked than this can be specified in the following format in
+   cherry-picked, then this can be specified in the following format in
    the sign-off area:
 
      Cc: <stable@vger.kernel.org> # 3.3.x: a1f84a3: sched: Check for idle
diff --git a/Documentation/zh_CN/HOWTO b/Documentation/zh_CN/HOWTO
index 6c914aa87e7138086f7522ff4fc78acba564437c..54ea24ff63c7ceeba400d900362020c8324d1764 100644
--- a/Documentation/zh_CN/HOWTO
+++ b/Documentation/zh_CN/HOWTO
@@ -237,7 +237,7 @@ kernel.org缃戠珯鐨刾ub/linux/kernel/v2.6/鐩綍涓嬫壘鍒板畠銆傚畠鐨勫紑鍙戦伒寰�
 濡傛灉娌℃湁2.6.x.y鐗堟湰鍐呮牳瀛樺湪锛岄偅涔堟渶鏂扮殑2.6.x鐗堟湰鍐呮牳灏辩浉褰撲簬鏄綋鍓嶇殑绋冲畾
 鐗堝唴鏍搞€�
 
-2.6.x.y鐗堟湰鐢扁€滅ǔ瀹氱増鈥濆皬缁勶紙閭欢鍦板潃<stable@kernel.org>锛夌淮鎶わ紝涓€鑸殧鍛ㄥ彂
+2.6.x.y鐗堟湰鐢扁€滅ǔ瀹氱増鈥濆皬缁勶紙閭欢鍦板潃<stable@vger.kernel.org>锛夌淮鎶わ紝涓€鑸殧鍛ㄥ彂
 甯冩柊鐗堟湰銆�
 
 鍐呮牳婧愮爜涓殑Documentation/stable_kernel_rules.txt鏂囦欢鍏蜂綋鎻忚堪浜嗗彲琚ǔ瀹�
diff --git a/Documentation/zh_CN/io_ordering.txt b/Documentation/zh_CN/io_ordering.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e592daf4e0143b4a00ee213a2d167e53eff94ca6
--- /dev/null
+++ b/Documentation/zh_CN/io_ordering.txt
@@ -0,0 +1,67 @@
+Chinese translated version of Documentation/io_orderings.txt
+
+If you have any comment or update to the content, please contact the
+original document maintainer directly.  However, if you have a problem
+communicating in English you can also ask the Chinese maintainer for
+help.  Contact the Chinese maintainer if this translation is outdated
+or if there is a problem with the translation.
+
+Chinese maintainer: Lin Yongting <linyongting@gmail.com>
+---------------------------------------------------------------------
+Documentation/io_ordering.txt 鐨勪腑鏂囩炕璇�
+
+濡傛灉鎯宠瘎璁烘垨鏇存柊鏈枃鐨勫唴瀹癸紝璇风洿鎺ヨ仈绯诲師鏂囨。鐨勭淮鎶よ€呫€傚鏋滀綘浣跨敤鑻辨枃
+浜ゆ祦鏈夊洶闅剧殑璇濓紝涔熷彲浠ュ悜涓枃鐗堢淮鎶よ€呮眰鍔┿€傚鏋滄湰缈昏瘧鏇存柊涓嶅強鏃舵垨鑰呯炕
+璇戝瓨鍦ㄩ棶棰橈紝璇疯仈绯讳腑鏂囩増缁存姢鑰呫€�
+
+涓枃鐗堢淮鎶よ€咃細 鏋楁案鍚� Lin Yongting <linyongting@gmail.com>
+涓枃鐗堢炕璇戣€咃細 鏋楁案鍚� Lin Yongting <linyongting@gmail.com>
+涓枃鐗堟牎璇戣€咃細 鏋楁案鍚� Lin Yongting <linyongting@gmail.com>
+
+
+浠ヤ笅涓烘鏂�
+---------------------------------------------------------------------
+
+鍦ㄦ煇浜涘钩鍙颁笂锛屾墍璋撶殑鍐呭瓨鏄犲皠I/O鏄急椤哄簭銆傚湪杩欎簺骞冲彴涓婏紝椹卞姩寮€鍙戣€呮湁璐d换
+淇濊瘉I/O鍐呭瓨鏄犲皠鍦板潃鐨勫啓鎿嶄綔鎸夌▼搴忓浘鎰忕殑椤哄簭杈惧埌璁惧銆傞€氬父璇诲彇涓€涓€滃畨鍏ㄢ€�
+璁惧瀵勫瓨鍣ㄦ垨妗ュ瘎瀛樺櫒锛岃Е鍙慖O鑺墖娓呭埛鏈鐞嗙殑鍐欐搷浣滃埌杈捐澶囧悗鎵嶅鐞嗚鎿嶄綔锛�
+鑰岃揪鍒颁繚璇佺洰鐨勩€傞┍鍔ㄧ▼搴忛€氬父鍦╯pinlock淇濇姢鐨勪复鐣屽尯閫€鍑轰箣鍓嶄娇鐢ㄨ繖绉嶆妧鏈€�
+杩欎篃鍙互淇濊瘉鍚庨潰鐨勫啓鎿嶄綔鍙湪鍓嶉潰鐨勫啓鎿嶄綔涔嬪悗鍒拌揪璁惧锛堣繖闈炲父绫讳技浜庡唴瀛�
+灞忛殰鎿嶄綔锛宮b()锛屼笉杩囦粎閫傜敤浜嶪/O锛夈€�
+
+鍋囪涓€涓澶囬┍鍔ㄧ▼鐨勫叿浣撲緥瀛愶細
+
+        ...
+CPU A:  spin_lock_irqsave(&dev_lock, flags)
+CPU A:  val = readl(my_status);
+CPU A:  ...
+CPU A:  writel(newval, ring_ptr);
+CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+CPU B:  spin_lock_irqsave(&dev_lock, flags)
+CPU B:  val = readl(my_status);
+CPU B:  ...
+CPU B:  writel(newval2, ring_ptr);
+CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+
+涓婅堪渚嬪瓙涓紝璁惧鍙兘浼氬厛鎺ユ敹鍒皀ewval2鐨勫€硷紝鐒跺悗鎺ユ敹鍒皀ewval鐨勫€硷紝闂灏�
+鍙戠敓浜嗐€備笉杩囧緢瀹规槗閫氳繃涓嬮潰鏂规硶鏉ヤ慨澶嶏細
+
+        ...
+CPU A:  spin_lock_irqsave(&dev_lock, flags)
+CPU A:  val = readl(my_status);
+CPU A:  ...
+CPU A:  writel(newval, ring_ptr);
+CPU A:  (void)readl(safe_register); /* 閰嶇疆瀵勫瓨鍣紵*/
+CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+CPU B:  spin_lock_irqsave(&dev_lock, flags)
+CPU B:  val = readl(my_status);
+CPU B:  ...
+CPU B:  writel(newval2, ring_ptr);
+CPU B:  (void)readl(safe_register); /* 閰嶇疆瀵勫瓨鍣紵*/
+CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
+
+鍦ㄨВ鍐虫柟妗堜腑锛岃鍙杝afe_register瀵勫瓨鍣紝瑙﹀彂IO鑺墖娓呭埛鏈鐞嗙殑鍐欐搷浣滐紝
+鍐嶅鐞嗗悗闈㈢殑璇绘搷浣滐紝闃叉寮曞彂鏁版嵁涓嶄竴鑷撮棶棰樸€�
diff --git a/Documentation/zh_CN/stable_kernel_rules.txt b/Documentation/zh_CN/stable_kernel_rules.txt
index b5b9b0ab02fd5a76f1a67e8eb2de736ec7812f1e..26ea5ed7cd9c4c5363ab2b8caaf3062d403ca2e1 100644
--- a/Documentation/zh_CN/stable_kernel_rules.txt
+++ b/Documentation/zh_CN/stable_kernel_rules.txt
@@ -42,7 +42,7 @@ Documentation/stable_kernel_rules.txt 鐨勪腑鏂囩炕璇�
 
 鍚戠ǔ瀹氱増浠g爜鏍戞彁浜よˉ涓佺殑杩囩▼锛�
 
-  - 鍦ㄧ‘璁や簡琛ヤ竵绗﹀悎浠ヤ笂鐨勮鍒欏悗锛屽皢琛ヤ竵鍙戦€佸埌stable@kernel.org銆�
+  - 鍦ㄧ‘璁や簡琛ヤ竵绗﹀悎浠ヤ笂鐨勮鍒欏悗锛屽皢琛ヤ竵鍙戦€佸埌stable@vger.kernel.org銆�
   - 濡傛灉琛ヤ竵琚帴鍙楀埌闃熷垪閲岋紝鍙戦€佽€呬細鏀跺埌涓€涓狝CK鍥炲锛屽鏋滄病鏈夎鎺ュ彈锛屾敹
     鍒扮殑鏄疦AK鍥炲銆傚洖澶嶉渶瑕佸嚑澶╃殑鏃堕棿锛岃繖鍙栧喅浜庡紑鍙戣€呯殑鏃堕棿瀹夋帓銆�
   - 琚帴鍙楃殑琛ヤ竵浼氳鍔犲埌绋冲畾鐗堟湰闃熷垪閲岋紝绛夊緟鍏朵粬寮€鍙戣€呯殑瀹℃煡銆�
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 0dd65281cc65bb6a368143bea0373c2c373787dd..20da3ad1696b58ef6aa6a91830070063e1dc21d7 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -614,39 +614,6 @@ void device_remove_bin_file(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(device_remove_bin_file);
 
-/**
- * device_schedule_callback_owner - helper to schedule a callback for a device
- * @dev: device.
- * @func: callback function to invoke later.
- * @owner: module owning the callback routine
- *
- * Attribute methods must not unregister themselves or their parent device
- * (which would amount to the same thing).  Attempts to do so will deadlock,
- * since unregistration is mutually exclusive with driver callbacks.
- *
- * Instead methods can call this routine, which will attempt to allocate
- * and schedule a workqueue request to call back @func with @dev as its
- * argument in the workqueue's process context.  @dev will be pinned until
- * @func returns.
- *
- * This routine is usually called via the inline device_schedule_callback(),
- * which automatically sets @owner to THIS_MODULE.
- *
- * Returns 0 if the request was submitted, -ENOMEM if storage could not
- * be allocated, -ENODEV if a reference to @owner isn't available.
- *
- * NOTE: This routine won't work if CONFIG_SYSFS isn't set!  It uses an
- * underlying sysfs routine (since it is intended for use by attribute
- * methods), and if sysfs isn't available you'll get nothing but -ENOSYS.
- */
-int device_schedule_callback_owner(struct device *dev,
-		void (*func)(struct device *), struct module *owner)
-{
-	return sysfs_schedule_callback(&dev->kobj,
-			(void (*)(void *)) func, dev, owner);
-}
-EXPORT_SYMBOL_GPL(device_schedule_callback_owner);
-
 static void klist_children_get(struct klist_node *n)
 {
 	struct device_private *p = to_device_private_parent(n);
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 06051767393f7638d4ea02a14bfc5a8a689a0305..8986b9f22781fa667cf41a37b5889e8ac3be0a36 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -187,8 +187,8 @@ static void driver_bound(struct device *dev)
 		return;
 	}
 
-	pr_debug("driver: '%s': %s: bound to device '%s'\n", dev_name(dev),
-		 __func__, dev->driver->name);
+	pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->driver->name,
+		 __func__, dev_name(dev));
 
 	klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
 
diff --git a/drivers/base/topology.c b/drivers/base/topology.c
index bbcbd3c4392689ef5022af42d0a09bb504be7253..be7c1fb7c0c96fa4d19bda57bf465c836a630091 100644
--- a/drivers/base/topology.c
+++ b/drivers/base/topology.c
@@ -39,8 +39,7 @@
 static ssize_t show_##name(struct device *dev,			\
 		struct device_attribute *attr, char *buf)	\
 {								\
-	unsigned int cpu = dev->id;				\
-	return sprintf(buf, "%d\n", topology_##name(cpu));	\
+	return sprintf(buf, "%d\n", topology_##name(dev->id));	\
 }
 
 #if defined(topology_thread_cpumask) || defined(topology_core_cpumask) || \
diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c
index abb0f1f53d933c7286527719e9644c47152408b6..985217626e663f360afd6db67ae13ffdf2cad9ca 100644
--- a/fs/kernfs/inode.c
+++ b/fs/kernfs/inode.c
@@ -48,14 +48,18 @@ void __init kernfs_inode_init(void)
 
 static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn)
 {
+	static DEFINE_MUTEX(iattr_mutex);
+	struct kernfs_iattrs *ret;
 	struct iattr *iattrs;
 
+	mutex_lock(&iattr_mutex);
+
 	if (kn->iattr)
-		return kn->iattr;
+		goto out_unlock;
 
 	kn->iattr = kzalloc(sizeof(struct kernfs_iattrs), GFP_KERNEL);
 	if (!kn->iattr)
-		return NULL;
+		goto out_unlock;
 	iattrs = &kn->iattr->ia_iattr;
 
 	/* assign default attributes */
@@ -65,8 +69,10 @@ static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn)
 	iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
 
 	simple_xattrs_init(&kn->iattr->xattrs);
-
-	return kn->iattr;
+out_unlock:
+	ret = kn->iattr;
+	mutex_unlock(&iattr_mutex);
+	return ret;
 }
 
 static int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)
diff --git a/fs/super.c b/fs/super.c
index e9dc3c3fe159cc2e59bfb27f0beb8bd30e92188b..48377f7463c0d3af6e9a7f521517e3d59fec7409 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -800,7 +800,10 @@ void emergency_remount(void)
 
 static DEFINE_IDA(unnamed_dev_ida);
 static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
-static int unnamed_dev_start = 0; /* don't bother trying below it */
+/* Many userspace utilities consider an FSID of 0 invalid.
+ * Always return at least 1 from get_anon_bdev.
+ */
+static int unnamed_dev_start = 1;
 
 int get_anon_bdev(dev_t *p)
 {
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 1b8b91b67fdb7a4b192b9568ad1d85defdcd863a..28cc1acd5439bf8caeb6d93e8bf68804ad738b1b 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -453,95 +453,3 @@ void sysfs_remove_bin_file(struct kobject *kobj,
 	kernfs_remove_by_name(kobj->sd, attr->attr.name);
 }
 EXPORT_SYMBOL_GPL(sysfs_remove_bin_file);
-
-struct sysfs_schedule_callback_struct {
-	struct list_head	workq_list;
-	struct kobject		*kobj;
-	void			(*func)(void *);
-	void			*data;
-	struct module		*owner;
-	struct work_struct	work;
-};
-
-static struct workqueue_struct *sysfs_workqueue;
-static DEFINE_MUTEX(sysfs_workq_mutex);
-static LIST_HEAD(sysfs_workq);
-static void sysfs_schedule_callback_work(struct work_struct *work)
-{
-	struct sysfs_schedule_callback_struct *ss = container_of(work,
-			struct sysfs_schedule_callback_struct, work);
-
-	(ss->func)(ss->data);
-	kobject_put(ss->kobj);
-	module_put(ss->owner);
-	mutex_lock(&sysfs_workq_mutex);
-	list_del(&ss->workq_list);
-	mutex_unlock(&sysfs_workq_mutex);
-	kfree(ss);
-}
-
-/**
- * sysfs_schedule_callback - helper to schedule a callback for a kobject
- * @kobj: object we're acting for.
- * @func: callback function to invoke later.
- * @data: argument to pass to @func.
- * @owner: module owning the callback code
- *
- * sysfs attribute methods must not unregister themselves or their parent
- * kobject (which would amount to the same thing).  Attempts to do so will
- * deadlock, since unregistration is mutually exclusive with driver
- * callbacks.
- *
- * Instead methods can call this routine, which will attempt to allocate
- * and schedule a workqueue request to call back @func with @data as its
- * argument in the workqueue's process context.  @kobj will be pinned
- * until @func returns.
- *
- * Returns 0 if the request was submitted, -ENOMEM if storage could not
- * be allocated, -ENODEV if a reference to @owner isn't available,
- * -EAGAIN if a callback has already been scheduled for @kobj.
- */
-int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
-		void *data, struct module *owner)
-{
-	struct sysfs_schedule_callback_struct *ss, *tmp;
-
-	if (!try_module_get(owner))
-		return -ENODEV;
-
-	mutex_lock(&sysfs_workq_mutex);
-	list_for_each_entry_safe(ss, tmp, &sysfs_workq, workq_list)
-		if (ss->kobj == kobj) {
-			module_put(owner);
-			mutex_unlock(&sysfs_workq_mutex);
-			return -EAGAIN;
-		}
-	mutex_unlock(&sysfs_workq_mutex);
-
-	if (sysfs_workqueue == NULL) {
-		sysfs_workqueue = create_singlethread_workqueue("sysfsd");
-		if (sysfs_workqueue == NULL) {
-			module_put(owner);
-			return -ENOMEM;
-		}
-	}
-
-	ss = kmalloc(sizeof(*ss), GFP_KERNEL);
-	if (!ss) {
-		module_put(owner);
-		return -ENOMEM;
-	}
-	kobject_get(kobj);
-	ss->kobj = kobj;
-	ss->func = func;
-	ss->data = data;
-	ss->owner = owner;
-	INIT_WORK(&ss->work, sysfs_schedule_callback_work);
-	INIT_LIST_HEAD(&ss->workq_list);
-	mutex_lock(&sysfs_workq_mutex);
-	list_add_tail(&ss->workq_list, &sysfs_workq);
-	mutex_unlock(&sysfs_workq_mutex);
-	queue_work(sysfs_workqueue, &ss->work);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(sysfs_schedule_callback);
diff --git a/include/linux/device.h b/include/linux/device.h
index 233bbbeb768d6f8c5a6aa32411675a14b3401272..d1d1c055b48e2efa8bbdc692b185eaa16f9619cf 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -566,12 +566,6 @@ extern int __must_check device_create_bin_file(struct device *dev,
 					const struct bin_attribute *attr);
 extern void device_remove_bin_file(struct device *dev,
 				   const struct bin_attribute *attr);
-extern int device_schedule_callback_owner(struct device *dev,
-		void (*func)(struct device *dev), struct module *owner);
-
-/* This is a macro to avoid include problems with THIS_MODULE */
-#define device_schedule_callback(dev, func)			\
-	device_schedule_callback_owner(dev, func, THIS_MODULE)
 
 /* device resource management */
 typedef void (*dr_release_t)(struct device *dev, void *res);
@@ -932,10 +926,7 @@ extern int device_online(struct device *dev);
 extern struct device *__root_device_register(const char *name,
 					     struct module *owner);
 
-/*
- * This is a macro to avoid include problems with THIS_MODULE,
- * just as per what is done for device_schedule_callback() above.
- */
+/* This is a macro to avoid include problems with THIS_MODULE */
 #define root_device_register(name) \
 	__root_device_register(name, THIS_MODULE)
 
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 084354b0e81451c651120afebdc75dfbaaec02f8..5ffaa3443712823a3f24acce437a328e24e86fa9 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -179,9 +179,6 @@ struct sysfs_ops {
 
 #ifdef CONFIG_SYSFS
 
-int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
-			    void *data, struct module *owner);
-
 int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
 void sysfs_remove_dir(struct kobject *kobj);
 int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
@@ -255,12 +252,6 @@ static inline void sysfs_enable_ns(struct kernfs_node *kn)
 
 #else /* CONFIG_SYSFS */
 
-static inline int sysfs_schedule_callback(struct kobject *kobj,
-		void (*func)(void *), void *data, struct module *owner)
-{
-	return -ENOSYS;
-}
-
 static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
 {
 	return 0;