|
@@ -1636,8 +1636,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
|
|
|
dname[name->len] = 0;
|
|
|
|
|
|
/* Make sure we always see the terminating NUL character */
|
|
|
- smp_wmb();
|
|
|
- dentry->d_name.name = dname;
|
|
|
+ smp_store_release(&dentry->d_name.name, dname); /* ^^^ */
|
|
|
|
|
|
dentry->d_lockref.count = 1;
|
|
|
dentry->d_flags = 0;
|
|
@@ -3047,17 +3046,14 @@ static int prepend(char **buffer, int *buflen, const char *str, int namelen)
|
|
|
* retry it again when a d_move() does happen. So any garbage in the buffer
|
|
|
* due to mismatched pointer and length will be discarded.
|
|
|
*
|
|
|
- * Data dependency barrier is needed to make sure that we see that terminating
|
|
|
- * NUL. Alpha strikes again, film at 11...
|
|
|
+ * Load acquire is needed to make sure that we see that terminating NUL.
|
|
|
*/
|
|
|
static int prepend_name(char **buffer, int *buflen, const struct qstr *name)
|
|
|
{
|
|
|
- const char *dname = READ_ONCE(name->name);
|
|
|
+ const char *dname = smp_load_acquire(&name->name); /* ^^^ */
|
|
|
u32 dlen = READ_ONCE(name->len);
|
|
|
char *p;
|
|
|
|
|
|
- smp_read_barrier_depends();
|
|
|
-
|
|
|
*buflen -= dlen + 1;
|
|
|
if (*buflen < 0)
|
|
|
return -ENAMETOOLONG;
|