XArray: Change xa_insert to return -EBUSY
Userspace translates EEXIST to "File exists" which isn't a very good error message for the problem. "Device or resource busy" is a better indication of what went wrong. Signed-off-by: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
809ab9371c
commit
fd9dc93e36
@ -85,7 +85,7 @@ which was at that index; if it returns the same entry which was passed as
|
|||||||
|
|
||||||
If you want to only store a new entry to an index if the current entry
|
If you want to only store a new entry to an index if the current entry
|
||||||
at that index is ``NULL``, you can use :c:func:`xa_insert` which
|
at that index is ``NULL``, you can use :c:func:`xa_insert` which
|
||||||
returns ``-EEXIST`` if the entry is not empty.
|
returns ``-EBUSY`` if the entry is not empty.
|
||||||
|
|
||||||
You can enquire whether a mark is set on an entry by using
|
You can enquire whether a mark is set on an entry by using
|
||||||
:c:func:`xa_get_mark`. If the entry is not ``NULL``, you can set a mark
|
:c:func:`xa_get_mark`. If the entry is not ``NULL``, you can set a mark
|
||||||
|
@ -189,7 +189,7 @@ retry:
|
|||||||
*/
|
*/
|
||||||
if (!err)
|
if (!err)
|
||||||
return 0;
|
return 0;
|
||||||
else if (err != -EEXIST)
|
else if (err != -EBUSY)
|
||||||
goto failed_unlock;
|
goto failed_unlock;
|
||||||
|
|
||||||
err = invalidate_inode_pages2_range(btnc, newkey, newkey);
|
err = invalidate_inode_pages2_range(btnc, newkey, newkey);
|
||||||
|
@ -664,7 +664,7 @@ static inline void *xa_cmpxchg_irq(struct xarray *xa, unsigned long index,
|
|||||||
*
|
*
|
||||||
* Context: Any context. Takes and releases the xa_lock. May sleep if
|
* Context: Any context. Takes and releases the xa_lock. May sleep if
|
||||||
* the @gfp flags permit.
|
* the @gfp flags permit.
|
||||||
* Return: 0 if the store succeeded. -EEXIST if another entry was present.
|
* Return: 0 if the store succeeded. -EBUSY if another entry was present.
|
||||||
* -ENOMEM if memory could not be allocated.
|
* -ENOMEM if memory could not be allocated.
|
||||||
*/
|
*/
|
||||||
static inline int xa_insert(struct xarray *xa, unsigned long index,
|
static inline int xa_insert(struct xarray *xa, unsigned long index,
|
||||||
@ -693,7 +693,7 @@ static inline int xa_insert(struct xarray *xa, unsigned long index,
|
|||||||
*
|
*
|
||||||
* Context: Any context. Takes and releases the xa_lock while
|
* Context: Any context. Takes and releases the xa_lock while
|
||||||
* disabling softirqs. May sleep if the @gfp flags permit.
|
* disabling softirqs. May sleep if the @gfp flags permit.
|
||||||
* Return: 0 if the store succeeded. -EEXIST if another entry was present.
|
* Return: 0 if the store succeeded. -EBUSY if another entry was present.
|
||||||
* -ENOMEM if memory could not be allocated.
|
* -ENOMEM if memory could not be allocated.
|
||||||
*/
|
*/
|
||||||
static inline int xa_insert_bh(struct xarray *xa, unsigned long index,
|
static inline int xa_insert_bh(struct xarray *xa, unsigned long index,
|
||||||
@ -722,7 +722,7 @@ static inline int xa_insert_bh(struct xarray *xa, unsigned long index,
|
|||||||
*
|
*
|
||||||
* Context: Process context. Takes and releases the xa_lock while
|
* Context: Process context. Takes and releases the xa_lock while
|
||||||
* disabling interrupts. May sleep if the @gfp flags permit.
|
* disabling interrupts. May sleep if the @gfp flags permit.
|
||||||
* Return: 0 if the store succeeded. -EEXIST if another entry was present.
|
* Return: 0 if the store succeeded. -EBUSY if another entry was present.
|
||||||
* -ENOMEM if memory could not be allocated.
|
* -ENOMEM if memory could not be allocated.
|
||||||
*/
|
*/
|
||||||
static inline int xa_insert_irq(struct xarray *xa, unsigned long index,
|
static inline int xa_insert_irq(struct xarray *xa, unsigned long index,
|
||||||
|
@ -346,7 +346,7 @@ static noinline void check_cmpxchg(struct xarray *xa)
|
|||||||
|
|
||||||
XA_BUG_ON(xa, !xa_empty(xa));
|
XA_BUG_ON(xa, !xa_empty(xa));
|
||||||
XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_KERNEL) != NULL);
|
XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_KERNEL) != NULL);
|
||||||
XA_BUG_ON(xa, xa_insert(xa, 12345678, xa, GFP_KERNEL) != -EEXIST);
|
XA_BUG_ON(xa, xa_insert(xa, 12345678, xa, GFP_KERNEL) != -EBUSY);
|
||||||
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, SIX, FIVE, GFP_KERNEL) != LOTS);
|
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, SIX, FIVE, GFP_KERNEL) != LOTS);
|
||||||
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, LOTS, FIVE, GFP_KERNEL) != LOTS);
|
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, LOTS, FIVE, GFP_KERNEL) != LOTS);
|
||||||
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, FIVE, LOTS, GFP_KERNEL) != FIVE);
|
XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, FIVE, LOTS, GFP_KERNEL) != FIVE);
|
||||||
@ -388,7 +388,7 @@ static noinline void check_reserve(struct xarray *xa)
|
|||||||
/* But xa_insert does not */
|
/* But xa_insert does not */
|
||||||
xa_reserve(xa, 12345678, GFP_KERNEL);
|
xa_reserve(xa, 12345678, GFP_KERNEL);
|
||||||
XA_BUG_ON(xa, xa_insert(xa, 12345678, xa_mk_value(12345678), 0) !=
|
XA_BUG_ON(xa, xa_insert(xa, 12345678, xa_mk_value(12345678), 0) !=
|
||||||
-EEXIST);
|
-EBUSY);
|
||||||
XA_BUG_ON(xa, xa_empty(xa));
|
XA_BUG_ON(xa, xa_empty(xa));
|
||||||
XA_BUG_ON(xa, xa_erase(xa, 12345678) != NULL);
|
XA_BUG_ON(xa, xa_erase(xa, 12345678) != NULL);
|
||||||
XA_BUG_ON(xa, !xa_empty(xa));
|
XA_BUG_ON(xa, !xa_empty(xa));
|
||||||
|
@ -1451,7 +1451,7 @@ EXPORT_SYMBOL(__xa_cmpxchg);
|
|||||||
*
|
*
|
||||||
* Context: Any context. Expects xa_lock to be held on entry. May
|
* Context: Any context. Expects xa_lock to be held on entry. May
|
||||||
* release and reacquire xa_lock if @gfp flags permit.
|
* release and reacquire xa_lock if @gfp flags permit.
|
||||||
* Return: 0 if the store succeeded. -EEXIST if another entry was present.
|
* Return: 0 if the store succeeded. -EBUSY if another entry was present.
|
||||||
* -ENOMEM if memory could not be allocated.
|
* -ENOMEM if memory could not be allocated.
|
||||||
*/
|
*/
|
||||||
int __xa_insert(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
|
int __xa_insert(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
|
||||||
@ -1471,7 +1471,7 @@ int __xa_insert(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
|
|||||||
if (xa_track_free(xa))
|
if (xa_track_free(xa))
|
||||||
xas_clear_mark(&xas, XA_FREE_MARK);
|
xas_clear_mark(&xas, XA_FREE_MARK);
|
||||||
} else {
|
} else {
|
||||||
xas_set_err(&xas, -EEXIST);
|
xas_set_err(&xas, -EBUSY);
|
||||||
}
|
}
|
||||||
} while (__xas_nomem(&xas, gfp));
|
} while (__xas_nomem(&xas, gfp));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user