Skip to content

Commit 7d09d6b

Browse files
chuckleveramschuma-ntap
authored andcommitted
nfs/blocklayout: SCSI layout trace points for reservation key reg/unreg
An administrator cannot take action on these messages, but the reported errors might be helpful for troubleshooting. Transition them to trace points so these events appear in the trace log and can be easily lined up with other traced NFS client operations. Examples: append_writer-6147 [000] 80.247393: bl_pr_key_reg: dev=8,0 (sda) key=0x6675bfcf59112e98 append_writer-6147 [000] 80.247842: bl_pr_key_unreg: dev=8,0 (sda) key=0x6675bfcf59112e98 umount.nfs4-6172 [002] 84.950409: bl_pr_key_unreg_err: dev=8,0 (sda) key=0x6675bfcf59112e98 status=RESERVATION_CONFLICT Reviewed-by: Benjamin Coddington <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Chuck Lever <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent 450b4b3 commit 7d09d6b

File tree

3 files changed

+110
-11
lines changed

3 files changed

+110
-11
lines changed

fs/nfs/blocklayout/dev.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,24 @@
1010
#include <linux/pr.h>
1111

1212
#include "blocklayout.h"
13+
#include "../nfs4trace.h"
1314

1415
#define NFSDBG_FACILITY NFSDBG_PNFS_LD
1516

1617
static void bl_unregister_scsi(struct pnfs_block_dev *dev)
1718
{
1819
struct block_device *bdev = file_bdev(dev->bdev_file);
1920
const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
21+
int status;
2022

2123
if (!test_and_clear_bit(PNFS_BDEV_REGISTERED, &dev->flags))
2224
return;
2325

24-
if (ops->pr_register(bdev, dev->pr_key, 0, false))
25-
pr_err("failed to unregister PR key.\n");
26+
status = ops->pr_register(bdev, dev->pr_key, 0, false);
27+
if (status)
28+
trace_bl_pr_key_unreg_err(bdev, dev->pr_key, status);
29+
else
30+
trace_bl_pr_key_unreg(bdev, dev->pr_key);
2631
}
2732

2833
static bool bl_register_scsi(struct pnfs_block_dev *dev)
@@ -36,10 +41,10 @@ static bool bl_register_scsi(struct pnfs_block_dev *dev)
3641

3742
status = ops->pr_register(bdev, 0, dev->pr_key, true);
3843
if (status) {
39-
pr_err("pNFS: failed to register key for block device %s.",
40-
bdev->bd_disk->disk_name);
44+
trace_bl_pr_key_reg_err(bdev, dev->pr_key, status);
4145
return false;
4246
}
47+
trace_bl_pr_key_reg(bdev, dev->pr_key);
4348
return true;
4449
}
4550

@@ -382,8 +387,9 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
382387
struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask)
383388
{
384389
struct pnfs_block_volume *v = &volumes[idx];
385-
struct file *bdev_file;
390+
struct block_device *bdev;
386391
const struct pr_ops *ops;
392+
struct file *bdev_file;
387393
int error;
388394

389395
if (!bl_validate_designator(v))
@@ -404,21 +410,19 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
404410
return PTR_ERR(bdev_file);
405411
}
406412
d->bdev_file = bdev_file;
413+
bdev = file_bdev(bdev_file);
407414

408-
d->len = bdev_nr_bytes(file_bdev(d->bdev_file));
415+
d->len = bdev_nr_bytes(bdev);
409416
d->map = bl_map_simple;
410417
d->pr_key = v->scsi.pr_key;
411418

412419
if (d->len == 0)
413420
return -ENODEV;
414421

415-
pr_info("pNFS: using block device %s (reservation key 0x%llx)\n",
416-
file_bdev(d->bdev_file)->bd_disk->disk_name, d->pr_key);
417-
418-
ops = file_bdev(d->bdev_file)->bd_disk->fops->pr_ops;
422+
ops = bdev->bd_disk->fops->pr_ops;
419423
if (!ops) {
420424
pr_err("pNFS: block device %s does not support reservations.",
421-
file_bdev(d->bdev_file)->bd_disk->disk_name);
425+
bdev->bd_disk->disk_name);
422426
error = -EINVAL;
423427
goto out_blkdev_put;
424428
}

fs/nfs/nfs4trace.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
/*
33
* Copyright (c) 2013 Trond Myklebust <[email protected]>
44
*/
5+
#include <uapi/linux/pr.h>
6+
#include <linux/blkdev.h>
57
#include <linux/nfs_fs.h>
68
#include "nfs4_fs.h"
79
#include "internal.h"
@@ -29,5 +31,10 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_read_error);
2931
EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_write_error);
3032
EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_commit_error);
3133

34+
EXPORT_TRACEPOINT_SYMBOL_GPL(bl_pr_key_reg);
35+
EXPORT_TRACEPOINT_SYMBOL_GPL(bl_pr_key_reg_err);
36+
EXPORT_TRACEPOINT_SYMBOL_GPL(bl_pr_key_unreg);
37+
EXPORT_TRACEPOINT_SYMBOL_GPL(bl_pr_key_unreg_err);
38+
3239
EXPORT_TRACEPOINT_SYMBOL_GPL(fl_getdevinfo);
3340
#endif

fs/nfs/nfs4trace.h

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2153,6 +2153,94 @@ TRACE_EVENT(ff_layout_commit_error,
21532153
)
21542154
);
21552155

2156+
DECLARE_EVENT_CLASS(pnfs_bl_pr_key_class,
2157+
TP_PROTO(
2158+
const struct block_device *bdev,
2159+
u64 key
2160+
),
2161+
TP_ARGS(bdev, key),
2162+
TP_STRUCT__entry(
2163+
__field(u64, key)
2164+
__field(dev_t, dev)
2165+
__string(device, bdev->bd_disk->disk_name)
2166+
),
2167+
TP_fast_assign(
2168+
__entry->key = key;
2169+
__entry->dev = bdev->bd_dev;
2170+
__assign_str(device);
2171+
),
2172+
TP_printk("dev=%d,%d (%s) key=0x%016llx",
2173+
MAJOR(__entry->dev), MINOR(__entry->dev),
2174+
__get_str(device), __entry->key
2175+
)
2176+
);
2177+
2178+
#define DEFINE_NFS4_BLOCK_PRKEY_EVENT(name) \
2179+
DEFINE_EVENT(pnfs_bl_pr_key_class, name, \
2180+
TP_PROTO( \
2181+
const struct block_device *bdev, \
2182+
u64 key \
2183+
), \
2184+
TP_ARGS(bdev, key))
2185+
DEFINE_NFS4_BLOCK_PRKEY_EVENT(bl_pr_key_reg);
2186+
DEFINE_NFS4_BLOCK_PRKEY_EVENT(bl_pr_key_unreg);
2187+
2188+
/*
2189+
* From uapi/linux/pr.h
2190+
*/
2191+
TRACE_DEFINE_ENUM(PR_STS_SUCCESS);
2192+
TRACE_DEFINE_ENUM(PR_STS_IOERR);
2193+
TRACE_DEFINE_ENUM(PR_STS_RESERVATION_CONFLICT);
2194+
TRACE_DEFINE_ENUM(PR_STS_RETRY_PATH_FAILURE);
2195+
TRACE_DEFINE_ENUM(PR_STS_PATH_FAST_FAILED);
2196+
TRACE_DEFINE_ENUM(PR_STS_PATH_FAILED);
2197+
2198+
#define show_pr_status(x) \
2199+
__print_symbolic(x, \
2200+
{ PR_STS_SUCCESS, "SUCCESS" }, \
2201+
{ PR_STS_IOERR, "IOERR" }, \
2202+
{ PR_STS_RESERVATION_CONFLICT, "RESERVATION_CONFLICT" }, \
2203+
{ PR_STS_RETRY_PATH_FAILURE, "RETRY_PATH_FAILURE" }, \
2204+
{ PR_STS_PATH_FAST_FAILED, "PATH_FAST_FAILED" }, \
2205+
{ PR_STS_PATH_FAILED, "PATH_FAILED" })
2206+
2207+
DECLARE_EVENT_CLASS(pnfs_bl_pr_key_err_class,
2208+
TP_PROTO(
2209+
const struct block_device *bdev,
2210+
u64 key,
2211+
int status
2212+
),
2213+
TP_ARGS(bdev, key, status),
2214+
TP_STRUCT__entry(
2215+
__field(u64, key)
2216+
__field(dev_t, dev)
2217+
__field(unsigned long, status)
2218+
__string(device, bdev->bd_disk->disk_name)
2219+
),
2220+
TP_fast_assign(
2221+
__entry->key = key;
2222+
__entry->dev = bdev->bd_dev;
2223+
__entry->status = status;
2224+
__assign_str(device);
2225+
),
2226+
TP_printk("dev=%d,%d (%s) key=0x%016llx status=%s",
2227+
MAJOR(__entry->dev), MINOR(__entry->dev),
2228+
__get_str(device), __entry->key,
2229+
show_pr_status(__entry->status)
2230+
)
2231+
);
2232+
2233+
#define DEFINE_NFS4_BLOCK_PRKEY_ERR_EVENT(name) \
2234+
DEFINE_EVENT(pnfs_bl_pr_key_err_class, name, \
2235+
TP_PROTO( \
2236+
const struct block_device *bdev, \
2237+
u64 key, \
2238+
int status \
2239+
), \
2240+
TP_ARGS(bdev, key, status))
2241+
DEFINE_NFS4_BLOCK_PRKEY_ERR_EVENT(bl_pr_key_reg_err);
2242+
DEFINE_NFS4_BLOCK_PRKEY_ERR_EVENT(bl_pr_key_unreg_err);
2243+
21562244
#ifdef CONFIG_NFS_V4_2
21572245
TRACE_DEFINE_ENUM(NFS4_CONTENT_DATA);
21582246
TRACE_DEFINE_ENUM(NFS4_CONTENT_HOLE);

0 commit comments

Comments
 (0)